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


101

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

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

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

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

しかし、それらを一緒に使用するにはどうすればよいですか?つまり、ユーザーは管理者または編集者ですか?


10
if( current_user_can('editor') || current_user_can('administrator') )
シャザッド

回答:


190

最初の答えは、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 } ?>

一見持ってここに機能の詳細については、を。


1
確認する必要がありますかis_logged_in();
ロブベンツ

3
@RobBenzいいえ、いずれの場合も。そのためcurrent_user_can()、常にユーザーがログインしていない場合はfalseを返し、wp_get_current_user()ユーザーがログインしていない場合は任意の役割を持たないユーザが返されますので、array_intersect()常にfalseとなります。
gmazzap

1
current_user_can()関数のPHPDocには、「機能の代わりに特定のロールをチェックする機能が一部サポートされていますが、信頼できない結果が生じる可能性があるため、この方法は推奨されません」という行があります。そのため、ユーザーの能力を確認する際にロールを使用することは避けた方が良いと思います:-)
Erenor Paz

array_intersectメソッドを使用すると、サーバーエラーログにPHP警告が表示されますarray_intersect(): Argument #2 is not an array。これは、チェックしているユーザーに1つのロールしかないためですか?
ガルコニス

通常、@ Garconisは配列でなければなりません。何らかの理由で、配列ではないようです。array_intersect($allowed_roles, (array)$user->roles )問題なく動作します。
gmazzapの

9

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

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

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

edit_pagesは、管理者と編集者の両方のロールの機能ですが、作成者などの下位のロールの機能はありません。これが、どのようcurrent_user_can()に使用されることを意図していたかです。


:高レベルのWP開発者はこの回答に同意します。ロールチェックをできるだけ避け、機能を使用する必要があります。現在、「読み取り」キャップのみを持つ複数の役割を持つプロジェクトに取り組んでいます。唯一の解決策は、私にとっての役割チェックです。申し訳ありませんが、リンクが見つかりません。これはWP Githubの公開討論でした。
ビヨン

これは受け入れられた答え、IMOであるはずです。current_user_can通常、ロールではなく機能に使用する必要があります。
アームストロング

2

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

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

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

これを行う正しい方法は、ユーザーを取得し$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' ) );


-1
<?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;
?>

1
OPにどのように役立つかを説明できれば素晴らしいと思います。
-bravokeyl

あなたは、ページのみ、「エディタ」または「メンバー」とは、あなたが一般的な-page.phpで直接このコードを投稿することができます参照してくださいできるようにすることができます
seowmx

4
コードをドロップしないでください。コメントとこれが質問者の問題を解決する方法の説明を追加します。
クラフトナー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.