Как кэшировать вывод функций шорткода?


Я хотел бы показать на своей начальной странице общее количество сообщений на мультисайте WordPress. Это почти 7000 в 500 блогах. Поэтому я создал функцию, которая должна просматривать каждый блог, чтобы подсчитывать сообщения. Конечно, для этого требуется много времени, поэтому эта функция не очень полезна. Но есть ли способ сказать, что он должен кэшировать выходные данные, скажем, в течение 1 недели?!

Вот мой код:

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' );

Большое вам спасибо и желаю хорошо провести время!

Author: Philipp, 2013-06-08

1 answers

Вы могли бы взглянуть на Временный API WordPress.

Вы должны иметь возможность хранить выходные данные шорткода $total_network с помощью

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

Где WEEK_IN_SECONDS - встроенная константа, равная 604800.

Затем вы можете получить его с помощью:

get_transient( 'my_shortcode_cache' );

Если вам это нужно для работы в сети, существует также set_site_transient() и get_site_transient().

 6
Author: birgire, 2013-06-08 11:20:11