我是否可以创建可以访问*一些其他用户帖子而不是所有其他用户帖子的用户?

时间:2018-03-26 作者:AdamJones

我已经在一个多用户WP网站上使用了一段时间的基本用户权限功能,效果很好,大多数用户帐户只能访问自己的帖子,但少数“编辑”可以访问每个人的帖子。这一点得到了wp front插件的帮助,该插件允许您轻松定义用户角色。

然而,我现在有一个场景,在这个场景中,我需要在同一家外部公司有多个作者,同时在该公司还有一名编辑,负责监督其他个人的工作。

这个新的远程编辑器角色是一个新的问题,因为他们需要能够看到自己的帖子以及同一公司其他编辑器创建的任何帖子。但他们不能看到每个人的帖子。

使用wp front或任何其他插件,或者仅仅通过插件之外的手工解决方案,这是可能的吗?

理想情况下,一个解决方案可以通过将用户集合添加到某种类型的组中来工作,但不必这样做。

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

这是我的方法。请记住,它涵盖了您描述的基本需求,但可以很容易地扩展为更健壮的解决方案。需要遵循的步骤很少(所有代码都会转到functions.php):

1。将公司名称另存为user meta

我们需要做的第一件事是为用户指定一个公司名称-我会使用user meta来实现这一点。您可以添加一个元盒来编辑用户屏幕以便于管理,我这里不包括这方面的代码,但我相信您会明白这一点。

对于测试,您只需使用向用户添加meta即可update_user_meta( $user_id, \'company\', \'Tyrell Corporation\' ); (codex)

所以在这个例子中,我假设我们有一群作者Tyrell Corporation 设置为company 用户元键和编辑器具有完全相同的元。

2。根据作者的用户meta将公司meta添加到帖子中,为了让事情变得更简单、更便宜,我会在任何作者保存的每个帖子中保留对公司名称的引用,并指定公司(这样,我们可以在以后每次检查编辑器编辑帖子的权限时,至少取消对author meta表的一个查询)。为此,我使用save_post hook:

function save_company_meta( $post_id, $post, $update ) {
    // get author\'s company meta
    $company = get_user_meta( $post->post_author, \'company\', true );

    if ( ! empty( $author_id ) ) {
        // add meta data to the post
        update_post_meta( $post_id, \'company\', true );
    }
}

add_action( \'save_post\', \'save_company_meta\', 10, 3 );
现在,每当用户保存其草稿时,分配给该用户的公司名称就会复制到post meta。

3。地图编辑器的edit\\u post功能map 编辑器的“edit\\u post”功能。如果帖子company 元数据与编辑器的不同company 用户meta,我们可以从特定的编辑器中删除编辑此特定帖子的功能。下面的代码中还有一些附加条件,例如,如果帖子没有company meta或不是post 岗位类型。您可以根据自己的需要进行调整:

function restrict_access_to_company_posts( $caps, $cap, $user_id, $args ) {

    /*
    We\'re messing with capabilities only if \'edit_post\' 
    is currently checked and the current user has editor role
    but is not the administrator
    */

    if ( ! in_array( $cap, [ \'edit_post\' ], true ) ) {
        return $caps;
    }

    if ( ! user_can( $user_id, \'editor\' ) || user_can( $user_id, \'administrator\' ) ) {
        return $caps;
    }

    /*
    $args[0] holds post ID. $args var is a bit enigmatic, it contains
    different stuff depending on the context and there\'s almost 
    no documentation on that, you\'ve got to trust me on this one :)
    Anyways, if no post ID is set, we bail out and return default capabilities
    */
    if ( empty( $args[0] ) ) {
        return $caps;
    }

    /*
    You can also make sure that you\'re restricting access 
    to posts only and not pages or other post types
    */
    if ( \'post\' !== get_post_type( $args[0] ) ) {
        return $caps;
    }

    $post_company   = get_post_meta( $args[0], \'company\', true );
    $editor_company = get_user_meta( $user_id, \'company\', true );

    /*
    if no meta data is set or editor is assigned 
    to the same company as the post, we allow normal editing
    */
    if ( empty( $post_company ) || $post_company === $editor_company ) {
        return $caps;
    }

    // finally, in all other cases, we restrict access to this post
    $caps = [ \'do_not_allow\' ];

    return $caps;
}
这不会从管理UI中完全隐藏帖子,您仍然可以在列表中看到它们,但编辑器无法进入帖子的编辑屏幕进行更改,也无法查看草稿(WordPress将自动删除所有“编辑”链接,也可以在前端的管理栏中删除)。帖子发布后,编辑仍无法编辑帖子内容。

4。(可选)从管理员列表中完全删除帖子如果以上内容仍然不够,您还可以连接到pre_get_posts (codex) 要从管理员列表中完全隐藏帖子,请执行以下操作:

function query_company_posts_only( $query ) {

    if ( ! is_admin() || empty( get_current_user_id() ) ) {
        return $query;
    }

    $editor_company = get_user_meta( get_current_user_id(), \'company\', true );

    if ( empty( $editor_company ) ) {
        return $query;
    }

    $query->set( \'meta_key\', \'company\' );
    $query->set( \'meta_value\', $editor_company );
}

add_action( \'pre_get_posts\', \'query_company_posts_only\', 10, 1 );
希望这能起到作用,就玩玩它,在这里和那里添加一些改进。

SO网友:Clemens Tolboom

由于你现在在同一家公司有两个职位,我会选择https://wordpress.org/plugins/groups/

集成可分配给组和用户的标准WordPress功能

SO网友:EarlM

我认为这个插件应该满足您的需求:

https://de.wordpress.org/plugins/hide-this/

结束