特定用户对WordPress中特定页面的访问权限

时间:2011-10-04 作者:w3uiguru

我的问题是关于wordpress中的用户访问控制

我有两个用户-admin(admin访问)和user1(editor)。我的要求是管理员可以在管理网站做任何修改。但user1只能编辑和更新某些页面,不能访问除指定页面之外的其他访问权限。

我不知道如何实现此功能,因此需要您的帮助?

我的工作环境:

wordpress 3.2.1版主题是210

2 个回复
SO网友:chrisguitarguy

非常有趣的问题。这有点超出了典型转鼓/能力功能的范围,因为它更细粒度(除非我错了——很可能)。

第一步是以某种方式分配用户可以编辑的帖子。

粘贴用户的个人资料页面最有意义。这样你就可以edit_user_profile, 获取网站上的所有页面,并将其粘贴在多选框中。代码注释应该一步一步地解释一下。edit_user_profile 仅在编辑其他用户的配置文件时显示。

<?php
add_action( \'edit_user_profile\', \'wpse30211_user_profile\' );
function wpse30211_user_profile( $user )
{
    // only show this on editor pages
    if( ! in_array( \'editor\', $user->roles ) ) return;

    // get the pages.
    $pages = get_posts(
        array(
            \'post_type\'     => \'page\',
            \'numberposts\'   => -1,
            \'post_status\'   => \'any\',
        )
    );

    // Bail if we don\'t have pages.
    if( ! $pages ) return;

    // Which pages can our user edit?
    $allowed = get_user_meta( $user->ID, \'wpse30211_pages\', true );
    if( ! is_array( $allowed ) || empty( $allowed ) ) $allowed = array();

    // nonce-i-fy things
    wp_nonce_field( \'wpse30211_nonce\', \'wpse30211_nonce\' );

    // section heading...
    echo \'<h3>\' . __( \'Grant this User permission to edit...\' ) . \'</h3>\';
    echo \'<select multiple="multiple" name="wpse30211[]">\';
    echo \'<option value="0">None</option>\';
    foreach( $pages as $p )
    {
        // for use in checked() later...
        $selected = in_array( $p->ID, $allowed ) ? \'on\' : \'off\';
        echo \'<option \' . selected( \'on\', $selected, false ) . \' value="\' . esc_attr( $p->ID ) . \'">\' . esc_html( $p->post_title ) . \'</option>\';
    }
    echo \'</select>\';
}
接下来,您需要保存添加到人员配置文件中的额外数据。要做到这一点,你必须edit_user_profile_update. 验证上述函数中的nonce设置,然后检查wpse30211 字段已设置并使用update_user_meta.

<?php
add_action( \'edit_user_profile_update\', \'wpse30211_user_save\' );
function wpse30211_user_save( $user_id )
{
    // verify our nonce
    if( ! isset( $_POST[\'wpse30211_nonce\'] ) || ! wp_verify_nonce( $_POST[\'wpse30211_nonce\'], \'wpse30211_nonce\' ) )
        return;

    // make sure our fields are set
    if( ! isset( $_POST[\'wpse30211\'] ) ) 
        return;

    $save = array();
    foreach( $_POST[\'wpse30211\'] as $p )
    {
        $save[] = $p;
    }
    update_user_meta( $user_id, \'wpse30211_pages\', $save );
}
现在有趣的部分是:禁止访问某些页面。要做到这一点,你可以load-post.php, 什么时候开火wp-admin/post.php, 加载后期编辑屏幕。抓取正在编辑的帖子id,检查以确保它是一个页面。然后,使用wp_get_current_user 并获取允许编辑的页面get_user_meta. 如果当前帖子ID不在允许编辑的页面数组中,请调用wp_die 并删除页面。

<?php
add_action( \'load-post.php\', \'wpse30211_kill_edit\' );
function wpse30211_kill_edit()
{
    $post_id = isset( $_REQUEST[\'post\'] ) ? absint( $_REQUEST[\'post\'] ) : 0;
    if( ! $post_id ) return;

    // bail if this isn\'t a page
    if( \'page\' !== get_post_type( $post_id ) ) return;

    $user = wp_get_current_user();
    $allowed = get_user_meta( $user->ID, \'wpse30211_pages\', true );
    if( ! is_array( $allowed ) || empty( $allowed ) ) $allowed = array();

    // if the user can\'t edit this page, stop the loading...
    if( ! in_array( $post_id, $allowed ) )
    {
        wp_die( 
            __( \'User cannot edit this page\' ),
            __( "You can\'t edit this post" ),
            array( \'response\' => 403 )
        );
    }
}
最后,你可以pre_update_post 并阻止用户无法编辑页面的更新。

<?php
add_action( \'pre_post_update\', \'wpse30211_stop_update\' );
function wpse30211_stop_update( $post_id )
{
    // not a page? bail.
    if( \'page\' !== get_post_type( $post_id ) ) return;

    $user = wp_get_current_user();
    $allowed = get_user_meta( $user->ID, \'wpse30211_pages\', true );
    if( ! is_array( $allowed ) || empty( $allowed ) ) $allowed = array();

    if( ! in_array( $post_id, $allowed ) ) 
    {
        wp_die( 
            __( \'User cannot edit this page\' ),
            __( "You can\'t edit this post" ),
            array( \'response\' => 403 )
        );
    }
}
上述方法可行,但我怀疑有一种方法可以更轻松地使用WP的内置角色&;能力。事情是这样的as a plugin.

SO网友:gloria

好的,老问题;但解决方案已经存在于WP核心中。除非您还想阻止User1阅读页面,否则他没有编辑权限。在这种情况下,您需要一个角色/访问管理系统,例如接受答案中的代码或来自wordpress plugins directory.

如果您只想阻止编辑:设置为作者(而不是编辑器)的用户1将只能编辑自己的内容。如果您(作为管理员)将User1设置为刚刚创建的页面或帖子的“作者”(通常位于编辑屏幕的底部),User1将能够对其进行编辑。您可以将页面创建为Admin,并将author设置为“User1”,从而授予User1对页面的编辑权限。

当然,正如我所说,如果您想对User1完全隐藏其他帖子/页面,那么这是不相关的。

结束

相关推荐