web-dev-qa-db-de.com

Wie lösche ich alle Benutzer ohne Beiträge?

Ich habe 10 Tausend Benutzer, von denen 98% noch nie einen Beitrag veröffentlicht haben (ich meine, Beitrag ohne Kommentare).

Ich brauche eine Möglichkeit, Benutzer mit 0 Beiträgen zu löschen.

Die Methode muss alle Beiträge zählen, die benutzerdefinierte Beitragstypen enthalten, und die richtige WordPress-Funktion verwenden, um einen Benutzer so zu löschen, als ob er manuell im Dashboard gelöscht worden wäre, und nicht nur eine Tabelle/Zeile in mysql ablegen, da dies zu unerwarteten Ergebnissen führen könnte.

Es gibt ein altes Plugin , das dies tut, aber nicht alle Post-Typen berücksichtigt und daher nicht wirklich verwendet werden kann.

Jede Hilfe dankbar.

8
Michael Rogers

Wenn Sie eine große Anzahl von Benutzern löschen müssen, können Sie den Befehl wp user delete wp-cli verwenden, um Skript-Timeouts zu vermeiden.

Hier ist ein Beispiel für eine SQL-Abfrage zum Löschen aller Benutzer ohne Beiträge jeglichen Typs und Status .

Sie können dies daher versuchen ungetestet Einzeiler:

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

oder in erweiterter Form:

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

Beachten Sie, dass wir eine zusätzliche Einschränkung für AND ID NOT IN (1,2,3) hinzugefügt haben, um sicherzustellen, dass diese Benutzer nicht gelöscht werden (z. B. Administratorbenutzer). Sie müssen es an Ihre Bedürfnisse und auch das Tabellenpräfix wp_ anpassen.

Als ich dies für einige Benutzer kurz testete, bemerkte ich, dass ich den Teil tail -n +2 hinzufügen musste, um die oberen drei Zeilen in der Kopfzeile und den Tabellenrand der Ausgabe wp db query zu vermeiden.

Hier weisen wir alle Posts Benutzer 1 zu, um den Hinweis zu vermeiden:

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

Hoffe, Sie können es weiter an Ihre Bedürfnisse anpassen, beispielsweise die Löschbedingungen für Benutzer durch Hinzufügen von WHERE post_status = 'publish' lockern.

Hinweis: Denken Sie daran, vor dem Testen zu sichern!

8
birgire

Hier ist eine Möglichkeit, dies in PHP zu tun. Es mag langsam und/oder zeitlich begrenzt sein, aber da es eine einmalige Sache ist, sollte es nicht allzu wichtig sein. Platziere es vorübergehend in deiner functions.php oder lade es als neues Plugin hoch.

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

Gemessen am Quellcode des alten Plugins, das Sie erwähnt haben, sind die Post-Typen, die es nicht berücksichtigt, Anhang und Revision . Ich denke, Sie können dies leicht beheben, indem Sie dies aus dem Quellcode der Plugin-Datei no-posts-user-delete.php entfernen

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