Como excluir todos os usuários sem posts?

8

Eu tenho 10 mil usuários, cerca de 98% desses usuários nunca publicaram um post (quero dizer, postar comentários).

Preciso excluir os usuários com 0 postagens em massa.

O método deve contar todas as postagens incluídas nos tipos de post personalizado e usar a função WordPress adequada para excluir um usuário como se ele fosse excluído manualmente no painel e não apenas descartar uma tabela / linha no mysql, pois isso pode causar resultados inesperados .

um plug-in antigo que faz isso, mas não considera todos os tipos de postagem. t realmente ser usado.

Qualquer ajuda apreciada.

    
por Michael Rogers 01.04.2017 / 11:50

3 respostas

8

Se você tem um grande número de usuários para excluir, você pode usar o usuário wp delete < comando strong> wp-cli para evitar tempos limite do script.

Aqui está um exemplo de uma consulta SQL para excluir todos os usuários sem postagens de qualquer tipo e status .

Você pode, portanto, experimentar este un -ested one-liner:

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 de 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

Observe que adicionamos uma restrição AND ID NOT IN (1,2,3) extra para garantir que esses usuários não sejam excluídos (por exemplo, usuários administradores). Você terá que ajustá-lo às suas necessidades e também o prefixo da tabela wp_ .

Quando testei isso por alguns usuários, notei que precisava adicionar a parte tail -n +2 para evitar as três linhas principais no cabeçalho e na borda da tabela da saída wp db query .

Aqui, reatribuímos todas as postagens para o usuário 1, para evitar o aviso:

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

Espero que você possa ajustá-lo ainda mais às suas necessidades, como relaxar as condições de exclusão do usuário adicionando WHERE post_status = 'publish' .

Observação: lembre-se de fazer backup antes de testar!

    
por birgire 01.04.2017 / 13:44
4

Aqui está uma maneira de fazer isso em PHP. Pode ser lento e / ou tempo limite, mas como é uma coisa única, não deve importar muito. Coloque temporariamente dentro do seu functions.php ou faça o upload como um novo 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 );
    }
  }
}
    
por Nathan Johnson 01.04.2017 / 18:32
1

A julgar pelo código-fonte do antigo plug-in que você mencionou, os tipos de postagem que ele não considera são anexo e revisão . Eu acho que você pode facilmente corrigir isso, removendo isso do código-fonte do arquivo plugin no-posts-user-delete.php

    AND NOT WP.post_type in ('attachment', 'revision')
    
por Nikolay 01.04.2017 / 14:12

Tags