Zählen von Beiträgen mit Argument, ohne die Posts abzurufen

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?

Solutions Collecting From Web of "Zählen von Beiträgen mit Argument, ohne die Posts abzurufen"

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