web-dev-qa-db-ja.com

現在のユーザーが管理者または編集者の場合

現在ログインしているユーザーが管理者か編集者かを確認するにはどうすればよいですか。

私はそれぞれを個別に行う方法を知っています。

<?php if(current_user_can('editor')) { ?> 
    <!-- Stuff here for editors -->
<?php } ?>

<?php if(current_user_can('administrator')) { ?>
    <!-- Stuff here for administrators -->
<?php } ?>

しかし、私はどのようにそれらを一緒に働かせるのですか?つまり、ユーザーは管理者または編集者ですか?

90
andy

最初の答えは、WordPress関連ではありません。これは単なるPHPであるためです。論理 "OR"演算子を使用します。

<?php if( current_user_can('editor') || current_user_can('administrator') ) {  ?>
    // Stuff here for administrators or editors
<?php } ?>

3つ以上の役割を調べたい場合は、現在のユーザーの役割が一連の役割の中にあるかどうかを確認できます。

$user = wp_get_current_user();
$allowed_roles = array('editor', 'administrator', 'author');
<?php if( array_intersect($allowed_roles, $user->roles ) ) {  ?>
   // Stuff here for allowed roles
<?php } ?>

ただし、 current_user_can は、ユーザーのロール名だけでなく機能でも使用できます。

そのため、編集者と管理者の両方がページを編集できるようになれば、あなたの人生はこれらの機能を簡単にチェックすることができます。

<?php if( current_user_can('edit_others_pages') ) {  ?>
    // Stuff here for user roles that can edit pages: editors and administrators
<?php } ?>

機能の詳細については こちら をご覧ください。

177
gmazzap

まず、current_user_can()を使用してユーザーの役割を確認しないでください。ユーザーが特定の機能を持っているかどうかを確認するために使用する必要があります

第二に、ユーザーの役割を気にするのではなく、機能に焦点を当てるのではなく、元の質問で尋ねられた問題(ユーザーが管理者であるかどうかを確認するORエディター)。代わりに、current_user_can()が意図したとおりに使用されていた場合、つまりユーザーの機能をチェックする場合、notの役割であれば、条件付きチェックで「or」(||)テストを含める必要はありません。例えば:

if ( current_user_can( 'edit_pages' ) ) { ...

edit_pagesは、管理者と編集者の両方のロールの機能ですが、作成者などの下位のロールの機能はありません。これが、current_user_can()の使用方法です。

8
butlerblog

@butlerblogの返信にあるように、current_user_canを使用してロールをチェックしないでください

この通知は、has_capによって呼び出されるcurrent_user_can関数のPHPドキュメントに明確に追加されます

機能の代わりに役割をチェックすることも一部サポートされていますが、この方法は信頼できない結果を生む可能性があるため推奨されません。

正しいこれを行う方法は、次のようにユーザーを取得して$user->rolesを確認することです。

if( ! function_exists( 'current_user_has_role' ) ){
    function current_user_has_role( $role ) {

        $user = get_userdata( get_current_user_id() );
        if( ! $user || ! $user->roles ){
            return false;
        }

        if( is_array( $role ) ){
            return array_intersect( $role, (array) $user->roles ) ? true : false;
        }

        return in_array( $role, (array) $user->roles );
    }
}

これを行うために使用するいくつかのヘルパー関数を次に示します(時々、現在のユーザーだけが必要ではないため)。

if( ! function_exists( 'current_user_has_role' ) ){
    function current_user_has_role( $role ){
        return user_has_role_by_user_id( get_current_user_id(), $role );
    }
}

if( ! function_exists( 'get_user_roles_by_user_id' ) ){
    function get_user_roles_by_user_id( $user_id ) {
        $user = get_userdata( $user_id );
        return empty( $user ) ? array() : $user->roles;
    }
}

if( ! function_exists( 'user_has_role_by_user_id' ) ){
    function user_has_role_by_user_id( $user_id, $role ) {

        $user_roles = get_user_roles_by_user_id( $user_id );

        if( is_array( $role ) ){
            return array_intersect( $role, $user_roles ) ? true : false;
        }

        return in_array( $role, $user_roles );
    }
}

次に、これを行うことができます:

current_user_has_role( 'editor' );

または

current_user_has_role( array( 'editor', 'administrator' ) );

0
sMyles
<?php if( current_user_can('editor')) :
  echo "welcome";
elseif( current_user_can('member')) :
  echo "welcome";
else :
 wp_die("<h2>To view this page you must first <a href='". wp_login_url(get_permalink()) ."' title='Login'>log in</a></h2>");
endif;
?>
0
seowmx