1

以下查询不适用于我的主题的 WordPress author.php 模板。它包含在页脚中,该页脚在所有页面中都是相同的页脚,并且查询在除 author.php 之外的所有其他页面上都可以正常工作

  <?php if(have_posts()):?>
  <?php query_posts( array( 'post_type' => 'connect' ) ); while (have_posts()) : the_post(); ?>
  <div class="title"><?php the_title();?></div>
  <div class="logos">  
  <?php the_content();?>
  </div>
  <?php endwhile;?>
  <?php wp_reset_query(); ?>
  <?php endif;?>

我已经花了一个多小时试图弄清楚发生了什么以及为什么这不起作用,但我现在觉得我正在与混凝土碰撞。为什么它不起作用?!

4

2 回答 2

8

为了让我解释为什么它只在某些页面上起作用,您需要了解 query_posts() 的实际作用。

query_posts() 修改默认的 Wordpress 循环。无论您在哪个页面上,总是有一个由核心初始化的默认循环。除非您打算修改该循环,否则您必须完全停止使用 query_posts()

query_posts() 经常被滥用的原因有很多,并且在许多论坛以及 Wordpress Codex 本身中都有详细说明。但这涉及到与您的问题无关的领域。

首先,让我们看看您的代码在做什么:

<?php if(have_posts()):?> //If the default loop finds posts....
<?php query_posts( array( 'post_type' => 'connect' ) );?> //Modify the loop to fit these new parameters

基本上,只有在默认循环能够返回一组结果时,您的新查询才会运行。这适用于其他页面,因为默认循环通常适用于大多数情况。

它不适用于您的 Author.php 模板,因为无论出于何种原因,它都无法返回一组结果来运行您修改后的查询。

那么如何解决呢?

您需要更改结构以及调用查询的方式。我不知道您对项目的了解程度如何,如果这与客户的截止日期非常紧迫,但我的建议是放弃所有 query_posts() 调用以支持WP Query

是不是看起来有点复杂?当然。但是,将其作为任何当前和未来 Wordpress 主题的生计将最终为您节省大量时间和麻烦。

坏方法

<?php
query_posts( array( 'post_type' => 'connect' ) );
if(have_posts()): while (have_posts()) : the_post();
?>
<div class="title"><?php the_title();?></div>
<div class="logos">  
<?php the_content();?>
</div>
<?php
endwhile;
wp_reset_query();
endif;
?>

正确的方法

<?php
$q = new WP_Query( array( 'post_type' => 'connect' ) );
if($q->have_posts()) : while($q->have_posts()) : $q->the_post;
?>
<div class="title"><?php the_title();?></div>
<div class="logos">  
<?php the_content();?>
</div>
<?php
endwhile;
wp_reset_postdata();
endif;
?>

希望这会有所帮助,祝你好运。

更新:

WP_Query 确实允许您按作者查询帖子,并且您假设在新的 WP_Query 对象中提供的默认值通常会反映给定页面上的默认查询似乎是有道理的,并且可以潜在地解释您所看到的行为。

由于 WP_Query 文档并没有真正提供一种明确搜索作者类型“任何”的方法,因此我们可能不得不在这个方面有点脏:

$user_ids = get_users(array('who'=>'author', 'fields'=>'ID'));
$q = new WP_Query( array( 'post_type' => 'connect', 'author'=>implode(',', $user_ids) ) );

让我知道这是否有帮助。

于 2012-10-29T04:01:52.340 回答
1

尝试改用 wp 查询

$the_query = new WP_Query();
$the_query->query(array( 'post_type' => 'connect' ));
if ($the_query->have_posts()) : 
while($the_query->have_posts()) : $the_query->the_post();

endwhile; 
endif; 
wp_reset_postdata();

或者,如果 wp_query 不起作用,您也可以尝试使用get_posts 。我很确定这将在 author.php 中工作

global $post;
$args = array( 'post_type' => 'connect' );
$posts = get_posts( $args );
foreach( $posts as $post ): setup_postdata($post); 
   //you can call the_title the_content and any other method that runs under query_posts and WP_Query
endforeach; 
于 2012-10-29T03:58:08.640 回答