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:
- 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:
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! 🙂