Ich habe eine ziemlich umfangreiche database, 30000+ Elemente und benutze dies:
$args = array( 'posts_per_page' => -1, 'post_type' => 'books', 's' => $s ); $post_counts = count(get_posts($args));
scheint ewig zu dauern.
I solved this particular case with: $post_count = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'books' AND post_status = 'publish' AND post_title LIKE '%".$s."%'");
Aber ich habe viele Fragen, die ich zählen möchte, ohne sie von Hand schreiben zu müssen. Gibt es eine Möglichkeit, die Posts mit den $ args zu zählen, die native functionen von WordPress verwenden, ohne die gesamte Abfrage speichern zu müssen, sondern nur die Anzahl?
Hier ist eine Sache, die Sie tun können. Erstellen Sie ein WP_Query-Objekt, aber schließen Sie nur die IDs ein:
$args = array( 'posts_per_page' => -1, 'post_type' => 'books', 's' => $s, 'fields' => 'ids', ); $query = new WP_Query( $args ); $post_counts = $query->post_count; wp_reset_postdata();
Wenn Sie fields => ids
Sie nur die IDs zurück. Außerdem führt WP_Query bereits eine Zählung durch und stellt sie als Eigenschaft post_count
: post_count
. Schließlich, da wir eine WP_Query verwenden, müssen wir die Globals mit wp_reset_postdata()
zurücksetzen.
Wenn WP_Query
eine SQL-Abfrage mit SQL_CALC_FOUND_ROWS
und einer LIMIT
Klausel generiert:
SELECT SQL_CALC_FOUND_ROWS ... FROM ... WHERE ... LIMIT ...
dann die Gesamtzahl der Zeilen:
SELECT FOUND_ROWS();
steht in der found_posts
Eigenschaft von WP_Query
.
Dies bedeutet, dass wir einen einzelnen Beitrag mit folgenden Punkten abrufen können:
'posts_per_page' => 1 // not -1
und erhalte die Gesamtanzahl von
$total = $query->found_posts;
WP_Query
$query
das WP_Query
Objekt ist.
Aus der MySQL- Dokumentation :
FOUND_ROWS ():
Bei einer SELECT-Klausel mit einer LIMIT-Klausel würde die Anzahl der zurückgegebenen Zeilen keine LIMIT-Klausel sein
Es ist auch informativ, WP_Query::set_found_posts()
zu betrachten, um zu sehen, wie die found_posts
Eigenschaft konstruiert wird.
Es gibt $wpdb->num_rows
Parameter. Aber ich schlage vor, du tust es mit
$wpdb->get_var("SELECT COUNT(*) ... )
Dies sollte viel schneller sein, wenn ich mich nicht irre. Es hängt mit den internen functionen von mysql zusammen.
Wenn COUNT ausgeführt wird, reserviert der Server nur Speicher, um das Ergebnis der Zählung zu speichern.
Wenn Sie mysql_num_rows verwenden, verarbeitet der Server die gesamte Ergebnismenge und weist Speicher für all diese Ergebnisse zu