允许特定用户编辑特定页面

时间:2019-07-15 作者:Jesper

我试图制作一个脚本,只允许特定用户编辑特定页面,但没有任何成功。

背后的想法是,如果用户用户名包含特定单词,则允许他们编辑特殊页面。

我尝试过这样做,授予特定用户一个特殊功能,然后在打开特殊页面时检查该功能。

这是我的代码:

add_action( \'admin_init\', function() {
    $current_user = wp_get_current_user();
    $user_login = $current_user->data->user_login;

    if( strpos($user_login, \'@special-domain.com\') !== false ) {
        $user = new WP_User($current_user->ID);
        $user->add_cap(\'edit_special_page\');
    }
});

add_filter( \'map_meta_cap\', function( $caps, $cap, $user_id, $args ) {
    if ( \'edit_page\' == $cap && user_can( $user_id, \'edit_special_page\' ) )
    {
        $post_id = $args[0];
        $special_page_id = get_page_by_path(\'special-page\') ? get_page_by_path(\'special-page\')->ID : null;

        if ( special_page_id == $post_id ) {
            $caps = [];
            $caps[] = \'edit_special_page\';
        }
    }
    return $caps;
}, 10, 4 );
但所有用户仍然可以编辑到特殊页面,这应该只适用于具有特殊域的用户。com的用户名。我还尝试使用post-id 直接代替$special_page_id, 但结果是一样的。

你知道这为什么不起作用,怎么做吗?

附言:我是NOT 对任何类型的插件都感兴趣。

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

问题是map_meta_cap 将授予所有用户执行该操作的权限,因为这与“不需要任何功能”的说法基本相同。你真正想做的就是添加edit_special_page 现有所需功能列表:

add_filter( \'map_meta_cap\', function( $caps, $cap, $user_id, $args ) {
    if ( \'edit_post\' === $cap || \'edit_page\' === $cap ) {
        $current_page_id = $args[0];
        $special_page_id = get_page_by_path( \'special-page\' ) ? get_page_by_path( \'special-page\' )->ID : null;

        // If the page being edited is the special page...
        if ( $special_page_id === $current_page_id ) {
            // ... the user must have the edit_special_page capability.
            $caps[] = \'edit_special_page\';
        }
    }

    return $caps;
}, 10, 4 );
一个不相关的问题,但您需要解决的是,您不应该在上面添加功能admin_initinit. 添加功能会写入数据库,因此只有在插件/主题激活或用户注册时才能执行以下操作:

add_action( \'user_register\', function( $user_id ) {
    $user = get_userdata( $user_id );

    if ( strpos( $user->user_login, \'@special-domain.com\' ) !== false ) {
        $user->add_cap( \'edit_special_page\' );
    }
} );