Löschen Sie alle Beiträge eines benutzerdefinierten Beitragstyps - effizient

8

Ich suche nach einer sicheren und schnellen Möglichkeit, alle Beiträge eines benutzerdefinierten Beitragstyps zu löschen. Die Verwendung von get_posts()und wp_delete_post()für jeden zurückgegebenen Beitrag funktioniert nicht. Es ist nicht schnell genug, da es sich um eine Vielzahl von Datenbankabfragen handelt (Timeout-Fehler).

Vorzugsweise suche ich nach einer einzelnen Datenbankabfrage, die alle Beiträge eines benutzerdefinierten Beitragstyps löscht. Irgendwelche Gedanken?

Marcus McLean
quelle
Ist das eine einmalige Veranstaltung? In diesem Fall scheint eine schnelle SQL-Abfrage über phpMyAdmin am einfachsten zu sein. Wenn dies ein Haushaltsschritt ist, der programmgesteuert / wiederholt durchgeführt werden muss, hilft Ihnen das nicht weiter.
jdm2112
Dies muss leider regelmäßig ohne manuellen Datenbankzugriff erfolgen.
Marcus McLean
Verstanden. Ich würde dann empfehlen, sich den wpdbUnterricht anzuschauen. Bevorzugte Methode und "der WP-Weg" für die direkte Arbeit mit der DB. Lassen Sie uns wissen, wenn Sie Hilfe bei dieser Anfrage benötigen. Ich kann später bei Bedarf eine vollständige Antwort posten. Codex.wordpress.org/Class_Reference/wpdb
jdm2112
2
Verwenden Sie 'fields' => 'ids',in get_posts, um nur die Post-ID zu erhalten. Dies ist alles, was Sie brauchen, und es wird Ihre Anfrage erheblich beschleunigen
Pieter Goosen
1
@MarcusMcLean: Offensichtlich haben Sie meinen Punkt verfehlt;) Ein einzelner Beitrag enthält Daten in der Beitragstabelle, der Postmeta-Tabelle, der Taxonomietabelle (n) und möglicherweise der Optionstabelle. Jede reine SQL-Abfrage, die Sie schreiben, um diese Beiträge zu löschen, ist ziemlich kompliziert. Sie haben gute Chancen, Dinge in diesen verschiedenen Tischen zurückzulassen. Ich würde versuchen, beispielsweise 50 auf einmal in Intervallen von 5 Minuten mit den wp_cron()
Kernfunktionen

Antworten:

17

Sie können alle Beiträge über löschen $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)

oder verwenden Sie diese Abfrage, und ersetzen Sie sie durch {{Ihr CPT}} durch Ihren benutzerdefinierten Beitragstyp

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
quelle
1
Dies würde wahrscheinlich gut funktionieren, aber vergessen Sie nicht die Anzahl der Begriffe in einer der Begriffstabellen. WordPress sollte eine Funktion haben, um dies zu aktualisieren.
Joel M
Benutzer haben auch die Anzahl der Beiträge auf dem Benutzerbildschirm. Sie sind sich nicht sicher, ob diese Daten zuvor gespeichert oder beim Laden der Seite berechnet wurden.
Joel M
1
@JoelM Die Zählspalte ist in der Datenbanktabelle vorhanden wp_term_taxonomy. Es scheint, als ob die Funktion, nach der Sie suchen, um die Anzahl zu aktualisieren, definiert wp_update_term_count($terms, $taxonomy, false)oder wp_update_term_count_now($terms, $taxonomy)definiert ist wp-includes/taxonomy.php.
Ken
2

Sie können alle Beiträge eines benutzerdefinierten Beitragstyps auf verschiedene Arten löschen. Hier werde ich Ihnen jedoch zeigen, wie Sie dies ohne Verwendung einer SQL-Abfrage tun können. Hier ist beispielsweise unser Beitragstyp Produkt

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

Die vollständige Referenz zum Tutorial finden Sie hier

Saruque Ahamed Mollick
quelle
Lesen Sie das OP noch einmal: "Die Verwendung von get_posts()und wp_delete_post()für jeden zurückgegebenen Beitrag funktioniert nicht; es ist nicht schnell genug, da es sich um eine Vielzahl von Datenbankabfragen handelt (Timeout-Fehler)." Sie verwenden die beiden Funktionen, die er nicht verwenden möchte.
Mike