Supprimer efficacement tous les articles d'un type d'article personnalisé

8

Je recherche un moyen sûr et rapide de supprimer tous les messages d'un type de message personnalisé. L'utilisation de get_posts()et wp_delete_post()pour chaque message renvoyé ne fonctionne pas; ce n'est pas assez rapide en raison de la quantité de requêtes de base de données impliquées (erreur de temporisation).

De préférence, je recherche une seule requête de base de données à exécuter qui supprime toutes les publications qui sont d'un type de publication personnalisé. Des pensées?

Marcus McLean
la source
S'agit-il d'un événement unique? Si c'est le cas, une requête SQL rapide via phpMyAdmin semble la plus simple. S'il s'agit d'une étape de maintenance qui doit être effectuée par programme / à plusieurs reprises, cela ne vous aidera pas.
jdm2112
Cela doit être fait régulièrement, sans accès manuel à la base de données, malheureusement.
Marcus McLean
Bien reçu. Je recommanderais alors de regarder la wpdbclasse. Méthode préférée et "la façon WP" pour travailler directement avec la base de données. Faites-nous savoir si vous avez besoin d'aide pour cette requête. Je peux poster une réponse complète plus tard si nécessaire codex.wordpress.org/Class_Reference/wpdb
jdm2112
2
Utilisez 'fields' => 'ids',in get_postspour obtenir uniquement l'identifiant de publication. C'est tout ce dont vous avez besoin et cela accélérera considérablement votre requête
Pieter Goosen
1
@MarcusMcLean: évidemment, vous avez manqué mon point;) Un seul message contient des données dans le tableau des messages, le tableau postmeta, le (s) tableau (s) de taxonomie, et éventuellement le tableau des options. Toute requête SQL pure que vous écrivez pour supprimer ces messages sera assez compliquée. Vous avez une bonne chance de laisser des choses derrière dans ces différentes tables. J'essaierais de supprimer, disons, 50 à la fois à des intervalles de 5 minutes en utilisant les fonctions de base etwp_cron()
s_ha_dum

Réponses:

17

Vous pouvez supprimer tous les messages 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 utilisez cette requête remplacez-le par {{votre CPT}} par votre type de publication personnalisé

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
la source
1
cela fonctionnerait probablement bien, mais n'oubliez pas le nombre de termes dans l'une des tables de termes. WordPress devrait avoir une fonction pour mettre à jour cela.
Joel M
les utilisateurs ont également des comptes de publication sur l'écran des utilisateurs, ne sachant pas si ces données sont enregistrées au préalable ou calculées au chargement de la page.
Joel M
1
@JoelM La colonne count existe dans la table de base de données wp_term_taxonomy. Il semble que la fonction que vous recherchez pour mettre à jour le nombre soit wp_update_term_count($terms, $taxonomy, false)ou wp_update_term_count_now($terms, $taxonomy)définie dans wp-includes/taxonomy.php.
Ken
2

Vous pouvez supprimer toutes les publications d'un type de publication personnalisé dans diverses méthodes, mais ici, je vais vous montrer comment procéder sans utiliser de requête SQL. Ici, par exemple, notre type de message est produit

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

Voir le tutoriel complet Référence ici

Saruque Ahamed Mollick
la source
Lisez à nouveau l'OP: "L'utilisation de get_posts()et wp_delete_post()pour chaque message retourné ne fonctionne pas; ce n'est pas assez rapide en raison de la quantité de requêtes de base de données impliquées (erreur de temporisation)." Vous utilisez les deux fonctions qu'il ne veut pas utiliser.
Mike