web-dev-qa-db-fra.com

Comment mettre en cache une sortie de fonctions shortcode?

J'aimerais afficher sur ma page d'accueil le nombre total de publications dans un multisite WordPress. Ce sont près de 7 000 dans 500 blogs. J'ai donc créé une fonction qui doit parcourir tous les blogs pour compter les messages. Bien que cela demande beaucoup de temps, cette fonction n’est pas très utile. Mais y a-t-il moyen de dire qu'il devrait mettre en cache la sortie pendant 1 semaine?!

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

Merci beaucoup et passez un bon moment!

3
Philipp

Vous pouvez jeter un coup d'œil à l'API WordPress Transient .

Vous devriez être capable de stocker votre sortie shortcode $total_network avec

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

WEEK_IN_SECONDS est une constante intégrée égale à 604800.

Vous pouvez ensuite aller le chercher avec:

get_transient( 'my_shortcode_cache' );

Si vous en avez besoin pour fonctionner sur tout le réseau, il existe également set_site_transient() et get_site_transient().

6
birgire