Eliminare tutti i post di un custom post type in modo efficiente
Sto cercando un modo sicuro e veloce per eliminare tutti i post di un determinato custom post type. Utilizzare get_posts()
e wp_delete_post()
per ogni post restituito non funziona; non è abbastanza veloce a causa dell'enorme quantità di query al database coinvolte (errore di timeout).
Preferibilmente, sto cercando una singola query al database da eseguire che elimini tutti i post di un custom post type. Qualche suggerimento?

Puoi eliminare tutti i post tramite $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)
oppure usa questa query sostituendo {{your CPT}} con il tuo Custom Post Type
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}}';

questo probabilmente funzionerebbe bene, ma non dimenticare i conteggi dei termini in una delle tabelle dei termini. WordPress dovrebbe avere una funzione per aggiornare questo valore.

gli utenti hanno anche conteggi di articoli nella schermata degli utenti, non sono sicuro se questi dati siano salvati in anticipo o calcolati durante il caricamento della pagina.

@JoelM La colonna del conteggio esiste nella tabella del database wp_term_taxonomy
. Sembra che la funzione che stai cercando per aggiornare il conteggio sia wp_update_term_count($terms, $taxonomy, false)
o wp_update_term_count_now($terms, $taxonomy)
definita in wp-includes/taxonomy.php
.

Questo può ora essere fatto utilizzando la CLI di WordPress con il comando wp post delete. Una volta installata la CLI, il seguente comando da terminale (eseguito nella directory root del tuo sito) eliminerà tutti i post di tipo mycustomtype
:
wp post delete $(wp post list --post_type='mycustomtype' --format=ids)
Niente SQL grezzo (*brividi*), nessun problema di timeout ed è veloce. Ad esempio, ho appena eliminato ~2500 post in meno di due minuti.
Per saltare il Cestino ed eliminarli definitivamente usa --force

Questo ha funzionato per me per eliminare ~12k post. Li ha gestiti senza problemi. Usa il flag --force
se vuoi saltare il "cestino" ed eliminare definitivamente.

Puoi eliminare tutti i post di un custom post type in vari modi, ma qui ti mostrerò come farlo senza utilizzare query SQL. Ad esempio, qui il nostro post type è product
// Ottieni tutti i post del tipo 'product'
$allposts = get_posts( array('post_type'=>'product', 'numberposts'=>-1) );
// Elimina ogni post trovato
foreach ($allposts as $eachpost) {
wp_delete_post( $eachpost->ID, true );
}

Leggi di nuovo l'OP: "Usare get_posts()
e wp_delete_post()
per ogni post restituito non funziona; non è abbastanza veloce a causa dell'enorme quantità di query al database coinvolte (errore di timeout)."
Stai usando le due funzioni che non vuole utilizzare.

Hai assolutamente ragione. Ma solo per andare sul sicuro e anche per eliminare con termini, commenti e meta con conteggio sui termini. È il metodo perfetto. Forse possiamo usare un cron per questo.

Se hai prefissato il tuo post type personalizzato (CPT) e le tue tassonomie CPT con ad esempio 'abc_mio_post_type_personalizzato' e 'abc_mia_tassonomia', allora è banale rimuovere tutto dal database con due query:
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_%'
