Pre_Get_Posts仅按管理员角色显示帖子

时间:2018-11-15 作者:user2115227

我正在尝试筛选查询,以仅显示由具有管理员角色的用户发布的帖子。

我已经创建了一个pre\\u get\\u posts操作,并尝试使用$query->set只过滤类别页面中的帖子。。。

到目前为止我有这个

function remove_unvetted_authors() {
    $query->set( \'role\', \'administrator\' );
}

if (is_category()) {
    add_action( \'pre_get_posts\', \'remove_unvetted_authors\' );
}
但它抛出了500个错误。我知道“role”实际上不是wp\\u查询的参数,但我找不到查看用户角色的参数:/

我也试过:

function remove_unvetted_authors() {
    $ids = get_users( array(\'role\' => \'administrator\' ,\'fields\' => \'ID\') );
    $query->set( \'author\', \'$ids\' );
}

add_action( \'pre_get_posts\', \'remove_unvetted_authors\' );
但这也会抛出500个错误

3 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

这段代码有很多问题:

  1. $query 未在回调函数中定义
  2. role 不是查询的有效参数$ids 变量不正确author__in.is_category() 不正确$query 从任何地方。您需要将其作为回调函数中的参数接受:

    function remove_unvetted_authors( $query ) {
        // $query->set( \'property\', \'value\' );
    }
    
    如果你不这样做,$query 未定义,正在尝试使用->set() 对于未定义的变量,将导致500错误。这就是导致该错误代码的原因。但是,即使您解决了这个问题,在您解决其他问题之前,它仍然无法工作。

    对于第二个问题,您不能像这样按作者角色查询帖子。您需要执行第二个示例中尝试的操作,并查询作者ID。

    第三期,你通过了$ids 不正确。它是一个变量,因此不应在其周围加引号:

    $query->set( \'author\', $ids );
    
    这不会抛出500个错误,但仍然不起作用。

    第四个问题是,您不能使用author 论点您需要使用author__in:

    $query->set( \'author__in\', $ids );
    
    最后,您正在使用is_category() 不正确。你现在的组织方式,remove_unvetted_authors() 当您查看类别时,将应用于所有查询。

    这将包括菜单和小部件。但是,如文中所述,即使这样也无法正常工作。这是因为is_category() 不会在挂钩函数外工作,因为函数运行时,它是否为类别尚未确定。php已运行。

    您只想影响主类别查询,而只想在前端进行。所以你应该检查一下is_admin() 还有$query->is_category().

    因此,在解决所有这些问题后,您的代码将如下所示:

    function remove_unvetted_authors( $query ) {
        if ( ! is_admin() && $query->is_category() ) {
            $user_ids = get_users( [
                \'role\'   => \'administrator\',
                \'fields\' => \'ID\'
            ] );
    
            $query->set( \'author__in\', $user_ids );
        }
    }
    add_action( \'pre_get_posts\', \'remove_unvetted_authors\' );
    

SO网友:kero

function remove_unvetted_authors() {
    $ids = get_users( array(\'role\' => \'administrator\' ,\'fields\' => \'ID\') );
    $query->set( \'author\', \'$ids\' );
}

add_action( \'pre_get_posts\', \'remove_unvetted_authors\' );
这是一个正确的方向,但有一个具体的错误。\'$ids\' - 由于使用单引号,因此不会对变量求值。而且get_users() 返回array. author 需要int.

相反,使用author__in (并且没有单引号)应该可以:

function remove_unvetted_authors() {
    $ids = get_users( array(\'role\' => \'administrator\' ,\'fields\' => \'ID\') );
    $query->set( \'author__in\', $ids );
}

SO网友:Prasad Wandre

请尝试检查以下代码:

function remove_unvetted_authors() {
// Query user data on admins
$administrators = new WP_User_Query( array( \'role\' =>  \'administrator\' ) ); 

// Save admin IDs
foreach( $administrators->results as $u )
 $user_ids[] = $u->ID;

// Little cleanup
unset( $u, $administrators);

// Get all posts by these authors
$query = new WP_Query( array( 
  \'post_type\' => \'post\',
  \'author\' => $user_ids 
) );
$posts = $query->posts;

//collect all post ids of that author by loop
$post_ids = array();
foreach($posts as $post) {
  $post_ids[] = $post->ID;    
}

$query->set(\'post__in\', $post_ids);
}

add_action( \'pre_get_posts\', \'remove_unvetted_authors\' );

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post