如何使用PRE_GETS_POST将一个查询到的ID排除在主页循环之外

时间:2015-09-10 作者:Ziqurrat

我想将“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)。任何帮助都将不胜感激。谢谢

1 个回复
最合适的回答,由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 ); 
        }
    }
    
    编辑注释,您需要知道为什么自定义查询需要在条件语句中。这样做的原因是,您只想在主页上运行自定义查询,并且只想运行主查询。正如您的代码所示,您正在对每个页面加载和所有自定义查询运行自定义查询,甚至在后端运行自定义查询。这是不必要的,也是对资源的浪费。

    我希望这有意义

    相关推荐

    Generating a perfect loop

    所以我现在已经在这里坐了大约三个小时了,我不得不让这件事过去几个小时来好好睡一觉,同时我希望能得到你的帮助。我已经能够使用$wpdb->get\\u results从数据库中获取内容,并且能够将它们放入一个数组中,但是我想使用这些信息在循环中运行一个新的查询,以获取列表中的多个项目。我使用了本指南的一个变体https://stackoverflow.com/questions/45848249/woocommerce-get-all-orders-for-a-product 获取订单ID。现在,我已