Säubern der Datenbank in WordPress

Ich weiß nicht, ob das Säubern der Datenbank durch irgendein plugin vollständig durchgeführt wird. clean up säubert wenigstens die wp_postmeta von überflüssigen _edit_lock und _edit_last Eintragungen. Wenn man aber ein umfangreiches Kategoriensystem hat und man aus irgendwelchen Gründen die Artikel immer mal wieder überarbeitet, kann die Tabelle wp_term_relationships zu beträchtlichen Umfang anschwellen. So geschehen und gesehen bei einem Kunden, bei dem die gültigen 10000 Eintragungen auf 70000 gewachsen sind. Wenn man nun clean up anwendet, löscht es hervorragend alle posts mit dem status revision und auch die überflüssigen postmeta-Eintragungen, aber nicht die überflüssigen Bezüge von den Kategorien zu den nun gelöschten posts . Wenn man nun – wie ich es leider gemacht habe – erst clean up anwendet und dann versucht, mit SQL die wp_term_relationships zu reinigen, hat man ein scheußliches Problem: es fehlt der positive Bezug post_status=revision, die entsprechenden Zeilen zu löschen. Man müsste jetzt alle Löschen, die keinen Bezug mehr zu wp_posts haben. Meine SQL-Kenntnisse sind überschaubar und ich weiß nicht, wie ich solche Existenz- bzw. Nichtexistenzprobleme lösen kann. Ich habe deshalb eine neue Datenbank kreiert, einen join zwischen den Indizes ID von wp_posts und object_id von wp_term_relationships, dann den für die Kreierung der DB notwendigen Index wieder gelöscht, nachdem ich die Definition der Indizes aus wp_term_relationships übernommen habe. Vielleicht geht das eleganter, aber meine SQL-Kenntnisse s.o.
Hier also die beiden Wege.

1. clean up wurde noch nicht eingesetzt:
DELETE wp_term_relationships FROM wp_term_relationships,wp_posts WHERE wp_term_relationships.object_id=wp_posts.ID AND wp_posts.post_type='revision'
2. clean up wurde bereits ausgeführt
CREATE TABLE IF NOT EXISTS Xpost_relation (nid int NOT NULL AUTO_INCREMENT PRIMARY KEY)
SELECT wp_term_relationships.object_id,term_taxonomy_id,term_order
FROM `wp_posts`,wp_term_relationships WHERE wp_posts.ID=wp_term_relationships.object_id
AND wp_posts.post_type='post' AND wp_posts.post_status='publish'

Die WHERE-Klauseln können natürlich noch verschärft oder abgeschwächt werden in beiden Fällen.
Danach übernimmt man aus wp_term_relationships die Indexdefinition (in phpMyAdmin), löscht nid, setzt den komlexen Index auf PRIMARY, löscht wp_term_relationships und kopiert Xpost_relation nach wp_term_relationships bzw. benennt es in wp_term_relationships um.

One thought on “Säubern der Datenbank in WordPress

Comments are closed.