web-dev-qa-db-fra.com

Cache Get_posts

J'ai une requête (voir ci-dessous) qui donne une liste de 10 nouvelles informations classées par la méta-valeur "event_date" et filtrées afin que seules les publications antérieures à aujourd'hui soient affichées. Le traitement de cette requête prend deux secondes. Je recherche donc un moyen simple de mettre en cache les résultats pour accélérer le temps de chargement. J'utilise déjà WPEngine, je n'ai donc pas besoin de plugins de mise en cache. Merci d'avance pour votre aide.

<?php $today = time();?>
<?php $args = array( 
'numberposts' => 10,
'orderby'       => 'meta_value_num',
'order'         => 'DESC',
'meta_key'      => 'event_date',
'meta_query'    => array(
    array(
        'key' => 'event_date',
        'value' => $today,
        'compare' => '<=',
        'type' => 'NUMERIC'
        )
    )
 );

$postslist = get_posts( $args );

foreach ($postslist as $post) :  setup_postdata($post); ?>
1
Mark Devlin

Vous pouvez utiliser le cache transitoire pour mettre en cache votre requête personnalisée. Voici un code simple à mettre en cache set_transient pour votre requête pendant 12 heures. Dans 12 heures, WordPress ne créera plus de nouvelle requête mais récupérera des publications transitoires. À l'expiration, la nouvelle requête sera sauvegardée de manière transitoire pour les 12 prochaines heures.

J'utilise transitoire de nombreuses requêtes sur mon site Web, mais assurez-vous de bien définir le délai d'expiration, faute de quoi votre nouveau message pourrait ne pas apparaître sur votre site Web pendant un certain temps.

<?php 

    // Check for transient. If none, then execute Query
    if ( false === ( $postslist = get_transient( 'postslist_query' ) ) ) {

        $args = array(
            'numberposts' => 10,
            'orderby'       => 'meta_value_num',
            'order'         => 'DESC',
            'meta_key'      => 'event_date',
            'meta_query'    => array(
                array(
                    'key' => 'event_date',
                    'value' => $today,
                    'compare' => '<=',
                    'type' => 'NUMERIC'
                )
            )
        );

        $postslist = get_posts( $args );

      // Put the results in a transient. Expire after 12 hours.
      set_transient( 'postslist_query', $postslist, 12 * 60 * 60 );

    }

    foreach ( $postslist as $post ) :  setup_postdata( $post );

?>

en savoir plus sur API transitoire

6
Robert hue

J'ai enveloppé le code de @Robert-hue dans une méthode d'assistance appelée get_cached_posts, qui est un remplacement instantané de get_posts avec la mise en cache des transitoires activée:

/**
 * Gets cached posts for a query. Results are stored against a hash of the
 * parameter array. If there's nothing in the cache, a fresh query is made.
 * 
 * @param Array $args The parameters to pass to get_posts().
 * @return Array List of posts matching $args.
 */
public static function get_cached_posts( $args )
{
    $post_list_name = 'get_posts_' . md5( json_encode( $args ) );

    if ( false === ( $post_list = get_transient( $post_list_name ) ) ) {
        $post_list = get_posts( $args );

        set_transient( $post_list_name, $post_list, 86400 );
    }

    return $post_list;
}

Remarque: 86400 est un jour.

0
aalaap