SQL-Abfrage, um nur die "aktuellen" wp_posts zu extrahieren?

7

Die Tabelle wp_posts scheint alle Revisionen derselben zu behalten, ok, sehr ähnlich, aber vermutlich unterschiedlich, Posts / Seiten / was auch immer.

Ich bin etwas vertraut mit SQL, aber nicht mit WordPress. Ich muss nur die Datensätze extrahieren, die auf der öffentlich zugänglichen Website erscheinen würden. also nur die letzte Revision und nicht alle abgelösten Zeilen. Ich bin mir nicht sicher, wie ich die Felder filtern soll. Offensichtlich etwas komplizierteres als:

select *
from wp_posts
where post_status in ('publish','revision')
order by post_modified desc

das hat 'Duplikate' und scheint einige Sachen zu vermissen.

John Mee
quelle
1
Haben Sie müssen dies über SQL tun? Warum funktioniert WordPress nicht?
Erster
+1 auf @Rarst. Plus: Wenn Sie Duplikate erhalten, verwenden Sie DISTINCT.
Kaiser

Antworten:

10

Anstatt eine Abfrage von Grund auf neu zu erstellen, ist es einfacher zu erkennen, was genau WordPress abfragt, wenn die API-Funktion verwendet wird:

get_posts(array(
             'numberposts' => -1,
         ));

var_dump( $wpdb->last_query );

Gibt folgendes SQL an:

SELECT wp_posts.* FROM wp_posts 
WHERE 1=1 
AND wp_posts.post_type = 'post' 
AND (wp_posts.post_status = 'publish')
ORDER BY wp_posts.post_date DESC
Selten
quelle
@ Elliott ja, ich wünschte, jemand hätte mir ein paar Jahre früher von diesem Trick erzählt, als ich ihn gelernt habe :)
Rarst
Sie sollten immer wpdb verwenden, um das aktuelle Tabellenpräfix abzurufen.
Brian Fegter
@Brian Fegter Diese Abfrage wird von WP generiert und hat daher bereits das richtige Präfix. Dieser Ansatz gibt immer eine spezifische Abfrage für die Installation.
Erster
@Rarst - DOH :)
Brian Fegter
Genial! Es geht also wirklich nur um den Status "Veröffentlichen". Es muss auf etwas anderes gesetzt werden, wenn der Beitrag aktualisiert wird. Danke.
John Mee
0

Sie sollten dies verwenden, da Wordpress hier schweres Heben ausführt:

$args = array(
    'showposts' => 10,
);
$posts = query_posts();
var_dump($posts);

Weitere Informationen zum Hinzufügen von Argumenten zu query_posts finden Sie unter http://codex.wordpress.org/Class_Reference/WP_Query

Sie sollten auch die Wordpress-Datenbankklasse verwenden, wenn Sie manuelle MYSQL-Abfragen erstellen. Weitere Informationen finden Sie hier: http://codex.wordpress.org/Class_Reference/wpdb Wordpress enthält außerdem eine hervorragende Funktion zum Escape-Enthalten von Daten in Abfragen, um Ihren Betrieb zu schützen: esc_sql ($ string);

Sie können die Wordpress-Datenbankklasse folgendermaßen verwenden:

global $wpdb;
$results = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE $wpdb->posts.post_status = 'publish'");

Wenn Sie $ wpdb-> verwenden, bevor der Tabellenname dem zugewiesenen Datenbankpräfix vorangestellt wird. Dies ist wichtig, da Sie mithilfe von Tabellenpräfixen mehrere Wordpress-Installationen in einer Datenbank haben können. $ wpdb-> greift auf den richtigen Präfixkontext zu.

Brian Fegter
quelle