Ausgangslage
- Domain wurde korrekt ersetzt
homeundsiteurlwaren richtig gesetzt- Obwohl wp search-replace die alte Domain erfolgreich in der Datenbank ersetzt hat, waren im Frontend weiterhin die Bilder über die frühere Domain verlinkt.
Die betroffenen Bilder stammten aus dem Plugin:
Responsive Photo Gallery Pro
Shortcode:
[RPG id=1224]
Analyse
Die Galerie speichert ihre Bilddaten im Postmeta-Feld:
meta_key: rpgp_all_photos_details
Der Inhalt dieses Feldes ist:
- Base64-kodiert
- darin ein serialisiertes PHP-Array
- darin absolute Bild-URLs
Beispiel (gekürzt):
YToyOntpOjA7YToyOntzOjE0OiJycGdwX2ltYWdlX3VybCI7czo2MToiaHR0cHM6Ly9jYW1pbm8u...
Dadurch ergeben sich folgende Probleme:
- Die Domain ist nicht als Klartext in der DB sichtbar
- SQL-REPLACE oder normales
wp search-replacegreifen nicht zuverlässig - Manuelles Ersetzen kann Serialisierungsfehler verursachen
Warum normales REPLACE hier nicht angebracht ist
Serialisierte PHP-Daten enthalten Längenangaben:
s:61:"https://domain.ulrich.digital/...";
Wird der String kürzer oder länger ersetzt, stimmen die Längen nicht mehr →
die Datenstruktur wird allenfalls beschädigt.
In diesem Fall kam zusätzlich Base64-Kodierung hinzu.
Lösung: Programmgesteuerte Korrektur via WP-CLI
Die Daten wurden kontrolliert korrigiert:
- Alle
rpgp_all_photos_detailsEinträge ausgelesen - Base64 dekodiert
- PHP-Array unserialisiert
- Alte Domain ersetzt
- Array neu serialisiert
- Base64 kodiert
- Per
update_post_meta()gespeichert
Ausgeführt via:
wp eval 'global $wpdb;
$from="https://domain.ulrich.digital";
$to="https://domain.ch";
$key="rpgp_all_photos_details";
$metas=$wpdb->get_results($wpdb->prepare(
"SELECT post_id, meta_value FROM {$wpdb->postmeta} WHERE meta_key=%s",$key
));
$total=0;
$updated=0;
foreach($metas as $row){
$total++;
$post_id=(int)$row->post_id;
$raw=$row->meta_value;
$decoded=base64_decode($raw,true);
if($decoded===false) continue;
$data=@unserialize($decoded);
if($data===false && $decoded!=="b:0;") continue;
$changed=false;
$it=function(&$x) use (&$it,$from,$to,&$changed){
if(is_array($x)){
foreach($x as &$v){ $it($v);}
return;
}
if(is_string($x) && strpos($x,$from)!==false){
$x=str_replace($from,$to,$x);
$changed=true;
}
};
$it($data);
if($changed){
$new=base64_encode(serialize($data));
update_post_meta($post_id,$key,$new);
$updated++;
}
}
echo "Checked: $total\nUpdated: $updated\n";'
Liefert das Ergebnis:
Checked: 20
Updated: 19
Fazit
Bei Plugins, die:
- serialisierte Daten speichern
- oder zusätzlich Base64 verwenden
ist ein klassisches SQL-Replace ungeeignet.
Empfohlene Vorgehensweise:
- WP-CLI
search-replacebei normaler Serialisierung - oder programmgesteuerte Korrektur via
wp eval - niemals direkt per phpMyAdmin REPLACE in serialisierten Feldern
Empfehlung für Domainwechsel
Vor Domain-Migration:
- allenfalls prüfen, welche Plugins eigene Datenstrukturen speichern
- Testlauf mit
wp db searchdurchführen - serialisierte Daten über WordPress-API ändern