我已经在 WPSE 上对这个主题做了非常详细的解释,为了它可能对 SO 用户产生的价值和好处,这里是从 WPSE 上的那个问题复制的完整帖子。出于兴趣,这里是 WPSE 上完整帖子的链接:Some doubts about how the main query and the custom query works in this custom theme?
您的实际问题基本上是何时运行自定义查询以及何时使用主查询。让我们把它分成三个部分
第一部分
何时运行自定义查询(这不是一个确定的列表)
何时使用主查询。
显示主要内容
第二部分
要选择所有精选帖子,我使用此行创建一个新的 WP_Query 对象,该对象定义具有特定标签的查询:
因此,据我了解,这不是 WordPres 主查询,而是我创建的新查询。据我了解,当我想执行此类操作时,最好创建一个新查询(如已完成)而不使用主查询
正确。这超出了主查询的范围。这是无法使用主查询创建的次要或补充内容。您应该始终使用WP_Query 或get_posts 来创建您的自定义查询。
切勿使用 query_posts 创建自定义查询,甚至任何其他查询。我的重点。
注意:此功能不适用于插件或主题。正如稍后解释的,有更好、性能更高的选项来更改主查询。 query_posts() 是通过用新的查询实例替换页面的主查询来修改页面的主查询的过于简单和有问题的方法。它效率低下(重新运行 SQL 查询)并且在某些情况下会彻底失败(尤其是在处理帖子分页时)。
继续
好的,我继续显示所有没有特色标签的帖子,为此我使用这段代码 sn-p 相反地修改主查询:
query_posts( array( 'tag__not_in' => array ( $term->term_id )));
所以我认为这非常可怕。是真的吗?
这都是错误的,很遗憾你的说法是正确的。如前所述,切勿使用query_posts。它运行一个全新的查询,这对性能不利,并且在大多数情况下会破坏分页,这是分页正常工作的主要查询的组成部分。
这是你的主要内容,所以你应该使用带有默认循环的主查询,它应该看起来像这样,这就是你所需要的
<?php
if (have_posts()) :
// Start the Loop.
while (have_posts()) : the_post();
get_template_part('content', get_post_format());
endwhile;
else :
// If no content, include the "No posts found" template.
get_template_part('content', 'none');
endif;
?>
你可以完全摆脱这部分,删除它,刻录它,然后忘记它
<?
// get the term using the slug and the tag taxonomy
$term = get_term_by( 'slug', 'featured', 'post_tag' );
// pass the term_id to tag__not_in
query_posts( array( 'tag__not_in' => array ( $term->term_id )));
?>
好的,一旦你这样做了,你会看到来自功能标签的帖子使用主查询和默认循环出现在你的主页中。
从主页中删除此标签的正确方法是使用pre_get_posts。这是更改主查询的正确方法,也是您应该始终用来更改主要内容循环的钩子。
所以,pre_get_posts 的代码是正确的,这是您应该使用的函数。只是一件事,请始终检查您是否不在管理页面上,因为pre_get_posts 也会更改后端。所以这是在functions.php中使用的正确代码,用于从主页中删除标记为featured的帖子
function exclude_featured_tag( $query ) {
if ( !is_admin() && $query->is_home() && $query->is_main_query() ) {
$query->set( 'tag__not_in', 'array(ID OF THE FEATURED TAG)' );
}
}
add_action( 'pre_get_posts', 'exclude_featured_tag' );
第三部分
额外的阅读材料,将来会有所帮助