Cache Get_posts

时间:2014-09-27 作者:Mark Devlin

我有一个查询(见下文),它提供了一个由10个新闻项组成的列表,这些新闻项按元值“event\\u date”排序,并经过筛选,以便只显示比今天更早的帖子。处理此查询需要两秒钟,因此我正在寻找一种简单的方法来缓存结果,以加快加载时间。我已经使用了WPEngine,所以我不需要任何缓存插件。提前感谢您的帮助。

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

2 个回复
最合适的回答,由SO网友:Robert hue 整理而成

您可以使用瞬态缓存来缓存自定义查询。下面是一个简单的代码set_transient 缓存查询12小时。12小时后,WordPress将不会进行新的查询,而是从transient获取帖子。到期时,它将在接下来的12小时内再次以瞬态形式保存新查询。

我已经在我的网站上使用transient进行了很多查询,但请确保您仔细设置过期时间,否则您的新帖子可能会在一段时间内不会出现在您的网站上。

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

?>
了解更多信息Transient API

SO网友:aalaap

我将@Robert hue的代码包装到一个名为get_cached_posts, 这是对get_posts 启用瞬态缓存时:

/**
 * 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;
}
注意:86400 是一天。

结束