如何按用户角色查询帖子?

时间:2012-06-21 作者:dev-jim

我想按作者角色查询帖子。并根据角色对帖子进行处理。

我知道我们可以通过get\\u posts或WP\\u query获取帖子,问题是没有参数可以根据作者角色对帖子进行排序。或者,我们也可以将get\\u用户和get\\u帖子组合在一起,如下所示

$users = get_users(array(role => \'author\'));
foreach($users as $user){
//here we can use get_posts to query the posts by the $user->ID   
} .....
这样做太笨拙了。我想知道是否有其他方法可以根据角色查询帖子,也许是SQL查询?

4 个回复
最合适的回答,由SO网友:Sarathi 整理而成

我以前没有真正搞砸过自定义帖子查询,但下面是我尝试的解决方案:

function get_posts_by_author_role($role) {
    global $wpdb;
    return $wpdb->get_results( "SELECT p.* FROM {$wpdb->posts} p, {$wpdb->usermeta} u"
                                ." WHERE    p.post_type     = \'post\'"
                                ." AND      p.post_status   = \'publish\'"
                                ." AND      u.user_id       = p.`post_author`"
                                ." AND      u.meta_key      = \'wp_capabilities\'"
                                ." AND      u.meta_value    LIKE \'%\\"{$role}\\"%\'" );
}
只有作者具有指定角色时,此函数才会返回帖子。它已经过测试,正在我的本地安装3.4上运行,但如果您有任何问题,请告诉我。

我希望这有帮助。

示例用法:

$posts = get_posts_by_author_role(\'author\');
foreach($posts as $post) echo $post->post_title, \'<br />\';

SO网友:Bainternet

试试这个

创建一个函数来更改查询的where子句:

function authors_where_filter( $where ) {
        global $wpdb;
        $ids = get_users(array(\'role\' => \'author\' ,\'fields\' => \'ID\'));
        $where .= " AND post_author IN ($ids)";
        return $where;
}
然后在查询之前,只需挂接它,例如:

add_filter(\'posts_where\',\'authors_where_filter\');
$all_posts = new WP_Query(array(\'posts_per_page\' => -1 .....
remove_filter(\'posts_where\');
您应该在一个查询中获取作者用户的所有帖子(实际上有两个,一个是获取用户,另一个是获取帖子)

SO网友:Trekdrop

首先使用函数按角色获取用户id:

function author_ids_by_role() {
        $ids = get_users(array(\'role\' => \'author\' ,\'fields\' => \'ID\'));
        return $ids;
}
然后,在查询中,可以使用此用户id数组,如下所示:

$role_ids = author_ids_by_role();
    $args = array(
      "post_count"      => -1, 
      "posts_per_page"  => 10,
      "post_type"       => "my_custom_posttype",
      "author__in"      => $role_ids
    );
如果要按当前用户的角色查询帖子。请改用以下函数:

function author_ids_by_role() {
        global $current_user;

        $user_roles = $current_user->roles;
        $user_role = array_shift($user_roles);

        $ids = get_users(array(\'role\' => $user_role ,\'fields\' => \'ID\'));

        return $ids;
}
请注意,只有当用户只有1个角色时,最后一个函数才起作用。

SO网友:OriginalEXE

您可以通过部署功能使用角色和能力检查:

current_user_can( $capability );
例如:

if(current_user_can(\'read\') && !current_user_can(\'edit_posts\')){
//code for subscribers...
}
else if(current_user_can(\'edit_posts\') && !current_user_can(\'edit_pages\')){
//code for authors...
}
else if(current_user_can(\'edit_pages\') && !current_user_can(\'delete_themes\')){
//code for editors....
}
else {
//code for admins...
}
如果您为超级管理员使用多站点,您将有一个更多的检查。

请注意,您必须使用两个检查,因为如果没有其他检查,一些用户将得到多个queryyes。

结束

相关推荐