Wie verwende ich WP_Query, um die Anzahl der Abfragen zu verringern?

Ich habe den folgenden Code in der Fußzeile (ich habe unnötigen HTML entfernt), die ich zu optimieren versuche. Mein Server erstickt im Laufe des Tages 🙂 Wenn posts_per_page auf 1 gesetzt ist, gibt es 48 Abfragen pro Post. Wenn ich es auf 18 setze, wie ich es möchte, gibt es 86 Abfragen pro Post, was für mich sehr groß erscheint, besonders seit ich 1500 Posts habe. Gibt es eine Möglichkeit, dies zu optimieren? Warum kann WP_Query den Job nicht in einer einzigen Abfrage erledigen?

  $footer_query = new WP_Query(array( 'posts_per_page' => 18, 'orderby' => 'rand', 'post_type' => 'post', 'post_status' => 'publish', 'no_found_rows' => true, // counts posts, remove if pagination require 'update_post_term_cache' => false, // grabs terms, remove if terms required (category, tag...) // look for post which has featured img 'meta_query' => array( array( 'key' => '_thumbnail_id', ) ) )); // LOOP if ($footer_query->have_posts()) : while ($footer_query->have_posts()) : $footer_query->the_post(); ?> <a href="https://wordpress.stackexchange.com/questions/217998/how-to-user-wp-query-to-lower-the-number-of-queries/">  'img-responsive') ); ?>  <a href="https://wordpress.stackexchange.com/questions/217998/how-to-user-wp-query-to-lower-the-number-of-queries/">    <?php endif; endwhile; wp_reset_query(); 

Solutions Collecting From Web of "Wie verwende ich WP_Query, um die Anzahl der Abfragen zu verringern?"

Das große Problem, das Sie hier haben, ist das Aufrufen Ihrer Post-Thumbnails. Das fügt ungefähr zwei Abfragen pro Post hinzu, was ziemlich schwer ist. Wenn wir uns den Quellcode von get_the_post_thumbnail() , werden wir sehen, dass die Thumbnails nur in der Hauptabfrage und nicht in benutzerdefinierten Abfragen zwischengespeichert werden. Also müssten wir das manuell machen.

Du kannst hinzufügen

 update_post_thumbnail_cache( $footer_query ); 

kurz vor deiner Schleife. Dies sollte sich um die große Anzahl von DB-Aufrufen kümmern

Nur ein paar Anmerkungen zu Ihrem Code

  • Sie sollten wp_reset_postdata() nach der Schleife verwenden, nicht wp_reset_query() , letztere wird in Verbindung mit query_posts die Sie nie verwenden sollten. wp_reset_postdata() sollte auch zwischen endwhile und endif aufgerufen werden

  • Zufällige Reihenfolge ist immer viel langsamer als jede andere Reihenfolge, da es immer noch durch die gesamte database geht, um zufällige Posts auszuwählen, also sollten Sie sich das ansehen

  • Es ist nicht notwendig, Argumente mit ihren Standardwerten zu definieren. post_type standardmäßig auf post und post_status zum publish

  • Korrigieren Sie den Code ordnungsgemäß, um ihn lesbarer, wartbarer und debuggbar zu machen

  • Ab PHP 5.4 können Sie eine kurze Array-Syntax verwenden, die weniger Schreiben erfordert 😉

Sie können Ihren Code wahrscheinlich wie folgt neu schreiben

 $args = [ 'posts_per_page' => 18, 'orderby' => 'rand', 'no_found_rows' => true, // counts posts, remove if pagination require // look for post which has featured img 'meta_query' => [ [ 'key' => '_thumbnail_id', ] ] ]; $footer_query = new WP_Query( $args ); // Update the thumbnail cache update_post_thumbnail_cache( $footer_query ); // LOOP if ($footer_query->have_posts()) : while ($footer_query->have_posts()) : $footer_query->the_post(); ?>  < ?php echo get_the_post_thumbnail( get_the_ID(), 'small_thumbnail', array('class' => 'img-responsive') ); ?>   < ?php the_title(); ?>  < ?php endwhile; wp_reset_postdata(); endif;