Exclua todas as postagens de um tipo personalizado, de maneira eficiente

8

Estou procurando uma maneira rápida e segura de excluir todas as postagens de um tipo de postagem personalizado. Usar get_posts()e wp_delete_post()para cada postagem retornada não funciona; não é rápido o suficiente devido à grande quantidade de consultas ao banco de dados envolvidas (erro de tempo limite).

De preferência, estou procurando uma única consulta de banco de dados a ser executada que exclui todas as postagens que são de um tipo de postagem personalizada. Alguma ideia?

Marcus McLean
fonte
Este é um evento único? Nesse caso, a consulta rápida de sql via phpMyAdmin parece mais fácil. Se essa é uma etapa de manutenção da casa que precisa ser executada programaticamente / repetidamente, isso não ajudará.
jdm2112
Infelizmente, isso precisa ser feito regularmente, sem acesso manual ao banco de dados.
Marcus McLean
Entendido. Eu recomendaria olhar para a wpdbaula então. Método preferido e "o caminho do WP" para trabalhar diretamente com o DB. Informe-nos se precisar de ajuda com essa consulta. Eu posso postar uma resposta completa mais tarde, se necessário codex.wordpress.org/Class_Reference/wpdb
jdm2112
2
Use 'fields' => 'ids',em get_postsobter único posto ID. Isto é tudo que você precisa e significantely irá acelerar o seu consulta
Pieter Goosen
1
@MarcusMcLean: obviamente, você não entendeu;) Uma única postagem possui dados na tabela de postagens, na tabela postmeta, na (s) tabela (s) de taxonomia e, possivelmente, na tabela de opções. Qualquer consulta SQL pura que você escrever para excluir essas postagens será bastante complicada. Você tem uma boa chance de deixar as coisas para trás nessas várias mesas. Eu tentaria excluir, digamos, 50 de cada vez, em intervalos de 5 minutos, usando as funções Core ewp_cron()
s_ha_dum 14/11/2015

Respostas:

17

Você pode excluir todas as postagens via $wpdb

DELETE FROM wp_posts WHERE post_type='post_type';
DELETE FROM wp_postmeta WHERE post_id NOT IN (SELECT id FROM wp_posts);
DELETE FROM wp_term_relationships WHERE object_id NOT IN (SELECT id FROM wp_posts)

ou use esta consulta, substitua-a por {{your CPT}} pelo seu Tipo de postagem personalizado

DELETE a,b,c
    FROM wp_posts a
    LEFT JOIN wp_term_relationships b
        ON (a.ID = b.object_id)
    LEFT JOIN wp_postmeta c
        ON (a.ID = c.post_id)
    WHERE a.post_type = '{{your CPT}}';
Parth Sutariya
fonte
1
isso provavelmente funcionaria bem, mas não se esqueça das contagens de termos em uma das tabelas de termos. O WordPress deve ter uma função para atualizar isso.
Joel H
os usuários também têm contagens de postagem na tela dos usuários, não tendo certeza se esses dados são salvos previamente ou calculados no carregamento da página.
Joel H
1
@JoelM A coluna count existe na tabela do banco de dados wp_term_taxonomy. Parece que a função que você está procurando para atualizar a contagem é wp_update_term_count($terms, $taxonomy, false)ou está wp_update_term_count_now($terms, $taxonomy)definida wp-includes/taxonomy.php.
24719 Ken
2

Você pode excluir todas as postagens de um tipo de postagem personalizada em vários métodos, mas aqui vou mostrar como fazer isso sem usar a consulta SQL. Aqui, por exemplo, nosso tipo de postagem é produto

$allposts= get_posts( array('post_type'=>'product','numberposts'=>-1) );
foreach ($allposts as $eachpost) {
wp_delete_post( $eachpost->ID, true );
}

Veja o tutorial completo Referência aqui

Saruque Ahamed Mollick
fonte
Leia o OP novamente: "O uso get_posts()e wp_delete_post()para cada postagem retornada não funciona; não é rápido o suficiente devido à grande quantidade de consultas ao banco de dados envolvidas (erro de tempo limite)." Você está usando as duas funções que ele não deseja usar.
Mike