Hapus semua posting dari jenis posting khusus — secara efisien

8

Saya mencari cara yang aman dan cepat untuk menghapus semua posting jenis posting khusus ini. Menggunakan get_posts()dan wp_delete_post()untuk setiap pos yang dikembalikan tidak berfungsi; itu tidak cukup cepat karena banyaknya permintaan basis data yang terlibat (kesalahan waktu habis).

Lebih disukai, saya sedang mencari query database tunggal untuk menjalankan yang menghapus semua posting yang merupakan jenis posting kustom. Adakah pikiran?

Marcus McLean
sumber
Apakah ini peristiwa satu kali? Jika demikian, kueri sql cepat melalui phpMyAdmin tampaknya paling mudah. Jika ini adalah langkah pemeliharaan rumah yang harus dilakukan secara program / berulang kali, itu tidak akan membantu Anda.
jdm2112
Itu perlu dilakukan secara teratur, tanpa akses database manual, sayangnya.
Marcus McLean
Diterima. Saya akan merekomendasikan melihat wpdbkelas itu. Metode yang disukai dan "cara WP" untuk bekerja secara langsung dengan DB. Beri tahu kami jika Anda membutuhkan bantuan dengan kueri itu. Saya dapat memposting jawaban lengkap nanti jika diperlukan codex.wordpress.org/Class_Reference/wpdb
jdm2112
2
Gunakan 'fields' => 'ids',di get_postsuntuk mendapatkan hanya posting ID. Ini semua yang Anda butuhkan dan itu akan secara signifikan mempercepat permintaan Anda
Pieter Goosen
1
@MarcusMcLean: jelas, Anda melewatkan poin saya;) Sebuah posting tunggal memiliki data di tabel posting, tabel postmeta, tabel taksonomi, dan mungkin tabel opsi. Query SQL murni apa pun yang Anda tulis untuk menghapus postingan itu akan cukup rumit. Anda memiliki peluang bagus untuk meninggalkan banyak hal di berbagai meja itu. Saya akan mencoba menghapus, katakanlah, 50 sekaligus pada interval 5 menit menggunakan fungsi Core danwp_cron()
s_ha_dum

Jawaban:

17

Anda dapat menghapus semua posting melalui $wpdb

DELETE FROM wp_posts WHERE post_type='post_type';
DELETE FROM wp_postmeta WHERE post_id NOT IN (SELECT id FROM wp_posts);
DELETE FROM wp_term_relationships WHERE object_id NOT IN (SELECT id FROM wp_posts)

atau gunakan kueri ini ganti dengan {{CPT Anda}} dengan Jenis Posting Kustom Anda

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 = '{{your CPT}}';
Parth Sutariya
sumber
1
ini mungkin akan bekerja dengan baik, tetapi jangan lupa tentang term term di salah satu tabel term. WordPress seharusnya memiliki fungsi untuk memperbarui ini.
Joel M
pengguna juga memiliki jumlah posting di layar pengguna, tidak yakin apakah data ini disimpan sebelumnya atau dihitung pada pemuatan halaman.
Joel M
1
@ JoelM Kolom hitung ada di tabel database wp_term_taxonomy. Sepertinya fungsi yang Anda cari untuk memperbarui jumlah wp_update_term_count($terms, $taxonomy, false)atau wp_update_term_count_now($terms, $taxonomy)didefinisikan dalam wp-includes/taxonomy.php.
Ken
2

Anda dapat menghapus semua posting dari jenis posting kustom dalam berbagai metode tetapi di sini saya akan menunjukkan kepada Anda bagaimana melakukan ini tanpa menggunakan query SQL. Di sini, misalnya, jenis posting kami adalah produk

$allposts= get_posts( array('post_type'=>'product','numberposts'=>-1) );
foreach ($allposts as $eachpost) {
wp_delete_post( $eachpost->ID, true );
}

Lihat referensi tutorial lengkap di sini

Saruque Ahamed Mollick
sumber
Baca OP lagi: "Menggunakan get_posts()dan wp_delete_post()untuk setiap posting yang dikembalikan tidak berfungsi; itu tidak cukup cepat karena banyaknya permintaan basis data yang terlibat (kesalahan waktu habis)." Anda menggunakan dua fungsi yang tidak ingin ia gunakan.
Mike