Elimina in modo efficiente tutti i post di un tipo di post personalizzato


8

Sto cercando un modo sicuro e veloce per eliminare tutti i post di un tipo di post personalizzato. L'utilizzo get_posts()e wp_delete_post()per ciascun post restituito non funziona; non è abbastanza veloce a causa dell'enorme quantità di query del database coinvolte (errore di timeout).

Preferibilmente, sto cercando una singola query di database da eseguire che elimini tutti i post che sono di un tipo di post personalizzato. qualche idea?


È un evento unico? In tal caso, la query sql rapida tramite phpMyAdmin sembra più semplice. Se questo è un passaggio di pulizia da svolgere a livello di programmazione / ripetutamente, ciò non ti aiuterà.
jdm2112,

Purtroppo deve essere fatto regolarmente, senza accesso manuale al database.
Marcus McLean,

Ricevuto. Consiglierei di guardare la wpdblezione allora. Metodo preferito e "il modo WP" per lavorare direttamente con il DB. Facci sapere se hai bisogno di aiuto con quella query. Posso pubblicare una risposta completa in seguito, se necessario, codex.wordpress.org/Class_Reference/wpdb
jdm2112

2
Utilizzare 'fields' => 'ids',in get_postsper ottenere solo l'ID post. Questo è tutto ciò di cui hai bisogno e velocizzerà notevolmente la tua richiesta
Pieter Goosen,

1
@MarcusMcLean: ovviamente, hai perso il mio punto;) Un singolo post contiene dati nella tabella dei messaggi, nella tabella postmeta, nelle tabelle di tassonomia e, eventualmente, nella tabella delle opzioni. Qualsiasi query SQL pura che scrivi per eliminare quei post sarà piuttosto complicata. Hai buone possibilità di lasciarti alle spalle quei vari tavoli. wp_cron()
Proverei a

Risposte:


17

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 utilizza questa query sostituiscila con {{il tuo CPT}} con il tuo tipo di post personalizzato

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}}';

1
questo probabilmente funzionerebbe bene, ma non dimenticare i conteggi dei termini in una delle tabelle dei termini. WordPress dovrebbe avere una funzione per aggiornarlo.
Joel M,

gli utenti hanno anche conteggi di post nella schermata degli utenti, non sono sicuri se questi dati vengano salvati in anticipo o calcolati al caricamento della pagina.
Joel M,

1
@JoelM La colonna 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 sia wp_update_term_count_now($terms, $taxonomy)definita wp-includes/taxonomy.php.
Ken,

2

Puoi eliminare tutti i post di un tipo di post personalizzato in vari metodi, ma qui ti mostrerò come farlo senza usare la query SQL. Qui, ad esempio, il nostro tipo di post è prodotto

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

Vedi tutorial completo Riferimento qui


Leggi di nuovo l'OP: "L'utilizzo get_posts()e wp_delete_post()per ciascun post restituito non funziona; non è abbastanza veloce a causa della mole di query di database coinvolte (errore di timeout)." Stai usando le due funzioni che non vuole usare.
Mike,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.