Cara teraman untuk menghapus revisi pos secara massal

8

Salah satu klien saya ada di blog yang agak besar dalam hal jumlah posting dan lalu lintas. Saya mencoba untuk menurunkan basis datanya ke ukuran yang dapat dikelola, dan satu hal yang meningkat adalah puluhan ribu revisi pos.

Saya sudah mengatur konfigurasi Wordpress untuk membatasi jumlah revisi di masa depan menjadi dua:

define('WP_POST_REVISIONS', 2);

Tetapi saya ingin menghapus semua revisi yang ada.

Pertanyaan 1 : Apakah aman untuk menghapus secara langsung semua baris di tabel wp_posts yang memiliki post_type revisi? (Saya telah melihat jawaban yang bertentangan tentang hal ini — tetapi saya ingin sekali melakukannya dengan cara ini jika aman).

Pertanyaan 2 : ... dan ini hanya berlaku jika saya TIDAK hanya melakukan penghapusan langsung dari pertanyaan pertama:

Saya menemukan jawaban ini di mana songdogtech menyediakan permintaan basis data untuk dihapus dengan aman, tetapi (1) itu secara khusus menjawab pertanyaan multisite (ini adalah satu situs) dan (2) Saya baru saja memutakhirkan situs menjadi 3,6, yang termasuk perubahan basis data . (Jadi, saya tidak cukup ahli dalam membaca query database untuk mengetahui apa yang sebenarnya terjadi di sana dan apakah itu akan bekerja untuk satu situs di WP 3.6

StudioAl
sumber

Jawaban:

18

Apakah aman untuk langsung menghapus semua baris dalam tabel wp_posts yang memiliki post_type revisi? (Saya telah melihat jawaban yang bertentangan tentang hal ini — tetapi saya ingin sekali melakukannya dengan cara ini jika aman)

Aman, aman .

Jika hanya ada satu pengguna (Anda) yang dapat mengedit posting di situs itu aman dan tidak menyebabkan masalah lain.

Jika ada lebih banyak pengguna, dan satu sedang mengedit posting dan sementara itu Anda menghapus revisi itu masih tidak aman, tetapi dapat mengganggu bagi pengguna yang melihat revisi menghilang.

Apa yang benar-benar tidak aman adalah menjalankan query SQL pada database WP tanpa mengambil satu (atau lebih baik, lebih banyak) backup yang terjangkau dan menguji query pada lingkungan lokal / dev sebelumnya.

Bayangkan Anda secara tidak sengaja mengetik 'posting' alih-alih 'revisi' , jika Anda tidak memiliki cadangan dan menjalankan kueri di situs produksi, apa yang terjadi?

Mengenai pertanyaan kedua, hapus saja {id}_di mana-mana muncul dalam permintaan diposting sehingga wp_{id}_postsmenjadi wp_postsdan sebagainya.

Sebuah peringatan , yang wp_sebagian merupakan standar awalan tabel, yang keren-orang berubah menjadi sesuatu yang berbeda pada saat instalasi WP.

Jika Anda telah mengubahnya dan wp_config.phpAnda lihat$table_prefix = 'something_else_than_wp_';

Kueri Anda menjadi:

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'

Saya sarankan melanjutkan seperti ini:

  1. Cadangkan basis data
  2. Cadangkan kembali basis data
  3. Uji cadangan dengan memulihkan database di database lain
  4. Ubah 'wp_config' Anda untuk menggunakan database baru ini
  5. Jalankan kueri pada database baru dan periksa apakah ada sesuatu yang salah
  6. Jika tidak, Anda sudah selesai. Jika demikian, ubah 'wp_config' lagi dan biarkan ia menggunakan database lama dan coba selidiki masalahnya.
gmazzap
sumber
Terima kasih. Persis apa yang ingin saya dengar. Dan ya, untuk semua cadangan, dll.
StudioAl
2
1. Backup DB 2. Backup DB Again, Saya suka bagian ini, +1 untuk ini.
shyammakwana.me
Anda bahkan dapat membuat perintah wp-cli khusus untuk mengotomatiskan alur kerja Anda:$ wp post delete $(wp post list --post_type='revision' --format=ids)
Dharma
4

Rincian yang diberikan sejauh ini tidak lengkap di terbaik, dan permintaan a, b, c tidak baik - bahkan berpotensi berbahaya. Ia lupa faktor dalam banyak ketergantungan potensial. Ada diskusi lengkap dan pertanyaan yang lebih baik di sini

Ada juga versi revisi dari kueri ini yang seharusnya jauh lebih baik, tetapi uji dalam lingkungan dev dan cadangan yang berisiko rendah:

Secara khusus:

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';

Kueri ini menangani data lama di mana WordPress mungkin menggunakan object_id yang sama di tabel wp_term_relationships untuk pos dan tautan. Dengan menjalankan versi lain dari kueri a, b, c ini, Anda juga dapat secara tidak sengaja menghapus data tautan. Ini bukan masalah dengan pemasangan WordPress yang lebih baru.

Jika Anda menjalankan versi kueri itu dan mendapatkan 0 penghapusan, itu berarti Anda tidak memiliki entri 'link_category' di tabel wp_term_taxonomy Anda. Anda bisa memverifikasi dengan memeriksa tabel itu, dan kemudian cukup menghapus baris terakhir itu dan menjalankan kueri lagi.

Tetapi pastikan Anda membuat cadangan, menguji, dan memverifikasi hasilnya sebelum digunakan pada data produksi. Kueri ini mengambil salah satu tabel wp_posts saya yang direvisi dari 300 MB hingga 5 MB setelah optimasi.

Andrew
sumber
Silakan kirim solusi nyata dan bukan tautan ke tempat seseorang mungkin menemukan solusi
Pieter Goosen
Baik! Akan lakukan - menguji diri saya terlebih dahulu untuk memastikan itu valid.
Andrew
2

Jalankan query SQL:

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

CATATAN: Permintaan di atas “hanya menghapus posting yang ditandai sebagai revisi. Jika karena alasan tertentu Anda mengaitkan revisi dengan tag atau kategori yang kemudian dihapus ketika pos terakhir diterbitkan, Anda akan memiliki entri tambahan di tabel lain seperti istilah. " Kueri yang tepat untuk menghapus semua revisi Anda dengan aman adalah sebagai berikut (ubah awalan tabel seperlunya):

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
sumber
Terima kasih atas klarifikasi tentang pertanyaan. Masuk akal.
StudioAl