我已经在 WPSE 上对这个主题做了非常详细的解释,并且为了它对 SO 用户可能带来的价值和好处,这里是从 WPSE 上的该问题复制的完整帖子。出于兴趣,这里是 WPSE 上完整帖子的链接:对于主查询和自定义查询在此自定义主题中如何工作有些疑问?
您的实际问题基本上是何时运行自定义查询以及何时使用主查询。让我们把它分成三个部分
PART ONE
何时运行自定义查询(这不是最终列表)
何时使用主查询。
显示主要内容
PART TWO
要选择所有精选帖子,我使用此行创建一个新的 WP_Query 对象,该对象定义具有特定标签精选的查询:
因此,据我了解,这不是 WordPres 主查询,而是我创建的新查询。据我了解,当我想要执行此类操作时,最好创建一个新查询(如完成)而不是使用主查询
正确的。这超出了主查询的范围。这是次要或补充内容,无法使用主查询创建。你应该始终使用任一WP_Query or get_posts创建您的自定义查询。
切勿使用 query_posts创建自定义查询,甚至任何其他查询。我的强调。
Note:此功能不适合由插件或主题使用。正如稍后所解释的,有更好、性能更高的选项来更改主查询。 query_posts() 是一种过于简单且有问题的方法,通过将其替换为新的查询实例来修改页面的主查询。它效率低下(重新运行 SQL 查询),并且在某些情况下会彻底失败(尤其是在处理帖子分页时)。
继续
好的,继续,我显示所有没有特色标签的帖子,为此,我使用以下代码片段,相反修改主查询:
query_posts( array( 'tag__not_in' => array ( $term->term_id )));
所以我认为这非常可怕。这是真的吗?
这都是错误的,不幸的是你的说法是正确的。正如之前所说,NEVER use 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。这是更改主查询的正确方法和你应该的钩子always用于更改您的主要内容循环。
所以,代码与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' );
第三部分
额外的阅读材料对将来会有帮助