Der sicherste Weg, um Post-Revisionen in großen Mengen zu löschen

8

Einer meiner Kunden ist in Bezug auf Anzahl der Posts und Traffic auf einem ziemlich großen Blog. Ich versuche, ihre Datenbank auf eine überschaubare Größe zu bringen, und eine Sache, die sich aufbaut, sind buchstäblich Zehntausende von Post-Revisionen.

Ich habe die Wordpress-Konfiguration bereits so eingestellt, dass die Anzahl der zukünftigen Revisionen auf zwei begrenzt wird:

define('WP_POST_REVISIONS', 2);

Ich möchte aber alle vorhandenen Revisionen löschen.

Frage 1 : Ist es sicher, alle Zeilen in der Tabelle wp_posts, die einen Revisionstyp post_type haben, direkt zu löschen? (Ich habe widersprüchliche Antworten dazu gesehen - aber ich würde es gerne so machen können, wenn es sicher ist).

Frage 2 : … und dies ist nur dann relevant, wenn ich NICHT einfach das einfache Löschen aus Frage 1 durchführen sollte:

Ich habe diese Antwort gefunden , bei der songdogtech eine Datenbankabfrage zum sicheren Löschen bereitstellt, aber (1) sie ist speziell eine Antwort auf eine Frage mit mehreren Standorten (dies ist eine einzelne Site) und (2) ich habe die Site gerade auf 3.6 aktualisiert, einschließlich Datenbankänderungen . (Ich bin also nicht in der Lage, Datenbankabfragen zu lesen, um genau zu wissen, was dort vor sich geht und ob es für eine einzelne Site in WP 3.6 funktionieren würde

StudioAl
quelle

Antworten:

18

Ist es sicher, alle Zeilen in der Tabelle wp_posts, die einen Revisionstyp post_type haben, direkt zu löschen? (Ich habe widersprüchliche Antworten dazu gesehen - aber ich würde es gerne so machen können, wenn es sicher ist.)

Sicher, es ist sicher .

Wenn es nur einen Benutzer (Sie) gibt, der Beiträge auf der Website bearbeiten kann, ist dies sicher und verursacht keine weiteren Probleme.

Wenn es mehr Benutzer gibt und einer einen Beitrag bearbeitet und Sie in der Zwischenzeit Revisionen löschen, ist dies immer noch nicht unsicher, kann jedoch für diesen Benutzer ärgerlich sein, wenn Revisionen verschwinden.

Was absolut unsicher ist, ist, die SQL-Abfrage in der WP-Datenbank auszuführen, ohne zuvor eine (oder besser mehrere) kostengünstige Sicherung (en) zu erstellen und die Abfrage in der lokalen / dev-Umgebung zu testen.

Stellen Sie sich vor, Sie geben versehentlich "post" anstelle von "revision" ein . Wenn Sie keine Backups haben und die Abfrage auf dem Produktionsstandort ausführen, was passiert dann?

In Bezug auf die zweite Frage löschen {id}_Sie einfach überall dort, wo sie in der geposteten Abfrage erscheint, so wp_{id}_postswird wp_postsund so weiter.

Eine Warnung , der wp_Teil ist das Standardtabellenpräfix, dass coole Typen während der WP-Installation zu etwas anderem wechseln.

Wenn Sie es geändert haben und in Ihrem sehen wp_config.phpSie$table_prefix = 'something_else_than_wp_';

Ihre Anfrage wird:

DELETE a,b,c
FROM something_else_than_wp_posts a
LEFT JOIN something_else_than_wp_term_relationships b ON (a.ID = b.object_id)
LEFT JOIN something_else_than_wp_postmeta c ON (a.ID = c.post_id)
WHERE a.post_type = 'revision'

Ich schlage vor, so vorzugehen:

  1. Sichern Sie die Datenbank
  2. Sichern Sie die Datenbank erneut
  3. Testen Sie die Sicherung, indem Sie die Datenbank in einer anderen Datenbank wiederherstellen
  4. Ändern Sie Ihre 'wp_config', um diese neue Datenbank zu verwenden
  5. Führen Sie die Abfrage in der neuen Datenbank aus und prüfen Sie, ob ein Fehler vorliegt
  6. Wenn nicht, sind Sie fertig. Wenn ja, ändern Sie 'wp_config' erneut und lassen Sie es die alte Datenbank verwenden und versuchen Sie, das Problem zu untersuchen.
gmazzap
quelle
Vielen Dank. Genau das, was ich hören wollte. Und ja, zu allen Backups usw.
StudioAl
2
1. Backup DB 2. Backup DB AgainIch mag diesen Teil, +1 dafür.
Shyammakwana.me
Sie können sogar einen benutzerdefinierten wp-cli- Befehl erstellen, um Ihren Workflow zu automatisieren:$ wp post delete $(wp post list --post_type='revision' --format=ids)
Dharma
4

Die bisher angegebenen Details sind bestenfalls unvollständig, und die Abfrage a, b, c ist nicht gut - möglicherweise sogar gefährlich. Es wird vergessen, viele potenzielle Abhängigkeiten zu berücksichtigen. Es gibt eine umfassende Diskussion und besser fragt hier

Es gibt auch diese überarbeitete Version der Abfrage, die viel besser sein sollte, aber in einer Entwicklungsumgebung und einem Backup mit geringem Risiko getestet werden sollte:

Speziell:

DELETE a,b,c
FROM wp_posts a
LEFT JOIN wp_term_relationships b ON ( a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON ( a.ID = c.post_id )
LEFT JOIN wp_term_taxonomy d ON ( b.term_taxonomy_id = d.term_taxonomy_id)
WHERE a.post_type = 'revision'
AND d.taxonomy != 'link_category';

Diese Abfrage verarbeitet ältere Daten, bei denen WordPress möglicherweise dieselbe object_id in der Tabelle wp_term_relationships für einen Beitrag und einen Link verwendet. Durch Ausführen der anderen Versionen dieser Abfrage a, b, c können Sie auch unbeabsichtigt Linkdaten löschen. Dies ist bei neueren Installationen von WordPress weniger ein Problem.

Wenn Sie diese Version der Abfrage ausführen und 0 Löschvorgänge erhalten, bedeutet dies nur, dass Ihre Tabelle wp_term_taxonomy keine Einträge für 'link_category' enthält. Sie können dies überprüfen, indem Sie diese Tabelle überprüfen, dann einfach die letzte Zeile entfernen und die Abfrage erneut ausführen.

Stellen Sie jedoch sicher, dass Sie die Ergebnisse sichern, testen und überprüfen, bevor Sie sie für Produktionsdaten verwenden. Diese Abfrage hat eine meiner überarbeiteten wp_posts-Tabellen nach der Optimierung von 300 MB auf 5 MB reduziert.

Andrew
quelle
Bitte posten Sie eine echte Lösung und keinen Link, wo jemand eine Lösung finden könnte
Pieter Goosen
OK! Ich werde es tun - mich zuerst testen, um sicherzustellen, dass es gültig ist.
Andrew
2

SQL-Abfrage ausführen:

DELETE FROM wp_posts WHERE post_type = "revision" // for "wptest" DB, note the table name

HINWEIS: Die obige Abfrage „löscht nur Beiträge, die als Revisionen markiert sind. Wenn Sie aus irgendeinem Grund eine Revision mit einem Tag oder einer Kategorie verknüpft haben, die dann entfernt wurde, als der endgültige Beitrag veröffentlicht wurde, haben Sie zusätzliche Einträge in anderen Tabellen, z. B. Begriffen. “ Die richtige Abfrage, um alle Ihre Revisionen sicher zu entfernen, lautet wie folgt (ändern Sie das Tabellenpräfix nach Bedarf):

DELETE a,b,c FROM wp_posts a LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id) LEFT JOIN wp_postmeta c ON (a.ID = c.post_id) WHERE a.post_type = 'revision'
Tara
quelle
Vielen Dank für die Klarstellung bezüglich der Fragen. Macht perfekt Sinn.
StudioAl