缓存发布数据,以便在5000多个帖子网站上更快地搜索查询?

时间:2017-03-08 15:58:21

标签: php mysql wordpress caching

客户已要求我实施新的搜索功能,以代替自定义的Google搜索引擎,该搜索引擎因缓存问题而不断显示旧搜索结果。具有讽刺意味的是,这个问题的解决方案可能会导致类似的问题,但是当我达到这个问题时我会处理它:)。

我实施的搜索代码如下:

<?php
global $query_string;
$query_args = explode("&", $query_string);
$search_query = array();

foreach($query_args as $key => $string) {
  $query_split = explode("=", $string);
  $search_query[$query_split[0]] = urldecode($query_split[1]);
} // foreach

$the_query = new WP_Query($search_query);
if ( $the_query->have_posts() ) :
?>

<!-- the loop -->
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
  <?php echo esc_attr( $post->post_title ); ?>
<?php endwhile; ?>
<!-- end of the loop -->

<?php wp_reset_postdata(); ?>

此查询超级慢。我知道当前代码基于WP_Query运行特定的$search_query,但是有一种方法可以经常缓存帖子数据以最小化对数据库的查询,然后将搜索项与这些数据进行比较?

1 个答案:

答案 0 :(得分:2)

您可以使用WP_Object_Cache

做类似的事情:

global $query_string;

// Check the existing cache for this query
$post_ids = wp_cache_get( $query_string );

// If cache does not exist
if ( false === $post_ids ) {

    // Create the query
    $query_args = explode("&", $query_string);
    $search_query = array();

    foreach($query_args as $key => $string) {
      $query_split = explode("=", $string);
      $search_query[$query_split[0]] = urldecode($query_split[1]);
    }  

    //This is the super slow query.
    $the_query = new WP_Query($search_query);

    //Grab the ID:s so we can make a much more lightweight query later
    $post_ids = wp_list_pluck( $the_query->posts, 'ID' );

    //Cache it!
    wp_cache_set($query_string, $post_ids);

    $posts = $the_query->posts;
} else {
    $the_query = new WP_Query(array(
        'post__in' => $post_ids,
    ));

    while($the_query->have_posts()) {
        // loop here
    }
}

这将获得您之前的查询字符串,然后将该查询字符串保存到WP对象缓存中。我们检查缓存中的查询字符串,如果找不到,那么我们运行查询并保存结果,如果找到,则遍历帖子。

查询将在第一次运行时运行缓慢,但在缓存时会加快。