it-swarm.com.de

Wie kann ich die Ausgabe einer Shortcode-Funktion zwischenspeichern?

Ich möchte auf meiner Startseite die Gesamtzahl der Beiträge in einer WordPress Multisite anzeigen. Das sind fast 7000 in 500 Blogs. Also habe ich eine Funktion erstellt, die jeden Blog durchgehen muss, um die Beiträge zu zählen. Das braucht natürlich viel Zeit, daher ist diese Funktion nicht sehr nützlich. Aber gibt es eine Möglichkeit zu sagen, dass die Ausgabe für etwa 1 Woche zwischengespeichert werden soll ?!

Hier ist mein Code:

function posts_count_func( $args ){

    global $wpdb;
    $blogs = $wpdb->get_results( $wpdb->prepare(
            "SELECT * FROM {$wpdb->blogs} WHERE  spam = '0' 
            AND deleted = '0' AND archived = '0' 
            ORDER BY registered DESC, 2", ARRAY_A ) );

    $original_blog_id = get_current_blog_id();

     $args = array(
        'numberposts'     => -1,
        'post_type'       => 'post',
        'post_status'     => 'publish' );
    $total_network = $draft_network = 0;
    $total_sites = 0;

    foreach ($blogs as $blog)
    {
        wp_cache_flush();
        switch_to_blog( $blog->blog_id );
        $args['post_status'] = 'publish';
        if (count(get_posts($args))<2) { continue; }
        $total_posts = count( get_posts( $args ) );
        $total_network += $total_posts;
        $total_sites += 1;

        $args['post_status'] = 'draft';

        }

 return $total_network;

 switch_to_blog( $original_blog_id );
}
add_shortcode( 'posts', 'posts_count_func' );

Vielen Dank und viel Spaß!

3
Philipp

Sie könnten einen Blick auf die WordPress Transient API werfen.

Sie sollten in der Lage sein, Ihre Shortcode-Ausgabe $total_network mit zu speichern

set_transient( 'my_shortcode_cache', $total_network, WEEK_IN_SECONDS );

dabei ist WEEK_IN_SECONDS eine eingebaute Konstante, die 604800 entspricht.

Sie können es dann abrufen mit:

get_transient( 'my_shortcode_cache' );

Wenn Sie es brauchen, um netzwerkweit zu arbeiten, gibt es auch set_site_transient() und get_site_transient().

6
birgire