| Server IP : 202.61.199.114 / Your IP : 216.73.217.139 Web Server : nginx/1.22.1 System : Linux de.arni-solutions.de 6.1.0-49-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.174-1 (2026-05-26) x86_64 User : web20 ( 1018) PHP Version : 8.4.23 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/clients/client2/web32/web/tools/ |
Upload File : |
# Wayback Blog Importer
Standalone-Migrations-Script. Crawlt den Wayback-Snapshot von **taschenmuschi-kaufen.de/blog/** und legt die Artikel in der frischen WP-Installation neu an.
Kein Plugin, kein Cronjob — **einmalige Migration**.
## Voraussetzungen
- PHP ≥ 7.4 mit Extensions: `dom`, `libxml`, `curl`, `gd`, `mbstring`
- Lokaler PHP-Dev-Server läuft (oder echte WP-Installation)
- Internet-Zugang zu `web.archive.org`
- WordPress muss installiert sein (`wp-load.php` existiert)
- Schreibrechte für `wp-content/uploads/`
- Schreibrechte für `tools/cache/` und `tools/import-logs/`
## Was passiert beim Lauf
1. Permalink-Struktur wird auf `/%year%/%monthnum%/%postname%/` gesetzt (geflusht).
2. Sicherheits-Check (Browser: Login + `manage_options`).
3. Wayback-Index wird gecrawlt — bis zu 10 Pagination-Seiten (`/blog/page/N/`).
4. Pro Artikel:
- HTML aus dem Wayback laden (mit Cache, Retry & Backoff).
- Titel aus `<meta property="og:title">` oder `<h1>`.
- Datum aus `<meta property="article:published_time">`, sonst aus `<span class="blog-meta">`, sonst aus der URL.
- Content aus `<div class="content no-margin">` extrahieren.
- Theme-Reste (`offer-row`, Scripts, Inline-Styles, Tracking) entfernen.
- Wayback-Wrapper aus allen Bild-/Link-URLs entkapseln.
- Inline-Bilder lokal in die Mediathek importieren, URLs im Content ersetzen.
- Featured Image: `og:image` → erstes Inline-Bild → GD-Fallback-Bild (Bordeaux-Verlauf, Titel mittig).
- Post in `category: Magazin` anlegen mit Original-Datum + Original-Slug.
- Duplikate via `_wayback_source_url` Meta erkannt → übersprungen (oder mit `--force` überschrieben).
5. Stats + Log.
## CLI
```bash
# Trockenlauf (nichts in der DB ändern, Bilder werden auch nicht geladen)
php tools/import-wayback-blog.php --dry-run
# Nur die ersten 5 Artikel importieren — gut für ersten Smoke-Test
php tools/import-wayback-blog.php --limit=5
# Vollimport, bestehende Beiträge überschreiben
php tools/import-wayback-blog.php --force
# Voller Lauf
php tools/import-wayback-blog.php
```
## Browser
```
https://<site>/tools/import-wayback-blog.php
```
Erfordert eingeloggter Admin. Erst nach `?run=1` wird tatsächlich importiert:
```
https://<site>/tools/import-wayback-blog.php?run=1
https://<site>/tools/import-wayback-blog.php?run=1&limit=5
https://<site>/tools/import-wayback-blog.php?run=1&dry_run=1
https://<site>/tools/import-wayback-blog.php?run=1&force=1
```
## Output
```
[2026-05-22 14:31:09] INFO Start {"limit":5,"dry_run":false,"force":false}
[2026-05-22 14:31:09] INFO Permalink-Struktur ist bereits korrekt
[2026-05-22 14:31:09] INFO Index-Seite 1 laden {"url":"…"}
[2026-05-22 14:31:11] INFO Index-Crawl abgeschlossen {"gesamt":42}
[2026-05-22 14:31:11] INFO Limit aktiv {"urls":5}
[2026-05-22 14:31:11] INFO >>> [1/5] https://web.archive.org/web/…
[2026-05-22 14:31:13] INFO imported {"url":"…","post_id":201,"slug":"japanisches-sexspielzeug-alles-ueber-onaholes"}
…
[2026-05-22 14:31:42] INFO Fertig in 32.4s {"imported":5,"updated":0,"skipped":0,"errors":0,"images":17}
```
Persistente Logs unter [tools/import-logs/import.log](tools/import-logs/import.log).
Roh-HTML-Cache unter [tools/cache/](tools/cache/) — kann manuell gelöscht werden, um einen Re-Fetch zu erzwingen.
## Datenbank-Hinweise
- Beiträge werden als `post_type=post`, `post_status=publish` angelegt.
- Datum-Felder: `post_date_gmt` aus dem `article:published_time` der Quelle; `post_date` wird via `get_date_from_gmt()` auf die WP-Timezone gemappt.
- Slug: aus dem letzten URL-Segment des Originals (`/2023/03/<slug>/`) — bleibt 1:1 erhalten.
- Kategorie: `Magazin` (wird angelegt, falls nicht vorhanden).
- Bilder werden mit `media_handle_sideload` in die Mediathek geschoben.
Dedup über Post-Meta `_wayback_source_hash` (md5 der Quell-URL).
- Post-Meta:
- `_wayback_source_url` — Original-URL (Wayback)
- `_wayback_imported_at` — Zeitstempel des Imports
- `_wayback_import_hash` — Hash über Titel + Content
## Idempotenz
Re-Runs überspringen bereits importierte Beiträge anhand `_wayback_source_url`.
Mit `--force` werden sie **aktualisiert** (nicht dupliziert).
## Permalink-Hinweis
Das Script setzt die WP-Permalink-Struktur automatisch auf:
```
/%year%/%monthnum%/%postname%/
```
So funktionieren die `/2023/03/slug/`-URLs ohne weiteren Eingriff.
## Fehlerquellen & Troubleshooting
- **Wayback-Snapshot nicht vorhanden:** Wayback redirected dann auf einen anderen Zeitstempel. `wp_remote_get` folgt Redirects (`redirection => 8`).
- **GD nicht aktiv:** Fallback-Image-Erzeugung schlägt fehl — Beiträge ohne `og:image` bekommen kein Featured Image. Andere Beiträge sind nicht betroffen.
- **Hängender Lauf:** Per-Request-Timeout ist 25 s, globales `set_time_limit(1800)`. Wenn der Lauf wirklich hängt: `Ctrl-C`, dann mit `--limit` schrittweise importieren.
- **Bilder kommen nicht:** Wayback liefert `404` bei nicht-archivierten Assets. Das Script versucht zuerst die Wayback-`im_`-Variante, dann das Original — beide schlagen evtl. fehl. Der Beitrag wird trotzdem importiert.
- **Datum-Parsing schief:** Im Log unter „Parse fehlgeschlagen" / „Kein Content" sichtbar. Wahrscheinliche Ursache: die spezifische Wayback-Capture liefert die `.content.no-margin`-Klasse nicht. Den Single-Selector im Script anpassen.
## Aufräumen nach dem Lauf
```bash
# Optional: Roh-HTML-Cache löschen (Wayback-Anfragen sparen)
rm -rf tools/cache/*
# Optional: das gesamte Tool-Verzeichnis entfernen, wenn fertig
rm -rf tools/
```
Der Import ist ein One-Shot — das Skript darf nach erfolgreicher Migration aus dem Repo entfernt werden.