wake-up-neo.com

Verwenden Sie die Transient-API, um Fragen für alle Posts in allen Kategorien zwischenzuspeichern.

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="<?php echo $category->slug ?>-article">
                    <h2 class="<?php echo $category->slug ?>-article-title">
                        <a href="<?php echo get_permalink() ?>"><?php echo get_the_title() ?></a>
                    </h2>
                    <p class="<?php echo $category->slug ?>-post-info">
                        <?php the_time('d. m. Y') ?>
                    </p>
                    <div <?php post_class() ?> >
                        <?php the_content(); ?>
                    </div>
                </article> <?php
            }
        } // end loop
    } // end foreach
wp_reset_postdata() ;
} // end if there are categories filled with posts

Nachdem ich dieses , dieses , dieses und dieses 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="<?php echo $category->slug ?>-article">
                    <h2 class="<?php echo $category->slug ?>-article-title">
                        <a href="<?php echo get_permalink() ?>"><?php echo get_the_title() ?></a>
                    </h2>
                    <p class="<?php echo $category->slug ?>-post-info">
                        <?php the_time('d. m. Y') ?>
                    </p>
                    <div <?php post_class() ?> >
                        <?php the_content(); ?>
                    </div>
                </article> <?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 gut angezeigt. Sind die Kategorien und Beiträge jetzt ordnungsgemäß zwischengespeichert?

Im Code habe ich die beiden Stellen kommentiert, an denen ich den Übergang festgelegt habe. Ich bin jedoch nicht sicher, ob dies mit get_categories() oder innerhalb des foreach für alle Beiträge in der Kategorie verwendet werden kann.

Bearbeiten
Der Transient arbeitet für get_categories(). Die Ausgabe var_dump zeigt mir ein Array der WP_Term-Objekte mit den verfügbaren Kategorien.

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

Bearbeiten
Die Transiente in der foreach ruft nur die erste Kategorie und ihre Beiträge ab und wiederholt diese für die Anzahl der Kategorien. Andere Kategorien als die erste sind nicht vorhanden, vermutlich, weil derselbe Übergang für die Anzahl der Kategorien aufgerufen wird und nach der ersten Runde von foreach voll ist und daher in der Schleife nur die Beiträge der ersten Kategorie angezeigt werden.

Wie kann ich nun einen neuen Übergang 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 bemüht sich, sie gut zu nutzen. Wenn Sie versuchen, den Code zu optimieren und die Best Practices zu befolgen, lassen Sie es mich bitte wissen, wenn dies alles eine schlechte Verwendung mit lauernden Fehlern oder keine Verwendung von allen ist, da es nicht funktioniert. Ein bisschen Anleitung oder wenn ich "die Art" verstanden habe, Transienten zu verwenden, wäre ich sehr dankbar.

Lösung
Per diese Antwort musste ich dem erstellten Transienten 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 wurden nur die Beiträge aus der ersten Kategorie angezeigt.

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

Dies wurde an beiden Stellen durchgeführt, um die Transienten zu erhalten 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="<?php echo $category->slug ?>-article">
                    <h2 class="<?php echo $category->slug ?>-article-title">
                        <a href="<?php echo get_permalink() ?>"><?php echo get_the_title() ?></a>
                    </h2>
                    <p class="<?php echo $category->slug ?>-post-info">
                        <?php the_time('d. m. Y') ?>
                    </p>
                    <div <?php post_class() ?> >
                        <?php the_content(); ?>
                    </div>
                </article> <?php
            }
        } // end loop
    } // end foreach
wp_reset_postdata() ;
} // end if there are categories filled with posts
2
lowtechsun

Sie speichern jedes Abfrageobjekt für jede Kategorie im selben Übergang. Da dies schnell geschieht und der Zeitrahmen einen Tag beträgt, erhalten Sie immer das Abfrageobjekt für die erste Kategorie zurück. Machen Sie Ihren vorübergehenden Namen variabel mit der Kategorie, z.B. so was:

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

Natürlich müssen Sie dann den Transienten mit dem Variablennamen erhalten.

3
Nicolai