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_idmeta_keymeta_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:

1SELECT DISTINCT `post_parent`
2FROM `wp_posts`
3WHERE `post_type` = 'revision'
4ORDER 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:

1SELECT  `post_id`, `meta_key`, `meta_value`
2FROM `wp_postmeta`
3WHERE post_id IN (SELECT DISTINCT `post_parent`
4FROM `wp_posts`
5WHERE `post_type` = 'revision'
6ORDER BY `post_parent` DESC) AND `meta_key` = 'bluth_post_layout'
7ORDER 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:

1INSERT INTO `wp_postmeta` (post_id, meta_key, meta_value)
2SELECT DISTINCT `post_parent`, 'bluth_post_layout', 'single'
3FROM `wp_posts`
4WHERE `post_type` = 'revision'
5ORDER 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! 🙂

Übersetzungen: