是否将具有特定分类的帖子的编辑限制为具有匹配的元值的用户?

时间:2021-08-17 作者:armadadrive

我需要限制用户编辑自定义帖子类型,因为这些类型没有分类法或自定义元数据与WP用户元数据中的隐藏值相匹配。

我们已经创建了一个自定义的职位类型,它是组织的个人资料。该组织的特定用户将拥有自己的网站登录,并且应该能够编辑其组织的帖子和/或具有相同分类法的任何其他自定义帖子类型。

常见的情况是,我们有一个组织ID,该ID与帖子中的值相匹配(我们可以将其设置为元字段或分类法),并且当用户的帐户通过流行的CRM单点登录插件创建时,该ID是用户配置文件元的一部分。

示例场景:

用户A使用SSO插件登录网站。作为其中的一部分,commonOrganization ID作为元值存储在其WP用户配置文件中。他们是第一个登录的用户,因此我们的代码查询CRM\'sAPI以获取组织信息,并以编程方式创建组织类型的acustom帖子。

用户B使用SSO插件登录网站。他们是上述相同组织的一部分。我们的代码看到一个组织类型的职位with that Organization ID 已存在,因此它跳过创建它的尝试。

用户A和B都应该能够编辑与其组织ID匹配的自定义帖子。他们最终可能会创建(并且应该共享)具有相同ID的其他自定义帖子。他们应该不能在该(或任何)自定义帖子类型中看到任何其他人的帖子。

是否可以将多个用户限制为只能编辑一篇(或多篇)用户具有与自定义帖子的自定义分类法或元键匹配的自定义元键的帖子?

我看到过这样的建议;为每个用户组创建自定义帖子类型,并使用类似插件的用户角色编辑器对其进行限制;但我不能这样做,因为我们在这个特定的网站上有成千上万的成员,这将是非常笨拙的。

在这种情况下,我无法提供代码,因为我只是想了解WordPress、CPT UI、ACF和一些优秀的老式PHP函数中可能存在的机制。php可以实现这一点。我应该补充一点,我们并不担心前端,因为页面模板条件可以很容易地处理这一点,我需要的只是管理/仪表板方面的东西。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

有没有可能限制多个用户只能编辑APAST(或post),其中这些用户的自定义元密钥与自定义post的自定义分类法或元密钥相匹配?

是的,您可以使用user_has_capcurrent_user_can()user_can() 调用-这两个函数用于检查当前用户或特定用户是否有权限执行诸如编辑帖子、删除条款、更改网站选项等操作。

下面是一个工作示例,使用capability_type 设置为org_profile 这也是柱状段塞:

Note: 更换org_profile 使用正确的立柱类型,org_id 使用正确的元密钥organization 使用正确的分类法slug,如果用户元存储术语ID而不是slug或name,请确保将整数传递给has_term(), e、 g。has_term( (int) $user_org_id, ... ). (注:如果删除注释,函数实际上非常简单。)

add_filter( \'user_has_cap\', \'wpse_393410\', 10, 4 );
function wpse_393410( $allcaps, $caps, $args, $user ) {
    /* With the following, and assuming the current user\'s ID is 123:
        current_user_can( \'edit_post\', 456 );
        user_can( 123, \'edit_post\', 456 );

       $args would be array( \'edit_post\', 123, 456 ).
       i.e. array( \'edit_post\', <user ID>, <post ID> )
     */

    if ( ! empty( $args[2] ) && \'edit_post\' === $args[0] &&
        \'org_profile\' === get_post_type( $args[2] )
    ) {
        // If the current user does NOT have any of the roles in the include list, we
        // do nothing.
        $include = array( \'org_user\' );
        if ( empty( array_intersect( (array) $user->roles, $include ) ) ) {
            return $allcaps;
        }

        $user_org_id = get_user_meta( $args[1], \'org_id\', true );

        // If the user meta is empty, we do nothing. Else, check if the post has a term
        // with the same SLUG OR NAME in the \'organization\' taxonomy.
        // Note: We just need to disable one of the caps (in $caps).
        if ( $user_org_id && ! has_term( $user_org_id, \'organization\', $args[2] ) ) {
            $allcaps[ $caps[0] ] = false;
        }
    }

    return $allcaps;
}
如果要使用post meta,请替换此:

$user_org_id = get_user_meta( $args[1], \'org_id\', true );

// If the user meta is empty, we do nothing. Else, check if the post has a term
// with the same SLUG OR NAME in the \'organization\' taxonomy.
// Note: We just need to disable one of the caps (in $caps).
if ( $user_org_id && ! has_term( $user_org_id, \'organization\', $args[2] ) ) {
    $allcaps[ $caps[0] ] = false;
}
使用此选项:

$user_org_id = get_user_meta( $args[1], \'org_id\', true );
$post_org_id = get_post_meta( $args[2], \'org_id\', true );

// If the post OR user meta is empty, we do nothing. Else, check if the post meta
// matches the user meta.
// Note: We just need to disable one of the caps (in $caps).
if ( $post_org_id && $user_org_id && $user_org_id !== $post_org_id ) {
    $allcaps[ $caps[0] ] = false;
}
此外,在上述函数中,我使用了一个包含列表($include), 但如果您愿意,可以使用排除列表,例如:。$exclude = array( \'administrator\', \'custom\' ); 然后做! empty( array_intersect( $roles, $exclude ) ).

相关推荐