Bagaimana cara menghapus secara massal semua pengguna tanpa posting?

8

Saya memiliki 10 ribu pengguna, sekitar 98% dari pengguna ini tidak pernah menerbitkan posting (maksud saya posting bukan komentar).

Saya perlu cara untuk menghapus pengguna secara massal dengan 0 posting.

Metode ini harus menghitung semua posting termasuk jenis posting khusus dan harus menggunakan fungsi WordPress yang tepat untuk menghapus pengguna seolah-olah mereka dihapus secara manual di dasbor dan tidak hanya menjatuhkan tabel / baris di mysql, karena itu dapat menyebabkan hasil yang tidak terduga.

Ada plugin lama yang melakukan ini tetapi tidak mempertimbangkan semua jenis posting sehingga tidak bisa digunakan.

Setiap bantuan dihargai.

Michael Rogers
sumber
3
Anda dapat menggunakan kembali kode dalam jawaban saya di sini: wordpress.stackexchange.com/a/231485/24875
Christine Cooper

Jawaban:

8

Jika Anda memiliki banyak pengguna untuk dihapus, Anda mungkin setuju menggunakan perintah wp delete wp-cli untuk menghindari timeout skrip.

Berikut adalah contoh dari kueri SQL untuk menghapus semua pengguna tanpa tulisan dari jenis dan status apa pun .

Karena itu Anda dapat mencoba satu-liner yang belum diuji ini :

wp user delete $(wp db query "SELECT ID FROM wp_users WHERE ID NOT IN (SELECT DISTINCT post_author FROM wp_posts ) AND ID NOT IN (1,2,3)" | tail -n +2 ) --reassign=1

atau dalam bentuk yang diperluas:

wp user delete $(wp db query
    "SELECT ID  
         FROM wp_users   
         WHERE ID NOT IN (  
            SELECT DISTINCT post_author FROM wp_posts 
         ) AND ID NOT IN (1,2,3)" | tail -n +2 
  ) --reassign=1

Perhatikan bahwa kami menambahkan AND ID NOT IN (1,2,3)batasan ekstra untuk memastikan pengguna ini tidak dihapus (mis. Pengguna admin). Anda harus menyesuaikannya dengan kebutuhan Anda dan juga awalan tabel wp_.

Ketika saya secara singkat menguji ini untuk beberapa pengguna, saya perhatikan saya harus menambahkan tail -n +2bagian untuk menghindari 3 baris teratas di header dan perbatasan tabel wp db queryoutput.

Di sini kami menetapkan kembali semua posting ke pengguna 1, untuk menghindari pemberitahuan:

--reassign parameter not passed. All associated posts will be deleted. Proceed? [y/n] 

Semoga Anda dapat menyesuaikan lebih lanjut dengan kebutuhan Anda, seperti menenangkan pengguna menghapus ketentuan dengan menambahkan WHERE post_status = 'publish'.

Catatan: Ingatlah untuk membuat cadangan sebelum pengujian!

birgire
sumber
Saya tidak mengerti. Reassing postingan tidak boleh terjadi saya tidak ingin menghapus pengguna yang hanya memposting postingan dengan 0 postingan, tidak ada reassing yang terjadi.
Michael Rogers
1
Seharusnya tidak memengaruhi contoh khusus ini karena kami menargetkan semua jenis dan status pos. Ini hanya untuk menghindari pemberitahuan perintah pengguna menghapus wp .. Anda juga dapat melewati dan tekan Yatau gunakan --yesuntuk semua. Jika Anda memodifikasi sql hanya untuk menghapus pengguna yang mempublikasikan posting, maka Anda mungkin perlu untuk menghindari menghapus misalnya konsep. Perhatikan bahwa Anda menyebutkan dalam pertanyaan, pengguna yang tidak pernah menerbitkan pos .. Itu benar-benar berarti mereka mungkin memiliki konsep. Saya berasumsi Anda tidak memikirkan hal itu ;-) Harap sangat spesifik dalam pertanyaan apa yang ingin Anda hapus untuk menghindari dugaan. @MichaelRogers
birgire
4

Inilah cara untuk melakukannya dalam PHP. Mungkin lambat dan / atau kehabisan waktu, tetapi karena ini hanya satu kali, itu tidak terlalu menjadi masalah. Tempatkan sementara di dalam functions.php Anda atau unggah sebagai plugin baru.

//* You don't want to run this on admin_init. Run it once and deactivate
add_action( 'admin_init', 'wpse_262100_admin_init' );
function wpse_262100_admin_init() {
  $reserved_post_types = [
    'attachment',
    'revision',
    'nav_menu_item',
    'custom_css',
    'customize_changeset',
  ];

  //* Get the non-reserved post types
  $post_types = array_diff( array_keys( get_post_types() ), $reserved_post_types );
  foreach( get_users() as $user ) {
    if( 0 == count_user_posts( $user->ID, $post_types ) ) {
      wp_delete_user( $user->ID );
    }
  }
}
Nathan Johnson
sumber
1

Dilihat oleh kode sumber plugin lama yang Anda sebutkan, jenis posting yang tidak dipertimbangkan adalah lampiran dan revisi . Saya pikir Anda dapat dengan mudah memperbaiki ini dengan menghapus ini dari kode sumber file plugin no-posts-user-delete.php

    AND NOT WP.post_type in ('attachment', 'revision')
Nikolay
sumber
Maaf! Maksud saya jenis posting khusus. Penulis menulis di forum dukungan itu tidak menghitung jenis posting khusus hanya "posting" sehingga akan menghapus pengguna yang membuat posting kustom dan itu tidak baik.
Michael Rogers
@MichaelRogers Saya tidak berpikir bahwa dia bersungguh-sungguh. Seperti yang saya katakan, satu-satunya tipe yang tidak dihitung adalah dua yang saya tulis. Jadi plugin harus memengaruhi jenis posting khusus. Mereka disimpan dalam tabel database yang sama. Saya sarankan Anda melakukan backup lalu coba plugin dan lihat apakah itu berfungsi seperti yang Anda inginkan. Jika tidak, pulihkan cadangan.
Nikolay