Șterge toate postările unui tip de postare personalizat—în mod eficient
Caut o modalitate sigură și rapidă de a șterge toate postările unui tip de postare personalizat. Utilizarea get_posts()
și wp_delete_post()
pentru fiecare postare returnată nu funcționează; nu este suficient de rapid din cauza numărului mare de interogări în baza de date implicate (eroare de timeout).
De preferință, caut o singură interogare în baza de date care să șteargă toate postările care sunt de un anumit tip de postare personalizat. Aveți vreo sugestie?

Puteți șterge toate articolele folosind $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)
sau folosiți această interogare, înlocuind {{your CPT}} cu tipul tău de Postare Personalizată
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}}';

acest lucru ar funcționa probabil bine, dar nu uita de numărul de termeni din una dintre tabelele de termeni. WordPress ar trebui să aibă o funcție pentru a actualiza acest lucru.

utilizatorii au și număr de postări pe ecranul de utilizatori, nu sunt sigur dacă aceste date sunt salvate înainte sau calculate la încărcarea paginii.

@JoelM Coloana count există în tabela de baze de date wp_term_taxonomy
. Se pare că funcția pe care o cauți pentru a actualiza numărul este wp_update_term_count($terms, $taxonomy, false)
sau wp_update_term_count_now($terms, $taxonomy)
definită în wp-includes/taxonomy.php
.

Acest lucru poate fi acum realizat cu ajutorul WordPress CLI folosind comanda wp post delete. Odată ce CLI-ul este instalat, următoarea comandă de terminal (în timp ce vă aflați în directorul rădăcină al site-ului) va șterge toate articolele de tipul mycustomtype
:
wp post delete $(wp post list --post_type='mycustomtype' --format=ids)
Fără SQL brut (*brrr*), fără griji legate de timeout-uri, și este rapid. De exemplu, tocmai am șters ~2500 de articole în mai puțin de două minute.
Pentru a sări peste Coșul de gunoi și șterge complet folosește --force

Aceasta a funcționat pentru mine pentru a șterge ~12k postări. A gestionat fără probleme. Folosește flag-ul --force
dacă dorești să sări peste "coșul de gunoi" și să ștergi permanent.

Puteți șterge toate articolele unui tip de postare personalizat în diverse moduri, dar aici vă voi arăta cum să faceți acest lucru fără a folosi interogări SQL. Aici, de exemplu, tipul nostru de postare este product
$allposts = get_posts( array('post_type' => 'product', 'numberposts' => -1) );
foreach ($allposts as $eachpost) {
wp_delete_post( $eachpost->ID, true );
}

Citește din nou OP: "Folosirea get_posts()
și wp_delete_post()
pentru fiecare post returnat nu funcționează; nu este suficient de rapid din cauza numărului mare de interogări la baza de date (eroare de timeout)."
Tu folosești cele două funcții pe care el nu vrea să le folosească.

Ai absolută dreptate. Dar doar pentru a fi în siguranță și pentru a șterge și termenii, comentariile și meta cu numărătoare pe termeni. Este metoda perfectă. Poate putem folosi cron pentru asta.

Dacă ai prefixat tipul tău de postare CPT și taxonomiile CPT cu, de exemplu, 'abc_my_custom_post_type' și 'abc_my_taxonomy', atunci este simplu să elimini totul din baza de date cu două interogări:
DELETE a,b
FROM $wpdb->posts a
LEFT JOIN $wpdb->postmeta b ON a.ID = b.post_id
WHERE a.post_type LIKE 'abc_%';
DELETE a,b,c
FROM $wpdb->term_taxonomy a
LEFT JOIN $wpdb->term_relationships b ON a.term_taxonomy_id = b.term_taxonomy_id
LEFT JOIN $wpdb->terms c ON a.term_id = c.term_id
WHERE a.taxonomy LIKE 'abc_%'
