Șterge toate postările unui tip de postare personalizat—în mod eficient

13 nov. 2015, 23:29:59
Vizualizări: 48.9K
Voturi: 26

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?

9
Comentarii

Este acesta un eveniment unic? Dacă da, o interogare SQL rapidă prin phpMyAdmin pare cea mai ușoară soluție. Dacă acesta este un pas de întreținere care trebuie făcut programatic/în mod repetat, această abordare nu vă va fi de ajutor.

jdm2112 jdm2112
13 nov. 2015 23:53:56

Trebuie făcut în mod regulat, fără acces manual la baza de date, din păcate.

Marcus McLean Marcus McLean
14 nov. 2015 00:03:30

Am înțeles. Aș recomanda să te uiți la clasa wpdb. Este metoda preferată și "modul WordPress" de a lucra direct cu baza de date. Spune-ne dacă ai nevoie de ajutor cu acea interogare. Pot posta un răspuns complet mai târziu dacă este nevoie https://codex.wordpress.org/Class_Reference/wpdb

jdm2112 jdm2112
14 nov. 2015 00:14:04

Câte articole trebuie să ștergi? Și cât de des? O interogare SQL brută ar putea fi rapidă, dar dacă nu ești foarte, foarte atent, vei lăsa date orfane în întreaga bază de date. WordPress stochează date în multe tabele cu unele legături încrucișate complicate.

s_ha_dum s_ha_dum
14 nov. 2015 04:41:44

Folosește 'fields' => 'ids', în get_posts pentru a obține doar ID-urile articolelor. Este tot ce ai nevoie și va accelera semnificativ interogarea ta.

Pieter Goosen Pieter Goosen
14 nov. 2015 05:09:12

@s_ha_dum Datele orfane sunt exact ceea ce încerc să evit, evident. Șterg aproximativ 5.5K articole (și adaug aproximativ 5.5K articole, deci dacă ai o soluție pentru asta, sunt tot urechi). Este o operație de sincronizare care se întâmplă la intervale arbitrare. Se poate întâmpla o dată pe săptămână sau o dată pe lună.

Marcus McLean Marcus McLean
14 nov. 2015 05:59:57

@PieterGoosen Bun punct, voi încerca asta și voi vedea unde mă duce. Dar bănuiesc că o singură interogare va fi mult mai eficientă.

Marcus McLean Marcus McLean
14 nov. 2015 06:00:23

@jdm2112 Probabil nu voi ajunge la asta până luni, dar pare a fi calea de urmat. Mulțumesc.

Marcus McLean Marcus McLean
14 nov. 2015 06:01:19

@MarcusMcLean : evident, ai ratat ideea mea ;) Un singur articol are date în tabelul posts, tabelul postmeta, tabelul/tabelele de taxonomie și posibil tabelul options. Orice interogare SQL pură pe care o scrii pentru a șterge acele articole va fi destul de complicată. Ai șanse mari să lași lucruri în urmă în acele tabele diverse. Aș încerca să șterg, să zicem, câte 50 deodată la intervale de 5 minute folosind funcțiile Core și wp_cron()

s_ha_dum s_ha_dum
14 nov. 2015 06:08:16
Arată celelalte 4 comentarii
Toate răspunsurile la întrebare 4
4
43

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}}';
2 aug. 2017 20:07:38
Comentarii

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.

Joel M Joel M
28 feb. 2018 21:37:50

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.

Joel M Joel M
28 feb. 2018 21:39:03

@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.

Ken Ken
24 iul. 2019 14:46:33

mai sigur este să folosești comanda WP CLI, verifică celălalt răspuns

Mladen Janjetovic Mladen Janjetovic
30 mai 2024 16:07:15
2
23

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

4 iun. 2020 18:53:01
Comentarii

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.

squarecandy squarecandy
18 sept. 2020 17:09:06

bash: /usr/local/bin/wp: Lista de argumente este prea lungă 200K postări în cazul meu... Aproape am reușit :)

SirLouen SirLouen
1 aug. 2024 15:09:06
3
14

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

Vezi tutorialul complet Referință Aici

2 oct. 2018 20:28:36
Comentarii

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ă.

Mike Mike
2 nov. 2018 10:19:17

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.

pathusutariya pathusutariya
4 mar. 2021 08:29:00

Dacă pasezi 'fields' => 'ids' la get_posts, atunci va returna un array de ID-uri în loc de un array de obiecte post, ceea ce ar trebui să accelereze puțin procesul.

Flimm Flimm
13 iul. 2022 17:45:07
0

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_%'
2 mar. 2023 16:30:42