¿Cómo eliminar en masa todos los usuarios sin publicaciones?

8

Tengo 10 mil usuarios, aproximadamente el 98% de estos usuarios nunca publicaron una publicación (es decir, no publicaron comentarios).

Necesito una forma de eliminar en masa a los usuarios con 0 publicaciones.

El método debe contar todas las publicaciones incluidas, los tipos de publicaciones personalizadas y tiene que usar la función adecuada de WordPress para eliminar a un usuario como si se hubieran eliminado manualmente en el tablero y no solo soltar una tabla / fila en mysql, ya que eso podría causar resultados inesperados.

Hay un antiguo complemento que hace esto pero no considera todos los tipos de publicaciones, por lo que realmente no se puede usar.

Cualquier ayuda apreciada.

Michael Rogers
fuente
3
Simplemente puede reutilizar el código en mi respuesta aquí: wordpress.stackexchange.com/a/231485/24875
Christine Cooper

Respuestas:

8

Si tiene que eliminar una gran cantidad de usuarios, puede utilizar el comando wp user delete wp-cli para evitar tiempos de espera de script.

Aquí hay un ejemplo de una consulta SQL para eliminar a todos los usuarios sin publicaciones de ningún tipo y estado .

Por lo tanto, puede probar este one-liner no probado :

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 en forma expandida:

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

Tenga en cuenta que agregamos una AND ID NOT IN (1,2,3)restricción adicional para asegurarnos de que estos usuarios no se eliminen (por ejemplo, usuarios administradores). Deberá ajustarlo a sus necesidades y también al prefijo de la tabla wp_.

Cuando probé brevemente esto para un par de usuarios, noté que tenía que agregar la tail -n +2parte para evitar las 3 líneas superiores en el encabezado y el borde de la tabla de la wp db querysalida.

Aquí reasignamos todas las publicaciones al usuario 1, para evitar el aviso:

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

Espero que pueda ajustarlo aún más a sus necesidades, como relajar las condiciones de eliminación del usuario agregando WHERE post_status = 'publish'.

Nota: ¡ Recuerde hacer una copia de seguridad antes de probar!

Birgire
fuente
No lo entiendo No debería volverse a publicar las publicaciones. No quiero eliminar a los usuarios que publicaron solo aquellos con 0 publicaciones, no debería ocurrir ninguna nueva.
Michael Rogers
1
No debería afectar este ejemplo específico, ya que apuntamos a cualquier tipo de publicación y estado. Esto fue solo para evitar el aviso del comando wp delete user. También puede omitirlo y presionar Yo usar --yespara todos. Si modifica el sql para eliminar solo los usuarios que publicaron publicaciones, entonces podría necesitarlo para evitar eliminar, por ejemplo, borradores. Tenga en cuenta que mencionó en la pregunta a los usuarios que nunca han publicado una publicación . Eso significa estrictamente que pueden tener borradores. Supuse que no tenía eso en mente ;-) Sea muy específico en la pregunta de lo que desea eliminar para evitar las conjeturas. @MichaelRogers
birgire 01 de
4

Aquí hay una manera de hacerlo en PHP. Puede ser lento y / o de tiempo de espera, pero como es una cosa de una sola vez, no debería importar demasiado. Coloque temporalmente dentro de sus functions.php o cárguelo como un nuevo complemento.

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

A juzgar por el código fuente del antiguo complemento que mencionó, los tipos de publicación que no considera son adjuntos y revisión . Creo que puede solucionarlo fácilmente eliminando esto del código fuente del archivo de complemento no-posts-user-delete.php

    AND NOT WP.post_type in ('attachment', 'revision')
Nikolay
fuente
¡Lo siento! Me refería a los tipos de publicaciones personalizadas. El autor escribió en los foros de soporte que no cuenta los tipos de publicaciones personalizadas solo "publicaciones", por lo que eliminaría a los usuarios que hicieron publicaciones personalizadas y eso no es bueno.
Michael Rogers
@ Michael Rogers No creo que él quiera decir eso. Como dije, los únicos tipos que no se cuentan son los dos que escribí. Por lo tanto, el complemento debería afectar los tipos de publicaciones personalizadas. Se almacenan en la misma tabla de base de datos. Le sugiero que haga una copia de seguridad y luego pruebe el complemento y vea si funciona como desea. Si no es así, restaure la copia de seguridad.
Nikolay