# WordPress News Import Automatisierter Workflow zum Erstellen von WordPress-Beiträgen aus Markdown-Dateien über die WordPress REST-API. ## Features - ✅ **Duplikatsprüfung**: Verhindert das doppelte Erstellen von Beiträgen und Medien - ✅ **Markdown zu HTML**: Automatische Konvertierung von Markdown-Inhalten - ✅ **Medien-Upload**: Hochladen von Beitragsbildern mit Duplikatsprüfung - ✅ **Kategorien & Tags**: Automatische Erstellung fehlender Kategorien und Tags - ✅ **Flexible Quellen**: Unterstützt Markdown-URLs und lokale Dateien - ✅ **YAML-Konfiguration**: Einfache Verwaltung mehrerer Beiträge ## Voraussetzungen - Python 3.7 oder höher - WordPress-Installation mit aktivierter REST-API - WordPress Anwendungspasswort (Application Password) ## Installation 1. **Repository klonen oder herunterladen** 2. **Python-Abhängigkeiten installieren** ```bash pip install -r requirements.txt ``` 3. **Umgebungsvariablen konfigurieren** Kopieren Sie `.env.example` zu `.env` und tragen Sie Ihre Credentials ein: ```bash cp .env.example .env ``` Bearbeiten Sie `.env`: ```env WORDPRESS_URL=https://news.rpi-virtuell.de WORDPRESS_USERNAME=ihr_benutzername WORDPRESS_APP_PASSWORD=UIVI 4Tdy oojL 9iZG g3X2 iAn5 ``` ## WordPress Anwendungspasswort erstellen 1. Melden Sie sich in WordPress an 2. Gehen Sie zu **Benutzer → Profil** 3. Scrollen Sie zu **Anwendungspasswörter** 4. Geben Sie einen Namen ein (z.B. "News Import") 5. Klicken Sie auf **Neues Anwendungspasswort hinzufügen** 6. Kopieren Sie das generierte Passwort in Ihre `.env`-Datei ## Verwendung ### 1. YAML-Konfiguration erstellen Erstellen Sie eine `posts.yaml`-Datei mit Ihren Beiträgen: ```yaml posts: - title: "Mein erster Beitrag" markdown_url: "https://raw.githubusercontent.com/user/repo/main/post.md" status: "draft" # draft, publish, pending, private categories: - "News" - "Tutorials" tags: - "WordPress" - "API" featured_image: "images/header.jpg" excerpt: "Eine kurze Zusammenfassung" - title: "Lokaler Beitrag" markdown_file: "content/local-post.md" status: "publish" categories: - "Updates" settings: default_status: "draft" skip_duplicates: true skip_duplicate_media: true ``` ### 2. Workflow ausführen ```bash python workflow.py posts.yaml ``` Oder ohne Angabe der Datei (verwendet `posts.yaml` als Standard): ```bash python workflow.py ``` ## Struktur ``` newsimport/ ├── .env # Credentials (nicht in Git!) ├── .env.example # Beispiel-Konfiguration ├── .gitignore # Git-Ignorier-Liste ├── requirements.txt # Python-Abhängigkeiten ├── wordpress_api.py # WordPress REST-API Client ├── workflow.py # Haupt-Workflow Script ├── posts.yaml # Beitrags-Konfiguration ├── README.md # Diese Datei ├── content/ # Lokale Markdown-Dateien (optional) │ └── *.md └── images/ # Lokale Bilder (optional) └── *.jpg/png ``` ## API-Funktionen ### WordPress API Client (`wordpress_api.py`) ```python from wordpress_api import WordPressAPI # API initialisieren wp = WordPressAPI(url, username, app_password) # Beitrag erstellen (mit Duplikatsprüfung) post_id = wp.create_post( title="Titel", content="
HTML-Inhalt
", status="publish", check_duplicate=True ) # Medien hochladen (mit Duplikatsprüfung) media_id = wp.upload_media( file_path="bild.jpg", title="Bild-Titel", alt_text="Alt-Text", check_duplicate=True ) # Kategorie holen oder erstellen cat_id = wp.get_or_create_category("News") # Tag holen oder erstellen tag_id = wp.get_or_create_tag("WordPress") # Auf Duplikate prüfen existing_post_id = wp.check_post_exists("Titel") existing_media_id = wp.check_media_exists("bild.jpg") ``` ## YAML-Konfiguration ### Beitrags-Felder - `title` (erforderlich): Titel des Beitrags - `markdown_url`: URL zur Markdown-Datei - `markdown_file`: Pfad zu lokaler Markdown-Datei - `content`: Direkter Markdown-Inhalt - `status`: `draft`, `publish`, `pending`, `private` - `categories`: Liste von Kategorie-Namen - `tags`: Liste von Tag-Namen - `featured_image`: Pfad oder URL zum Beitragsbild - `excerpt`: Kurze Zusammenfassung - `author`: Autor-Username ### Globale Einstellungen ```yaml settings: default_status: "draft" # Standard-Status für Beiträge default_author: "admin" # Standard-Autor skip_duplicates: true # Bestehende Beiträge überspringen skip_duplicate_media: true # Bestehende Medien überspringen markdown_extensions: # Markdown-Erweiterungen - tables - fenced_code - footnotes ``` ## Duplikatsprüfung ### Beiträge Das System prüft vor dem Erstellen, ob ein Beitrag mit dem gleichen Titel bereits existiert. Falls ja, wird die bestehende Post-ID zurückgegeben und kein neuer Beitrag erstellt. ### Medien Vor dem Upload wird geprüft, ob eine Datei mit dem gleichen Namen bereits existiert. Falls ja, wird die bestehende Media-ID verwendet. ## Beispiele ### Beispiel 1: Einfacher Beitrag von URL ```yaml posts: - title: "News Update" markdown_url: "https://example.com/news.md" status: "publish" ``` ### Beispiel 2: Beitrag mit Kategorien, Tags und Bild ```yaml posts: - title: "Tutorial: WordPress REST-API" markdown_url: "https://example.com/tutorial.md" status: "draft" categories: - "Tutorials" - "WordPress" tags: - "REST-API" - "Entwicklung" - "PHP" featured_image: "https://example.com/images/header.jpg" excerpt: "Lernen Sie die WordPress REST-API kennen" ``` ### Beispiel 3: Lokale Dateien ```yaml posts: - title: "Lokaler Inhalt" markdown_file: "content/article.md" status: "publish" featured_image: "images/local-image.jpg" ``` ## Fehlerbehebung ### Authentifizierungsfehler **Problem**: `401 Unauthorized` **Lösung**: - Überprüfen Sie Username und Anwendungspasswort in `.env` - Stellen Sie sicher, dass das Anwendungspasswort korrekt ist (keine zusätzlichen Leerzeichen) - Verifizieren Sie, dass die WordPress REST-API aktiviert ist ### Keine Verbindung zu WordPress **Problem**: `Connection refused` oder Timeout **Lösung**: - Überprüfen Sie die `WORDPRESS_URL` in `.env` - Stellen Sie sicher, dass WordPress erreichbar ist - Prüfen Sie Firewall-Einstellungen ### Markdown wird nicht konvertiert **Problem**: Markdown-Syntax erscheint im Beitrag **Lösung**: - Überprüfen Sie, ob `markdown` installiert ist: `pip install markdown` - Prüfen Sie die Markdown-Syntax in der Quelldatei ### Import-Fehler bei Modulen **Problem**: `ModuleNotFoundError: No module named 'requests'` **Lösung**: ```bash pip install -r requirements.txt ``` ## Sicherheit ⚠️ **Wichtig**: - Committen Sie **niemals** die `.env`-Datei mit echten Credentials in Git! - Die `.gitignore` ist bereits so konfiguriert, dass `.env` ignoriert wird - Verwenden Sie `.env.example` als Vorlage für andere Nutzer ## Lizenz Dieses Projekt steht unter der MIT-Lizenz. ## Support Bei Problemen oder Fragen erstellen Sie bitte ein Issue im Repository. --- **Hinweis**: Dieses Tool wurde für `https://news.rpi-virtuell.de` entwickelt, funktioniert aber mit jeder WordPress-Installation, die die REST-API unterstützt.