web-dev-qa-db-fra.com

Comment supprimer en bloc tous les utilisateurs sans publication?

J'ai 10 000 utilisateurs environ 98% de ces utilisateurs n'ont jamais publié de post (je veux dire post not comments).

J'ai besoin d'un moyen de supprimer en masse les utilisateurs avec 0 messages.

La méthode doit compter toutes les publications incluses dans les types de publication personnalisés et doit utiliser la fonction WordPress appropriée pour supprimer un utilisateur comme si elles avaient été supprimées manuellement dans le tableau de bord, et pas simplement pour supprimer une table/ligne sur mysql, car cela pourrait entraîner des résultats inattendus.

Il y a un ancien plugin qui fait cela, mais ne considère pas tous les types de publication, donc ne peut pas vraiment être utilisé.

Toute aide appréciée.

8
Michael Rogers

Si vous avez un grand nombre d'utilisateurs à supprimer, vous pouvez utiliser la commande wp utilisateur delete wp-cli pour éviter les délais d'attente de script.

Voici un exemple de requête SQL pour supprimer tous les utilisateurs sans publications de type et de statut quelconques .

Vous pouvez donc essayer ceci non testé bon mot:

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

ou sous forme développée:

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

Notez que nous avons ajouté une restriction supplémentaire AND ID NOT IN (1,2,3) pour nous assurer que ces utilisateurs ne sont pas supprimés (par exemple, les utilisateurs admin). Vous devrez l’adapter à vos besoins ainsi que le préfixe de table wp_.

Lorsque j'ai brièvement testé cela pour quelques utilisateurs, j'ai remarqué que je devais ajouter la partie tail -n +2 pour éviter les 3 premières lignes de l'en-tête et la bordure du tableau de la sortie wp db query.

Ici, nous réaffectons toutes les publications à l'utilisateur 1, afin d'éviter la notification:

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

J'espère que vous pourrez l'adapter à vos besoins, par exemple en assouplissant les conditions de suppression des utilisateurs en ajoutant WHERE post_status = 'publish'.

Remarque: N'oubliez pas de sauvegarder avant de tester!

8
birgire

Voici un moyen de le faire en PHP. Cela peut être lent et/ou expiré, mais comme c'est une chose ponctuelle, cela ne devrait pas avoir trop d'importance. Placez temporairement dans votre fichier functions.php ou téléchargez-le en tant que nouveau plugin.

//* 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

À en juger par le code source de l’ancien plug-in que vous avez mentionné, les types de publication qu’il ne considère pas sont attachment et révision . Je pense que vous pouvez facilement résoudre ce problème en le supprimant du code source du fichier de plug-in no-posts-user-delete.php

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