将多个WP_Query优化为一个调用?

时间:2013-12-15 作者:Serpream

我已经完成了我的网站建设,并注意到由于结构原因,由于每个WP\\U查询在不同的帖子类型之间跳转,加载数据需要3秒钟。我想知道我是否将这些放在一个函数运行中,这样就不必每次都运行一个数组,这是否会产生任何有益的效果?

遗憾的是,目前我已经尝试:

function get_gametitle_info() {

global $post;

$game_terms = get_the_terms($post, \'games_titles\');
$game_con = wp_list_pluck( $game_terms, \'slug\' );

$game_info = array(
    \'post_type\'=> \'game_information\',
    \'posts_per_page\' => 1,
    \'post_status\' => \'publish\',
    \'order\'    => \'ASC\',
    \'tax_query\' => array(
        array(
        \'taxonomy\' => \'games_titles\',
        \'field\' => \'slug\', 
        \'terms\' => $game_con,
        ), 
    )
);      

$game_info_query = new WP_Query( $game_info );
while ( $game_info_query->have_posts() ) : $game_info_query->the_post();

$gametitleID = get_the_ID();  
    if (has_term(\'3pegi\', \'age_ratings\', $post)){
    $age_terms = array(\'3pegi\'); } 
    if (has_term(\'7pegi\', \'age_ratings\', $post)){
    $age_terms = array(\'3pegi\', \'7pegi\'); } 
    if (has_term(\'12pegi\', \'age_ratings\', $post)){
    $age_terms = array(array(\'3pegi\', \'7pegi\', \'12pegi\')); }
    if (has_term(\'16pegi\', \'age_ratings\', $post)){
    $age_terms = array(\'3pegi\', \'7pegi\', \'12pegi\', \'16pegi\'); }
    if (has_term(\'18pegi\', \'age_ratings\', $post)){
    $age_terms = array(\'3pegi\', \'7pegi\', \'12pegi\', \'16pegi\', \'18pegi\'); }
endwhile;

return $gametitleID;
return $age_terms;
return $game_info_query;
}
这给了我一个-警告:为D:\\xampp\\htdocs\\wp includes\\函数中的foreach()提供的参数无效。php在线2721

game\\u info数组只需运行一次,我希望在使用wp\\u reset\\u postdata()后切换回post类型时,它能够使用该数据,而不是每次在所有其他匹配的查询上运行一次;

对不起,如果不清楚的话。另一种解释方式是:

【发布【A帖子】发布【A帖子】发布【B帖子】【A帖子】

当事实上我只需要对A和B执行一次wp\\U查询时,持续切换对我来说似乎没有意义。这会节省资源并减少3秒钟的负载吗?谢谢

post文件内的正常结构:

$currentID = get_the_ID();
$game_terms = get_the_terms($post->ID, \'games_titles\');
$game_con = wp_list_pluck( $game_terms, \'slug\' );
$args = array(
    \'post_type\'=> \'game_information\',
    \'posts_per_page\' => 1,
    \'post_status\' => \'publish\',
    \'order\'    => \'ASC\',
    \'tax_query\' => array(
        array(
        \'taxonomy\' => \'games_titles\',
        \'field\' => \'slug\', 
        \'terms\' => $game_con,
        ), 
    )/*Search above post type for taxonomy and if matches then proceed*/
);             
$the_query = new WP_Query( $args );
if($the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post();
$gametitleID = get_the_ID();  
    if (has_term(\'3pegi\', \'age_ratings\', $post->ID)){
    $age_terms = array(\'3pegi\'); } 
    if (has_term(\'7pegi\', \'age_ratings\', $post->ID)){
    $age_terms = array(\'3pegi\', \'7pegi\'); } 
    if (has_term(\'12pegi\', \'age_ratings\', $post->ID)){
    $age_terms = array(array(\'3pegi\', \'7pegi\', \'12pegi\')); }
    if (has_term(\'16pegi\', \'age_ratings\', $post->ID)){
    $age_terms = array(\'3pegi\', \'7pegi\', \'12pegi\', \'16pegi\'); }
    if (has_term(\'18pegi\', \'age_ratings\', $post->ID)){
    $age_terms = array(\'3pegi\', \'7pegi\', \'12pegi\', \'16pegi\', \'18pegi\'); }
    endwhile; else:  endif;  wp_reset_postdata();
为了进一步澄清,我正在寻找一种方法,在页面加载时调用wp\\u查询一次(特定于该页面),并将数据保存为一个变量,以便在页眉、主栏、侧栏和页脚中使用。但需要针对每个独特的页面加载进行刷新,因为数据是高度动态的,需要是最新的。目前,我调用多个wp\\u查询,然后每次重置postdata(即使wp\\u查询调用相同的数据),因为我需要在post类型之间切换。

我可以解释的最简单的方法是寻找一种方法,将相同数据的多个wp\\U查询优化到一个调用中,但能够在模板中的多个位置使用。

1 个回复
SO网友:s_ha_dum

您对问题的描述不是很清楚,并且您不一致的代码格式使其难以阅读(另外,我很确定有些代码丢失),但是如果问题是多次运行查询,您可以使用静态变量来解决。

function get_gametitle_info() {
  static $game_info_query = false;
  if (false !== $game_info_query) {
    return $game_info_query;
  }
  /*
    the rest of your code
  */
}
您正在某种程度上“缓存”结果,这对于单页加载很有帮助。您可以使用Transient API.

function get_gametitle_info() {
  $game_info_query = get_transient( \'game_info_query\' );
  if ( !empty( $game_info_query ) ){
    return $game_info_query;
  } 
  /*
    (most of) the rest of your code
  */
  set_transient(\'game_info_query\', $game_info_query, HOUR_IN_SECONDS );
  return $game_info_query;
}
这应该在更新数据之前将数据保存到数据库一个小时。显然,你可以选择其他的时间框架。单个简单查询应该比复杂查询更快。

您甚至可以将这两种方法结合起来,尽管我还没有测试过,也不确定这样做的有效性。

function get_gametitle_info() {
  static $game_info_query = false;
  if (false !== $game_info_query) {
    return $game_info_query;
  }

  $game_info_query = get_transient( \'game_info_query\' );
  if ( !empty( $game_info_query ) ){
    return $game_info_query;
  } 

  /*
    (most of) the rest of your code
  */
  $game_info_query = \'howdy\';
  set_transient(\'game_info_query\', $game_info_query, HOUR_IN_SECONDS );
  return $game_info_query;
}

结束

相关推荐

从wp-Query获取数据,在循环之外&不更改url

我正在基于自定义分类法在wordpress上进行高级搜索。我已经被困72小时了,所以我希望能得到一些帮助或思考。。。步骤1——在js文件中,查询字符串如下所示:if (jQuery(\'#s\').val() == \'\'){ URL = \"/?genre=\" + genre + \'...other Stuff\' #content\'; }else{ URL = \"/?s=\"+searchQueryString+\"&genre=\" + genre +\'.