web-dev-qa-db-ja.com

ショートコード関数の出力をクラッシュする方法

私は私のスタートページにWordPress Multisiteの中の投稿の総数を見せたいのです。それらは500のブログで7000近くあります。だから私は投稿を数えるためにすべてのブログを通過しなければならない関数を作りました。多くの時間がかかるので、この関数はあまり役に立ちません。しかし、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' );

どうもありがとうございました。

3
Philipp

WordPress Transient API をご覧ください。

あなたのショートコード出力$total_networkを以下のように保存することができるはずです。

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

ここでWEEK_IN_SECONDS604800と等しい組み込み定数です。

あなたはそれからそれを取って来ることができます:

get_transient( 'my_shortcode_cache' );

ネットワーク全体で動作させるために必要な場合は、set_site_transient()get_site_transient()もあります。

6
birgire