私の質問はワードプレスのユーザーアクセス制御についてです
Admin(adminアクセス)とuser1(編集者)の2人のユーザーがいます。私の要件は、管理者が管理サイトで任意の変更を行うことができるということです。しかし、user1は一部のページのみを編集および更新でき、割り当てられたページ以外の他のアクセスにはアクセスできません。
この機能を実装する方法がわからないので、あなたの助けが必要ですか?
私の職場環境:
非常に興味深い質問です。それはよりきめ細かいので、それは典型的なロール/機能機能の範囲から少し外れています(私が間違っているのでなければ - 非常に可能です)。
最初のステップは、ユーザーが編集できる投稿を割り当てることができるという点で、ある種の方法を置くことです。
ユーザーのプロフィールページをそのまま使用するのが最も理にかなっています。それで、あなたは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に組み込まれているロールと機能を使用して、これを少し簡単にする方法があるかもしれません。これが全部です - プラグインとして 。
わかりました、古い質問です。しかし、解決策はすでにWPコアにあります。 User1がページを読まないようにもしたくない限り、彼には編集権限がありません。その場合、あなたは役割/アクセス管理システム、例えば受け入れられた答えのコードや wordpress pluginsディレクトリからのプラグイン を必要とするでしょう。
editingを防止するだけの場合は、User1を(Editorではなく)Authorに設定すると、自分のコンテンツのみを編集できます。あなたが(管理者として)あなたが作成したばかりのページまたは投稿の「著者」としてUser1を設定した場合(通常は編集画面の一番下にあります)、User1はそれを編集することができます。管理者としてページを作成し、作成者を "User1"に設定して、User1にそのページへの編集アクセス権を付与することができます。
もちろん、私が言ったように、あなたがUser1から他の投稿/ページを完全に隠したいのであれば、これは無関係です。
あなたはJustin Tadlockの Members または Role Scoperプラグイン のようなプラグインを使うことができ、それらはあなたが管理者のためのすべての機能と編集者のロール(そしてそのことに関する他のロール)をカスタマイズできます。自分の役割を機能で定義することもできます。