Alle Blogs Updaten bei WordPress MU + Domain Mapping

Nach einem WordPress Update muss man ab und an alle Blogs einer Multisite-Installation updaten. An sich kein Problem – wenn man nicht gerade ein SSL-verschlüsseltes Backend hat und zugleich Domain Mapping verwendet. Denn dann versucht das Updater-Script die URL https://meinblog.blognetzwerk.de/ aufzurufen, obwohl das SSL-Zertifikat für https://meinblog.de/ gilt. Der Update-Vorgang schlägt dann fehl. Abgesehen davon wird der Vorgang bei einer größeren Anzahl Blogs sehr, sehr mühselig, weil ein Fehler das ganze abbrechen lässt.

Die Lösung ist ganz einfach: ein kleines Helper-Script. Es ist sicher nicht optimal, da es nicht die WordPress-Umgebung nutzt und man die MySQL-Zugangsdaten selbst eingeben muss, aber es funktioniert recht gut, nimmt einem viel Arbeit ab – und wenn wer mag, kann es wer ja auch gerne verbessern, ich update das Script hier gerne. Hier ist es:

<?php
define('DB_NAME', 'datenbankname');

/** Ersetze username_here mit deinem MySQL-Datenbank-Benutzernamen */
define('DB_USER', 'datenbankuser');

/** Ersetze password_here mit deinem MySQL-Passwort */
define('DB_PASSWORD', 'datenbankpasswort');

/** Ersetze localhost mit der MySQL-Serveradresse */
define('DB_HOST', 'datenbankhost');

mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
mysql_select_db(DB_NAME);

$blog_list = mysql_query("SELECT blog_id, domain, path FROM prefix_blogs WHERE archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0'");
$mapping_list = mysql_query("SELECT blog_id, domain FROM prefix_domain_mapping WHERE active = 1 ORDER BY id DESC");

$urls = Array();

while ($line = mysql_fetch_array($mapping_list)) {
$urls[$line['blog_id']] = $line['domain'];
}

while ($line = mysql_fetch_array($blog_list)) {
if (!isset($urls[$line['blog_id']]))
$urls[$line['blog_id']] = $line['domain'];
}

foreach($urls as $blog_url) {
echo('Updating ' . $blog_url . ' ... ');
$result = file_get_contents('https://' . $blog_url . '/wp-admin/upgrade.php?step=1');
if(strpos($result, 'Aktualisierung erfolgreich'))
echo("done.\n");
else if(strpos($result, 'Keine Aktualisierung notwendig'))
echo("not necessary.\n");
else {
echo("unknown result.\n");
echo($result);
}
}

?>

Die ersten Zeilen sind 1:1 aus der wp-config.php kopiert, der Rest ist glaube ich recht selbsterklärend (das prefix bei den Tabellen muss man ggf. noch anpassen). Das Script ruft man am besten über die Konsole auf – in meinem Fall mit

sudo -u wordpress php update-blogs.php

Damit arbeite ich als der Nutzer wordpress und habe den entscheidenden Vorteil, dass das Script nicht irgendwann einfach abbrechen kann und mir die Statusmeldungen zwischendurch auf die Konsole ausgibt.

Vielleicht kann ja irgendwer den Codeschnipsel brauchen. Viel Spaß damit!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.