Initial commit: WordPress News Import System
This commit is contained in:
commit
5f923d8ece
8 changed files with 948 additions and 0 deletions
281
README.md
Normal file
281
README.md
Normal file
|
|
@ -0,0 +1,281 @@
|
|||
# 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="<p>HTML-Inhalt</p>",
|
||||
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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue