客户已要求我实施新的搜索功能,以代替自定义的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
,但是有一种方法可以经常缓存帖子数据以最小化对数据库的查询,然后将搜索项与这些数据进行比较?
答案 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对象缓存中。我们检查缓存中的查询字符串,如果找不到,那么我们运行查询并保存结果,如果找到,则遍历帖子。
查询将在第一次运行时运行缓慢,但在缓存时会加快。