我想将“prima pagina”类别的最后一篇文章从我主页的循环中排除,因为我有一个专用的框,我不想在页面上重复。我正在使用子主题,但我不想覆盖索引。php,因此我将此代码添加到functions.php
function cdbz_modify_main_query( $query ) {
global $post;
$exclude = [];
$fArgs = array(
\'category_name\' => \'prima-pagina\',
\'posts_per_page\' => 1,
\'ignore_sticky_posts\' => 1,
\'fields\' => \'ids\'
);
$featured = new WP_Query($fArgs);
foreach($featured as $fId) { $exclude[] = $fId->ID;};
wp_reset_query();
if ( !is_admin() && $query->is_home() && $query->is_main_query() ) {
$query->set(\'post__not_in\', $exclude);
}
}
add_action( \'pre_get_posts\', \'cdbz_modify_main_query\' );
它破坏了网站。WP\\u查询部分有问题,但我不明白为什么。如果我将相同的查询放在模板的另一个页面中,它工作正常(它返回一个id)。任何帮助都将不胜感激。谢谢
最合适的回答,由SO网友:Pieter Goosen 整理而成
这里有几个问题
自定义查询应该在条件语句中
使用get_posts
只返回$posts
所有物
wp_reset_query()
与一起使用query_posts
你绝对不能用它无需$post
全球的
您的代码应该如下所示
add_action( \'pre_get_posts\', \'cdbz_modify_main_query\' );
function cdbz_modify_main_query( $query )
{
if ( !is_admin()
&& $query->is_home()
&& $query->is_main_query()
) {
$fArgs = array(
\'category_name\' => \'prima-pagina\',
\'posts_per_page\' => 1,
\'ignore_sticky_posts\' => 1,
\'fields\' => \'ids\'
);
$featured = get_posts( $fArgs );
if ( $featured )
$query->set( \'post__not_in\', $featured );
}
}
编辑注释,您需要知道为什么自定义查询需要在条件语句中。这样做的原因是,您只想在主页上运行自定义查询,并且只想运行主查询。正如您的代码所示,您正在对每个页面加载和所有自定义查询运行自定义查询,甚至在后端运行自定义查询。这是不必要的,也是对资源的浪费。
我希望这有意义