我处于哪个自定义查询中,如何访问其属性和方法?

时间:2015-03-13 作者:cfx

有时无法创建自定义查询,但当我创建并循环使用它时,我通常希望使用get_template_part() 在自定义查询循环中,拉入一个我已经知道会满足我需要的模板。有时,该模板是99.9%完美的,只需要添加一些条件,就可以根据查询的需要进行操作。

假设is_main_query() = FALSE 在这个模板文件中,我如何(1)确定在哪个查询中循环;和(2)访问非主查询的属性和方法?

示例:

page.php

<?php
  $two_posts        = new WP_Query(array(
    \'nopaging\'      => true,
    \'post_per_page\' => -1,
    \'post_type\'     => \'post\',
    \'post__in\'      => array(1, 2),
    \'orderby\'       => \'post__in\'
  ));
?>

<?php if($two_posts->have_posts()) : ?>
  <div class="two-posts">
    <?php while($two_posts->have_posts()) : ?>
      <?php $two_posts->the_post(); ?>
      <?php get_template_part(\'templates/content\', \'existing\'); ?>
      <!-- or -->
      <?php include(locate_template(\'templates/content-existing.php\')); ?>
    <?php endwhile; ?>
  </div>
<?php endif; ?>
<?php wp_reset_query(); ?>

templates/content-existing.php

<?php if(is_main_query()) : ?>
  <p class="title"><?php the_title(); ?></p>
<?php elseif(/* query == $two_posts */) : ?>
  <?php if(/* $two_posts->current_post == 0 */) : ?>
    <h1><?php the_title(); ?><h1>
  <?php endif; ?>
  <?php if(/* $two_posts->current_post == 1 */) : ?>
    <h2><?php the_title(); ?></h2>
  <?php endif; ?>
<?php else : ?>
  <p>Nothing to display here.</p>
<?php endif; ?>

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

多亏了Rarst的指导,我制定了一个快速的解决方案,虽然看起来有点老套,但似乎可以做到这一点。

解决方案:

page.php

<?php
  $two_posts        = new WP_Query(array(
    \'nopaging\'      => true,
    \'post_per_page\' => -1,
    \'post_type\'     => \'post\',
    \'post__in\'      => array(1, 2),
    \'orderby\'       => \'post__in\'
  ));

  /* Setup default global query boolean */
  $GLOBALS[\'two_posts_query\'] = FALSE;

  /* Keep track of the post count */
  $GLOBALS[\'two_posts_count\'] = $two_posts->post_count;
?>

<?php if($two_posts->have_posts()) : ?>
  <div class="two-posts">
    <?php while($two_posts->have_posts()) : ?>
      <?php $two_posts->the_post(); ?>
      <?php /* Keep track of the current post */ ?>
      <?php $GLOBALS[\'two_posts_current_post\'] = $two_posts->current_post; ?>
      <?php /* Set global variable to TRUE */ ?>
      <?php $GLOBALS[\'two_posts_query\'] = TRUE; ?>
      <?php get_template_part(\'templates/content\', \'existing\'); ?>
      <?php $GLOBALS[\'two_posts_query\'] = FALSE; ?>
      <?php /* Reset global variable to FALSE */ ?>
    <?php endwhile; ?>
  </div>
<?php endif; ?>
<?php wp_reset_query(); ?>

templates/content-existing.php

<?php
  global $two_posts_query, $two_posts_post_count, $two_posts_current_post;
?>

<?php if($two_posts_query && $two_posts_post_count >= 2) : ?>
  <?php if($two_posts_current_post == 0) : ?>
    <h1><?php the_title(); ?><h1>
  <?php elseif($two_posts_current_post > 0) : ?>
    <h2><?php the_title(); ?></h2>
  <?php endif; ?>
<?php else : ?>
  <p class="title"><?php the_title(); ?></p>
<?php endif; ?>

SO网友:Rarst

第一don\'t use is_main_query() function (方法正常)。它告诉您一些与您所认为的完全不同的事情,即主查询被覆盖。

就我所记得的,没有干净的解决方案,因为WP没有将上下文显式传递给特定模板或模板部分的概念。

由于WP的方式主要取决于全局变量,“拟合”(如果脏)方法可能是以相同的方式传递信息-通过您自己的全局变量。

结束

相关推荐

如何使用标准的QUERY_POST按多个字段排序?

在我们的archive.php 我们将显示与所选类别匹配的所有项目。这工作非常好。然后,我们对其进行了改进,添加了一个排序(就在循环之前),并将每页的帖子数从默认的10个增加到了10个,如下所示:$posts = query_posts($query_string . \'&orderby=title&order=asc&posts_per_page=99\'); 这更有效。现在,我们想按多个字段进行排序,比如menu_order 然后title. 我看不到使用我们现有