ちょっとした質問ですが、この状況は他の状況の他の人にも起こると思います。
当社では、client
name__のカスタムユーザーロールでユーザーアカウントを作成できるEmployee Assistance Program MUサブディレクトリネットワークサイトを作成する必要があります。
client
name__は、会社の従業員に対して会社のEAPサービスを使用する必要がある別の会社になります。
client
name__は、MUネットワークサイト管理者にログインし、従業員のemployee
name__ユーザーロールを持つユーザーアカウントを追加できる必要があります。
これらのemployee
name__アカウントは、フロントエンドにログインし、制限されたEAPコンテンツを表示できます。
employee
name__ユーザーロールの場合、 code here を使用して、テーマのfunctions.php
を作成します。
$result1 = add_role( 'employee', __('Employee'),
array(
'edit_users' => false,
'create_users' => false,
'delete_users' => false,
'read' => true,
'edit_posts' => false,
'edit_pages' => false,
'edit_others_posts' => false,
'create_posts' => false,
'manage_categories' => false,
'publish_posts' => false,
'edit_themes' => false,
'install_plugins' => false,
'update_plugin' => false,
'update_core' => false
)
};
Trueを指定するだけで済み、falseを指定する必要はありませんか?
client
name__には、次のものがあります。
$result2 = add_role( 'client', __('Client Company Admin'),
array(
'edit_users' => true,
'create_users' => true,
'delete_users' => true,
'read' => true,
'edit_posts' => false,
'edit_pages' => false,
'edit_others_posts' => false,
'create_posts' => false,
'manage_categories' => false,
'publish_posts' => false,
'edit_themes' => false,
'install_plugins' => false,
'update_plugin' => false,
'update_core' => false
)
);
各client
name__アカウントは、その個々のemployee
name__アカウントによって作成されたclient
name__アカウントのみを編集および削除でき、他社のemployee
name__アカウントは編集できないようにする必要があります。
employee
name__ユーザーロールに隠しカスタムフィールドを追加できます。これはclient
ID(client
name__がemployee
name__を作成するときに追加されます)になり、このカスタムフィールドはemployee
name__ロールで編集できません。
非表示のカスタムフィールドをカスタムユーザーロールに追加する方法を検索しましたが、解決策が見つかりませんでした。
だから、私の質問は次のとおりです。
clientID
name__という非表示のカスタムフィールドをカスタムユーザーロール(employee
name__)に追加するにはどうすればよいですか?client
name__がemployee
name__を作成するときに、クライアントのユーザーIDまたはユーザー名(どちらが最適かは不明)が新しいemployee
name__のclientID
name__メタフィールドに追加されるようにするにはどうすればよいですか?client
name__がemployee
name__アカウントのみを編集または削除できるようにするにはどうすればよいですか(他の標準ユーザーアカウントはできません)?client
name__がemployee
name__アカウントがemployee
name__のclientID
name__自身のユーザーIDまたはユーザー名を持っている場合に、client
name__アカウントのみを編集および削除できるようになります。ありがとう。
クライアントは管理者によって追加されます、クライアントはフィルタリングを容易にする従業員と親子関係を持ちます。だから私たちがする必要があるのは、従業員とは関係のないものをすべて削除し、特定のメタ値を持つ従業員をフィルタリングすることです。
まず最初に、新しいユーザーが私たちのCMSの admin 側に登録されるときはいつでも、私たちはそれを現在のユーザーの親に割り当てます。
/**
* Admin New Employee Function
* @var int $user_id
* @return void
*/
function client_register( $user_id ) {
if( ! is_admin() ) {
return;
}
// Grab the current user
$current_user = wp_get_current_user();
// IF the current user ID isn't 0 and our current user is a 'client' role
if( $current_user->ID && in_array( 'client', $current_user->roles ) ) {
// Update the new user with a 'parent' usermeta value of the current 'client'
update_user_meta( $user_id, '_user_parent', $current_user->ID );
}
}
add_action( 'user_register', 'client_register' );
素晴らしい、だから今、クライアントが(どんなタイプの)新しいユーザーを作成するときはいつでも、それはどのクライアントがそれを作成したかの親を割り当てられるでしょう。今度は、クライアントの親usermetaを持つユーザーのみを表示するようにユーザーテーブルをフィルタリングする必要があります。
/**
* Pre Get Users filter
* @var WP_Query Object $query
* @return void
*/
function theme_pgu( $query ) {
if( ! is_admin() ) {
return;
}
// Grab our current user
$current_user = wp_get_current_user();
// IF our user ID is not 0 and our current user has a role of 'client'
if( $current_user->ID && in_array( 'client', $current_user->roles ) ) {
// Set the query to only return employee roles
$query->set( 'role', 'employee' );
// Which has a usermeta key '_user_parent' set
$query->set( 'meta_key', '_user_parent' );
// and has a usermeta value of the current client user
$query->set( 'meta_value', $current_user->ID );
}
}
add_action( 'pre_get_users', 'theme_pgu' );
きちんと!これで、クライアントがあらゆるタイプのロールを作成できるという問題に対処できるため、クリーンアッププロセスに進みます。以下は、新しいユーザーを作成するとき、または現在のユーザーをemployee
のみに編集するときに選択可能なロールを削除します。
/**
* Selectable roles on the new user and user edit screen
* @var Multi-dimensional Array $roles
* @return Array $roles
*/
function client_sel_roles( $roles ) {
// Grab our current user
$current_user = wp_get_current_user();
if( in_array( 'client', $current_user->roles ) ) {
$roles = array( 'employee' => $roles['employee'] );
}
return $roles;
}
add_filter( 'editable_roles', 'client_sel_roles' );
All Users
スクリーンでは、フィルタビューがまだ他のユーザロールを示しているのを見ることができるので、それも修正する必要があります:
/**
* All Users screen filterable views
* @var Array $views
* @return Array $views
*/
function client_user_views( $views ) {
// Grab our current user
$current_user = wp_get_current_user();
if( in_array( 'client', $current_user->roles ) ) {
if( isset( $views['employee'] ) ) {
$views = array( 'employee' => $views['employee'] );
} else {
$views = array();
}
}
return $views;
}
add_filter( 'views_users', 'client_user_views' );
最後に、1つの見落としは、ユーザーcouldが自分の従業員ではない可能性がある他のユーザーのプロファイルを表示するためにURLを変更する可能性があるためです。
/**
* Stop clients from changing the URL to get to other profiles
* @var WP_Screen Object $screen
* @return void
*/
function edit_employees_only( $screen ) {
// Check if we're on the correct screen
if( 'user-edit' === $screen->base ) {
// Ensure our desired user ID is set
if( isset( $_GET['user_id'] ) && is_numeric( $_GET['user_id'] ) ) {
$user_id = absint( $_GET['user_id'] );
$current_user = wp_get_current_user();
$parent = get_user_meta( $user_id, '_user_parent', true );
// Ensure that we're viewing a profile that is not our own
if( $current_user->ID && in_array( 'client', $current_user->roles ) && $user_id !== $current_user->ID && $parent !== $current_user->ID ) {
// We're viewing an incorrect profile - redirect to clients own profile
wp_redirect( admin_url( "user-edit.php?user_id={$current_user->ID}" ) );
}
}
}
}
add_action( 'current_screen', 'edit_employees_only' );
そしてそれはそれをするべきです。クライアントロールは、IDとして割り当てられた親を持つ従業員のみを表示および編集できます。