web-dev-qa-db-ja.com

特定のユーザーのためのワードプレスの特定のページへのアクセス

私の質問はワードプレスのユーザーアクセス制御についてです

Admin(adminアクセス)とuser1(編集者)の2人のユーザーがいます。私の要件は、管理者が管理サイトで任意の変更を行うことができるということです。しかし、user1は一部のページのみを編集および更新でき、割り当てられたページ以外の他のアクセスにはアクセスできません。

この機能を実装する方法がわからないので、あなたの助けが必要ですか?

私の職場環境:

  1. ワードプレスv 3.2.1
  2. テーマは20です
2
w3uiguru

非常に興味深い質問です。それはよりきめ細かいので、それは典型的なロール/機能機能の範囲から少し外れています(私が間違っているのでなければ - 非常に可能です)。

最初のステップは、ユーザーが編集できる投稿を割り当てることができるという点で、ある種の方法を置くことです。

ユーザーのプロフィールページをそのまま使用するのが最も理にかなっています。それで、あなたは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に組み込まれているロールと機能を使用して、これを少し簡単にする方法があるかもしれません。これが全部です - プラグインとして

3
chrisguitarguy

わかりました、古い質問です。しかし、解決策はすでにWPコアにあります。 User1がページを読まないようにもしたくない限り、彼には編集権限がありません。その場合、あなたは役割/アクセス管理システム、例えば受け入れられた答えのコードや wordpress pluginsディレクトリからのプラグイン を必要とするでしょう。

editingを防止するだけの場合は、User1を(Editorではなく)Authorに設定すると、自分のコンテンツのみを編集できます。あなたが(管理者として)あなたが作成したばかりのページまたは投稿の「著者」としてUser1を設定した場合(通常は編集画面の一番下にあります)、User1はそれを編集することができます。管理者としてページを作成し、作成者を "User1"に設定して、User1にそのページへの編集アクセス権を付与することができます。

もちろん、私が言ったように、あなたがUser1から他の投稿/ページを完全に隠したいのであれば、これは無関係です。

2
gloria

あなたはJustin Tadlockの Members または Role Scoperプラグイン のようなプラグインを使うことができ、それらはあなたが管理者のためのすべての機能と編集者のロール(そしてそのことに関する他のロール)をカスタマイズできます。自分の役割を機能で定義することもできます。

1
user2015