我想解决一些错误
首先,你不应该使用query_posts
构造自定义查询。这不仅是我的重点,也是抄本。最大的问题是query_posts
在许多情况下,分页都会失败
Note: 此功能不适用于插件或主题。如后文所述,有更好、性能更好的选项来更改主查询。query\\u posts()是一种过于简单且有问题的方法,通过将页面的主查询替换为新的查询实例来修改它。它效率低下(重新运行SQL查询),并且在某些情况下会彻底失败(尤其是在处理POST分页时)。
其次,不要在不需要的地方运行不必要的查询。使用可以很容易地修改主查询pre_get_posts
, 这样可以节省使用自定义查询执行的不必要的数据库查询
此挂钩在创建查询变量对象之后,但在实际查询运行之前调用。
第三,如果您没有选择,并且必须运行自定义查询,请使用WP_Query
或get_posts
而不是query_posts
此外,您正在滥用php标记。除非您在php和html之间切换,否则无需在每段代码之后打开和关闭php标记。比如说
</div>
</div>
<?php endwhile; ?>
<?php else : ?>
<?php endif; ?>
</div>
可以重写为
</div>
</div>
<?php
endwhile;
else :
endif;
?>
</div>
这就是我将如何解决这个问题。我并不是说这是最好的解决方案,但这是一种更好、更干净的方法来实现你的目标
您对特色内容的第一次查询应该如下所示
<section id="blog-posts">
<header class="header-sezione">
<h2>Articoli in evidenza</h2>
</header>
<?php
$featured = new WP_Query(\'tag=featured\');
if ($featured->have_posts()) :
while ($featured->have_posts()) : $featured->the_post(); ?>
<---YOUR LOOP ELEMENTS--->
<?php
endwhile;
wp_reset_postdata();
endif;
?>
你的主循环很好,我不会对此做任何更改。
DO NOT 在此处使用自定义查询排除标记。使用
pre_get_posts
这样做。以下是如何
在您的功能中。php中,添加以下代码以从主页上的主查询中删除特征标记中的帖子。您将使用is_home()
以主页为目标的条件标记
EDIT
我忘了包括这个。始终是故障安全的,包括检查您是否不在管理页上(
!is_admin()
). 原因是,
pre_get_posts
更改前端和后端都使用的主查询,因此所有更改都将显示在前端和后端。您只想在前端进行更改,因此修改后的代码将
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\' );