Verwenden Sie die Transient-API, um Abfragen für alle Posts in allen Kategorien zu cachen?

Ich benutze dies, um alle Beiträge in allen Kategorien anzuzeigen.

$args_cat = array( // order by category name ascending 'orderby' => 'name', 'order' => 'ASC', // get only top level categories 'parent' => 0 ); $categories = get_categories($args_cat); // Full posts query // if there are categories filled with posts if (!empty ($categories) && !is_wp_error( $categories )) { foreach ($categories as $category) { // Query all posts by slug inside each category $args_category_posts = array( 'post_type' => 'post', // The category slug and category name we get from the foreach over all categories 'category_name' => $category->slug ); $query = new WP_Query($args_category_posts); if ($query->have_posts()) { while ($query->have_posts()) { $query->the_post(); ?> <article class="slug ?>-article"> <h2 class="slug ?>-article-title"> <a href="https://wordpress.stackexchange.com/questions/271213/use-transient-api-to-cache-queries-for-all-posts-in-all-categories/">  <p class="slug ?>-post-info">  

<div >
<?php } } // end loop } // end foreach wp_reset_postdata() ; } // end if there are categories filled with posts

Nachdem ich dies , dieses , dieses und das gelesen habe , frage ich mich, ob ich unten das Richtige tue.

 // Transient API all categories and all posts $query_categories = get_transient('cached_categories'); if ( false === $query_categories){ $args_cat = array( // order by category name ascending 'orderby' => 'name', 'order' => 'ASC', // get only top level categories 'parent' => 0 ); // Instead of caching a WP Query I cache 'get_categories($args_cat)', OK to use it like this? $query_categories = get_categories($args_cat); set_transient('cached_categories', $query_categories, DAY_IN_SECONDS ); } // Full posts query // if there are categories filled with posts if (!empty ($query_categories) && !is_wp_error( $query_categories )) { foreach ($query_categories as $category) { $query_category_posts = get_transient('cached_posts'); if ( false === $query_category_posts ){ // Query all posts by slug inside each category $args_category_posts = array( 'post_type' => 'post', // The category slug and category name we get from the foreach over all categories 'category_name' => $category->slug ); // Here I cache the WP_Query, though this runs for all categories. // So am I storing multiple transients here? $query_category_posts = new WP_Query($args_category_posts); set_transient( 'cached_posts', $query_category_posts, DAY_IN_SECONDS ); } if ($query_category_posts->have_posts()) { while ($query_category_posts->have_posts()) { $query_category_posts->the_post(); ?> <article class="slug ?>-article"> <h2 class="slug ?>-article-title"> <a href="https://wordpress.stackexchange.com/questions/271213/use-transient-api-to-cache-queries-for-all-posts-in-all-categories/">  <p class="slug ?>-post-info">  

<div >
<?php } } // end loop } // end foreach wp_reset_postdata() ; } // end if there are categories filled with posts

Die Ausgabe ist in Ordnung, alle Kategorien und Beiträge werden angezeigt, obwohl die Kategorien und Beiträge jetzt korrekt zwischengespeichert sind?

Im Code habe ich die zwei Stellen kommentiert, an denen ich die Transienten gesetzt habe, bin mir aber nicht sicher, ob dies mit get_categories() oder innerhalb der foreach für alle Beiträge in der Kategorie verwendet werden kann.

Bearbeiten
Der Transient funktioniert für get_categories() . Die var_dump Ausgabe zeigt mir ein Array der WP_Term-Objekte, die die verfügbaren Kategorien enthalten.

 $query_categories = get_categories($args_cat); var_dump($query_categories); set_transient('cached_categories', $query_categories, DAY_IN_SECONDS ); 

Bearbeiten
Der Transient innerhalb der foreach erhält nur die erste Kategorie und ihre Beiträge und wiederholt dies für die Anzahl der Kategorien. Andere Kategorien als die erste sind nicht vorhanden, dies vermutlich deshalb, weil der gleiche Transient für die Menge der Anzahl von Kategorien aufgerufen wird und nach der ersten Runde von foreach ist er voll und daher zeigt die Schleife nur die Posts der ersten Kategorie.

Wie kann ich nun einen neuen Transient erstellen, der die Beiträge pro Kategorie in jedem Zyklus der foreach für die Anzahl der Kategorien enthält?

Völlig neu in der Transient API und versuchen, es gut zu nutzen. Wenn Sie versuchen, den Code zu optimieren und die Best Practices einzuhalten, sollten Sie dies wissen lassen, wenn dies alles mit Fehlern behaftet ist, die lauern oder gar nicht funktionieren, da es nicht funktioniert. Ein bisschen Anleitung oder wenn ich “den Weg” verstanden habe, Transienten zu verwenden, wäre sehr geschätzt.

Lösung
Nach dieser Antwort musste ich dem erstellten Transient für jede Kategorie den Kategorienamen (Slug) geben. Andernfalls wird nur die erste Kategorie im Transienten gespeichert und sobald sie für den zweiten Zyklus voll ist, wird sie nicht geändert. Daher zeigten sich nur die Beiträge aus der ersten Kategorie.

Nur $category für die transiente Variable zu verwenden, funktionierte nicht, da $category ein Objekt ist und eine Zeichenkette benötigt wurde, also habe ich es in $category->slug geändert und jetzt funktioniert es.

Dies wurde an beiden Orten gemacht, um die Transiente zu bekommen und einzustellen. Vielen Dank!

 // Transients API all categories and all posts $query_categories = get_transient('cached_categories'); if ( false === $query_categories){ $args_cat = array( // order by category name ascending 'orderby' => 'name', 'order' => 'ASC', // get only top level categories 'parent' => 0 ); // Instead of caching a WP Query I cache 'get_categories()'. $query_categories = get_categories($args_cat); // var_dump($query_categories); set_transient('cached_categories', $query_categories, DAY_IN_SECONDS ); } // Full posts query // if there are categories filled with posts if (!empty ($query_categories) && !is_wp_error( $query_categories )) { foreach ($query_categories as $category) { // var_dump($category); $query_category_posts = get_transient('cached_posts_' . $category->slug ); if ( false === $query_category_posts ){ // Query all posts by slug inside each category $args_category_posts = array( 'post_type' => 'post', // The category slug and category name we get from the foreach over all categories 'category_name' => $category->slug ); // Here I cache the WP_Query, though this runs for all categories. // Because of that the '$category->slug' is used to serve a string and not an object. $query_category_posts = new WP_Query($args_category_posts); set_transient( 'cached_posts_' . $category->slug , $query_category_posts, DAY_IN_SECONDS ); } if ($query_category_posts->have_posts()) { while ($query_category_posts->have_posts()) { $query_category_posts->the_post(); ?> <article class="slug ?>-article"> <h2 class="slug ?>-article-title"> <a href="https://wordpress.stackexchange.com/questions/271213/use-transient-api-to-cache-queries-for-all-posts-in-all-categories/">  <p class="slug ?>-post-info">  

<div >
<?php } } // end loop } // end foreach wp_reset_postdata() ; } // end if there are categories filled with posts

Solutions Collecting From Web of "Verwenden Sie die Transient-API, um Abfragen für alle Posts in allen Kategorien zu cachen?"

Sie speichern jedes Abfrageobjekt für jede Kategorie in demselben Transienten. Da dies schnell geschieht und der Zeitrahmen ein Tag ist, erhalten Sie immer das Abfrageobjekt für die erste Kategorie zurück. Machen Sie Ihren transienten Namen mit der Kategorie variabel, zB so:

 $query_category_posts = get_transient('cached_posts_' . $category ); 

Natürlich müssen Sie dann die Transiente mit dem Variablennamen erhalten.