web-dev-qa-db-ja.com

そのクライアントの別のカスタムユーザーロール(従業員)を作成できるカスタムユーザーロール(クライアント)を作成する

ちょっとした質問ですが、この状況は他の状況の他の人にも起こると思います。

当社では、clientname__のカスタムユーザーロールでユーザーアカウントを作成できるEmployee Assistance Program MUサブディレクトリネットワークサイトを作成する必要があります。

clientname__は、会社の従業員に対して会社のEAPサービスを使用する必要がある別の会社になります。

clientname__は、MUネットワークサイト管理者にログインし、従業員のemployeename__ユーザーロールを持つユーザーアカウントを追加できる必要があります。

これらのemployeename__アカウントは、フロントエンドにログインし、制限されたEAPコンテンツを表示できます。

employeename__ユーザーロールの場合、 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を指定する必要はありませんか?

clientname__には、次のものがあります。

$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
    )
);

clientname__アカウントは、その個々のemployeename__アカウントによって作成されたclientname__アカウントのみを編集および削除でき、他社のemployeename__アカウントは編集できないようにする必要があります。

employeename__ユーザーロールに隠しカスタムフィールドを追加できます。これはclientID(clientname__がemployeename__を作成するときに追加されます)になり、このカスタムフィールドはemployeename__ロールで編集できません。

非表示のカスタムフィールドをカスタムユーザーロールに追加する方法を検索しましたが、解決策が見つかりませんでした。

だから、私の質問は次のとおりです。

  1. clientIDname__という非表示のカスタムフィールドをカスタムユーザーロール(employeename__)に追加するにはどうすればよいですか?
  2. clientname__がemployeename__を作成するときに、クライアントのユーザーIDまたはユーザー名(どちらが最適かは不明)が新しいemployeename__のclientIDname__メタフィールドに追加されるようにするにはどうすればよいですか?
  3. clientname__がemployeename__アカウントのみを編集または削除できるようにするにはどうすればよいですか(他の標準ユーザーアカウントはできません)?
  4. 3を拡張すると、clientname__がemployeename__アカウントがemployeename__のclientIDname__自身のユーザーIDまたはユーザー名を持っている場合に、clientname__アカウントのみを編集および削除できるようになります。

ありがとう。

6
Steve

クライアントは管理者によって追加されます、クライアントはフィルタリングを容易にする従業員と親子関係を持ちます。だから私たちがする必要があるのは、従業員とは関係のないものをすべて削除し、特定のメタ値を持つ従業員をフィルタリングすることです。

まず最初に、新しいユーザーが私たちの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として割り当てられた親を持つ従業員のみを表示および編集できます。

6
Howdy_McGee