web-dev-qa-db-ja.com

バックエンドのページへのアクセスを制限する

ページの編集をバックエンドから特定のユーザーだけに制限するにはどうすればよいですか?

私はいくつかのプラグインを試してみましたが、私はプラグインなしでそれを行うことが私のための方法であると思いました。

これを解決するためにどのような対策を講じることができますか?

3
Sankalp Mishra

これは2段階で行うことができます。まず、目的のページが他のユーザーに表示されないようにするために、ページ/wp-admin/edit.php?post_type=pageにフックを追加します。そして、許可されていないユーザーがページに直接アクセスしようとするのを/wp-admin/post.php?post=ID&action=editにリダイレクトするためのもう1つのフック。

ここでは投稿タイプはpageですが、他のものに変更することができます。コメントに示されている調整を行います。

/**
 * Adjust the following:
 * post_type
 * User ID
 * Post ID
 */

add_action( 'load-edit.php', 'load_custom_filter_wpse_94387' );
add_action( 'load-post.php', 'block_page_access_wpse_94387' );

/**
 * Executed only in /wp-admin/edit.php
 *
 * Checks current post type and bail if not correct
 */
function load_custom_filter_wpse_94387()
{
    global $typenow;

    // Not the correct post type, do nothing
    if( 'page' != $typenow ) // <--- adjust
        return;

    add_filter( 'posts_where' , 'posts_where_wpse_94387' );
}

/**
 * If not authorized user, remove page from listing
 */
function posts_where_wpse_94387( $where ) 
{
    $current_user = wp_get_current_user();

    if ( 2 == $current_user->ID ) // <--- adjust
        return $where;

    $where .= ' AND ID != 119'; // <--- adjust
    return $where;
}

/**
 * Check if unauthorized user is trying to access restricted page
 */
function block_page_access_wpse_94387()
{
    // Check for post=119, if it is not this one, do nothing
    if( !isset( $_GET['post'] ) || '119' != $_GET['post'] ) // <--- adjust
        return;

    // Check for user, if allowed user, do nothing
    $current_user = wp_get_current_user();  
    if ( 2 == $current_user->ID ) // <--- adjust
        return;

    // Invalid attempt to edit the page, redirect
    wp_redirect( admin_url( 'edit.php?post_type=page' ) );
    exit();
}

関連するQ&A:
- 私のコードを置く場所:plugin or functions.php?
- 管理インターフェースの投稿数(公開済み、下書き、未添付)を更新しました

2
brasofilo