如何在不同的模板文件中访问一个查询两次?

时间:2017-04-27 作者:Johansson

我尝试运行两次查询,一次在模板部分(page.php)中,一次在主题函数中。php。我这样做是因为我需要将一些样式输出到主题的标题,因为我不允许使用硬编码的内联样式。

这是我的主要问题:

if (have_posts()) {
    while (have_posts()) { 
       the_post();
        // Do some stuff, like the_permalink();
    }
}
现在,我将样式输出到标题的方式如下:

function header_styles(){
    if (have_posts()) {
        global $post;?>
        <style><?php
            while (have_posts()){
                the_post();
                echo " .background-".$post->ID." { background-image: url(\'".get_the_post_thumbnail_url( $post->ID,\'thumbnail\' )."\');}";
                print_r($post);
            }
            wp_reset_postdata();?>
        </style><?php
    }
}
add_action(\'wp_head\',\'header_styles\');
这在主页和归档页面上运行良好。但现在我被困在访问自定义查询中。如果我在第一个代码中将查询分配给变量并在自定义模板文件中使用它(例如My Page 它是使用custom-page.php), 我无法再访问该查询。例如,在中使用此代码custom-page.php:

$custom_query = new WP_Query($args);
if ($custom_query->have_posts()) {
    while ($custom_query->have_posts()) { 
       $custom_query->the_post();
        // Do some stuff, like the_permalink();
    }
}
现在我可以输出自定义查询,但无法在中访问它functions.php.

有没有可能解决这个问题?

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

您可以缓存该页面加载的结果。它应该会成功的header.php, 缓存对象,并在index.php 您可以检查可用性。

收割台

$custom_query = new WP_Query( $args );

if( $custom_query->have_posts() ) {

    // Cache Query before loop
    wp_cache_add( \'custom_query\', $custom_query );

    while( $custom_query->have_posts() ) { 
       $custom_query->the_post();
        // Do some stuff, like the_permalink();
    }

    wp_reset_postdata();
}
其他文件
$custom_query = wp_cache_get( \'custom_query\', $custom_query );

if( ! empty( $custom_query ) && $custom_query->have_posts() ) {

    while( $custom_query->have_posts() ) { 
       $custom_query->the_post();
        // Do some stuff, like the_permalink();
    }

    wp_reset_postdata();
}

SO网友:Mark Kaplun

我在评论中用@howdy\\u mcgee的回答解释了我的保留意见,因此我认为这是正确的做法。

function wpse_265104_get_cached_query($args) {
  static $query;

  $hash = md5(serialize($args))

  if (!isset($query)) {
     $query = array();
  }
  if (!isset($query[$hash])) {
    $query[$hash] = new wp_Query($args);
  }

  $query[$hash]->rewind();
  return $query[$hash];
}
现在你只需要打电话wpse_265104_get_cached_query 使用与您调用的参数完全相同的参数wp_query 而且您不需要担心执行路径和首先执行的代码,这样就可以使循环处于“新鲜”状态。作为奖励,此函数可以缓存多个特定查询。

相关推荐

如何读取WordPress$Query关联数组(散列)键的值

WordPress编程新手(来自更为传统的环境),并试图了解其一些“独特”特性。我们的网站上有一个目录页,此代码驻留在functions.php, 如果条件为true,则调整结果。if( $query->is_post_type_archive( \'directory\' ) ){ ...//do stuff } 我想知道如何获取is_post_type_archive 这就是“目录”当我对值使用测试时。。。var_dumb($query->is_post