Elimine todas las publicaciones de un tipo de publicación personalizado de manera eficiente

8

Estoy buscando una forma segura y rápida de eliminar todas las publicaciones de un tipo de publicación personalizada. Usar get_posts()y wp_delete_post()para cada publicación devuelta no funciona; no es lo suficientemente rápido debido a la gran cantidad de consultas a la base de datos involucradas (error de tiempo de espera).

Preferiblemente, estoy buscando una única consulta de base de datos para ejecutar que elimine todas las publicaciones que sean de un tipo de publicación personalizada. ¿Alguna idea?

Marcus McLean
fuente
¿Es este un evento de una sola vez? Si es así, la consulta SQL rápida a través de phpMyAdmin parece más fácil. Si este es un paso de mantenimiento que debe realizarse mediante programación / repetición, eso no lo ayudará.
jdm2112
Desafortunadamente, debe hacerse regularmente, sin acceso manual a la base de datos.
Marcus McLean
Entendido. Recomendaría mirar la wpdbclase entonces. Método preferido y "la forma WP" para trabajar directamente con el DB. Háganos saber si necesita ayuda con esa consulta. Puedo publicar una respuesta completa más tarde si es necesario codex.wordpress.org/Class_Reference/wpdb
jdm2112
2
Utilizar 'fields' => 'ids',en get_postsconseguir único puesto de identificación. Esto es todo lo que necesita y acelerará significativamente su consulta
Pieter Goosen
1
@MarcusMcLean: obviamente, te perdiste mi punto;) Una sola publicación tiene datos en la tabla de publicaciones, la tabla de postmeta, la (s) tabla (s) de taxonomía y posiblemente la tabla de opciones. Cualquier consulta SQL pura que escriba para eliminar esas publicaciones será bastante complicada. Tienes muchas posibilidades de dejar las cosas atrás en esas mesas. Intentaría eliminar, digamos, 50 a la vez a intervalos de 5 minutos usando las funciones principales ywp_cron()
s_ha_dum

Respuestas:

17

Puedes eliminar todas las publicaciones a través de $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)

o utilice esta consulta, reemplácela con {{su CPT}} con su Tipo de publicación personalizada

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
fuente
1
Esto probablemente funcionaría bien, pero no se olvide de los recuentos de términos en una de las tablas de términos. WordPress debería tener una función para actualizar esto.
Joel M
los usuarios también tienen recuentos de publicaciones en la pantalla de los usuarios, no estoy seguro si estos datos se guardan de antemano o se calculan en la carga de la página.
Joel M
1
@JoelM La columna de conteo existe en la tabla de la base de datos wp_term_taxonomy. Parece que la función que está buscando para actualizar el recuento está wp_update_term_count($terms, $taxonomy, false)o está wp_update_term_count_now($terms, $taxonomy)definida wp-includes/taxonomy.php.
Ken
2

Puede eliminar todas las publicaciones de un tipo de publicación personalizado en varios métodos, pero aquí le mostraré cómo hacerlo sin usar la consulta SQL. Aquí, por ejemplo, nuestro tipo de publicación es producto

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

Ver tutorial completo Referencia aquí

Saruque Ahamed Mollick
fuente
Lea el OP nuevamente: "Usar get_posts()y wp_delete_post()para cada publicación devuelta no funciona; no es lo suficientemente rápido debido a la gran cantidad de consultas a la base de datos involucradas (error de tiempo de espera)". Estás usando las dos funciones que él no quiere usar.
Mike