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:
- Beitrag editieren
- Sidebar-Konfiguration auswählen
- 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! 🙂