Come eliminare in blocco tutti gli utenti senza post?


8

Ho 10 mila utenti circa il 98% di questi utenti non ha mai pubblicato un post (intendo post non commenti).

Ho bisogno di un modo per eliminare in massa gli utenti con 0 post.

Il metodo deve contare tutti i post inclusi i tipi di post personalizzati e deve utilizzare la funzione WordPress corretta per eliminare un utente come se fosse stato eliminato manualmente nella dashboard e non solo rilasciare una tabella / riga su mysql, poiché ciò potrebbe causare risultati imprevisti.

C'è un vecchio plug-in che lo fa ma non considera tutti i tipi di post, quindi non può essere realmente utilizzato.

Qualsiasi aiuto apprezzato.


3
Potresti semplicemente riutilizzare il codice nella mia risposta qui: wordpress.stackexchange.com/a/231485/24875
Christine Cooper

Risposte:


8

Se si dispone di un numero elevato di utenti da eliminare, è possibile utilizzare il comando wp delete wp-cli per evitare il timeout degli script.

Ecco un esempio di una query SQL per eliminare tutti gli utenti senza post di qualsiasi tipo e stato .

Puoi quindi provare questo one-liner non testato :

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

o in forma espansa:

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

Tieni presente che abbiamo aggiunto una AND ID NOT IN (1,2,3)restrizione aggiuntiva per assicurarci che questi utenti non vengano eliminati (ad es. Utenti admin). Dovrai adattarlo alle tue esigenze e anche al prefisso della tabella wp_.

Quando l'ho provato brevemente per un paio di utenti, ho notato che dovevo aggiungere la tail -n +2parte per evitare le prime 3 righe nell'intestazione e il bordo della tabella wp db querydell'output.

Qui riassegniamo tutti i post all'utente 1, per evitare la notifica:

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

Spero che tu possa adattarlo ulteriormente alle tue esigenze, come rilassare le condizioni di eliminazione dell'utente aggiungendo WHERE post_status = 'publish'.

Nota: ricordarsi di eseguire il backup prima del test!


Non capisco I post di riassestamento non dovrebbero accadere, non voglio eliminare gli utenti che hanno pubblicato solo quelli con 0 post, non dovrebbe avvenire alcun riassestamento.
Michael Rogers,

1
Non dovrebbe influire su questo esempio specifico poiché abbiamo come target qualsiasi tipo e stato di post. Questo era solo per evitare l'avviso del comando wp delete user. Puoi anche saltare e premere Yo usare --yesper tutti. Se modifichi sql per eliminare solo gli utenti che hanno pubblicato post, potresti averne bisogno per evitare di eliminare ad es. Bozze. Nota che hai menzionato nella domanda gli utenti che non hanno mai pubblicato un post . Ciò significa che potrebbero avere bozze. Ho pensato che non lo avessi in mente ;-) Per favore sii molto specifico nella domanda cosa vuoi eliminare per evitare le congetture. @MichaelRogers
birgire

4

Ecco un modo per farlo in PHP. Potrebbe essere lento e / o timeout, ma poiché è una cosa una tantum, non dovrebbe importare troppo. Posizionalo temporaneamente all'interno di Functions.php o carica come nuovo plug-in.

//* 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 );
    }
  }
}

1

A giudicare dal codice sorgente del vecchio plugin che hai citato, i tipi di post che non considera sono l' allegato e la revisione . Penso che puoi risolverlo facilmente rimuovendolo dal codice sorgente del file plugin no-posts-user-delete.php

    AND NOT WP.post_type in ('attachment', 'revision')

Scusate! Intendevo tipi di post personalizzati. L'autore ha scritto sui forum di supporto che non conta solo i tipi di post personalizzati "post", quindi eliminerebbe gli utenti che hanno creato post personalizzati e che non va bene.
Michael Rogers,

@MichaelRogers Non penso che lo significhi. Come ho detto, gli unici tipi che non vengono conteggiati sono i due che ho scritto. Quindi il plug-in dovrebbe influire sui tipi di post personalizzati. Sono memorizzati nella stessa tabella del database. Ti suggerisco di fare un backup e quindi provare il plugin e vedere se funziona come vuoi. In caso contrario, ripristinare il backup.
Nikolay
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.