Einzelne WordPress Artikel Meta-Einstellungen datenbankweit vornehmen

Bei einer neulichen WordPress Theme-Installation bin ich auf ein Problem gestoßen, dessen Lösung viel Zeit in Anspruch hätte nehmen können.

Konkret ging es hier um ein Theme, welches für Blog-Artikel verschiedene Sidebar-Konfigurationen (links, rechts, keine) anbietet. Eine Standard-Konfiguration gibt es nicht, weswegen bei jedem Blog-Artikel die entsprechende Sidebar-Konfiguration ausgewählt werden muss, da ansonsten das Design leidet. Ich hätte also die folgenden Schritte für jeden Blog-Artikel vornehmen müssen:

  1. Beitrag editieren
  2. Sidebar-Konfiguration auswählen
  3. Beitrag speichern

Bei knapp 600 Artikeln hätte das sehr viel Zeit in Anspruch genommen, weswegen ich mich um eine Automatisierung bemüht habe.

Nach einiger Recherche in der MySQL-Datenbank ist mir aufgefallen, dass für jeden entsprechend angepassten Blog-Artikel ein Eintrag in der Tabelle wp_postmeta angelegt wird:

...
bluth_post_layout
single
post_id meta_key meta_value

Das bedeutet im Umkehrschluss allerdings auch, dass nicht nachträglich editierte Blog-Artikel nicht über diese Einstellung verfügen und somit das Design inkorrekt ist.

Man müsste also in dieser Tabelle entsprechende Einträge für alle erstellten Blog-Artikel einfügen. Die IDs aller gültigen Blog-Artikel (veröffentlicht oder noch nicht veröffentlicht) lassen sich über die Tabelle wp_posts herausfinden:

SELECT DISTINCT `post_parent`
FROM `wp_posts`
WHERE `post_type` = 'revision'
ORDER BY `post_parent` DESC;

Möchte man nun für alle Blog-Artikel die entsprechende Meta-Einstellung auslesen, kann man das mit der folgenden verschachtelten Abfrage erreichen:

SELECT  `post_id`, `meta_key`, `meta_value`
FROM `wp_postmeta`
WHERE post_id IN (SELECT DISTINCT `post_parent`
FROM `wp_posts`
WHERE `post_type` = 'revision'
ORDER BY `post_parent` DESC) AND `meta_key` = 'bluth_post_layout'
ORDER BY `wp_postmeta`.`post_id` DESC;

In meinem Fall wurde nur ein Eintrag ausgegeben – wie bereits erwähnt habe ich nur einen Blog-Artikel manuell angepasst.

Möchte man nun für alle Blog-Artikel die Einstellung vornehmen, hilft der folgende SQL-Befehl:

INSERT INTO `wp_postmeta` (post_id, meta_key, meta_value)
SELECT DISTINCT `post_parent`, 'bluth_post_layout', 'single'
FROM `wp_posts`
WHERE `post_type` = 'revision'
ORDER BY `post_parent` DESC;

Führt man die vorherige Abfrage erneut aus, sind deutlich mehr Einträge vorhanden.

Und schon bleibt mehr Zeit für sinnvollere Dinge! 🙂