Jika pengguna saat ini adalah administrator atau editor

103

Bagaimana saya dapat memeriksa untuk melihat apakah pengguna yang masuk saat ini adalah administrator atau editor?

Saya tahu bagaimana melakukannya secara individual:

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

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

Tetapi bagaimana saya bekerja bersama-sama? Yaitu, pengguna adalah administrator atau editor?

andy
sumber
10
if( current_user_can('editor') || current_user_can('administrator') )
Shazzad

Jawaban:

192

Jawaban pertama, bukan yang terkait dengan WordPress karena hanya PHP: Gunakan operator logika "ATAU":

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

Jika Anda ingin memeriksa lebih dari dua peran, Anda dapat memeriksa apakah peran pengguna saat ini ada di dalam array peran, sesuatu seperti:

$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 } ?>

Namun, current_user_candapat digunakan tidak hanya dengan nama peran pengguna, tetapi juga dengan kemampuan.

Jadi, begitu editor dan administrator dapat mengedit halaman, hidup Anda bisa lebih mudah memeriksa kemampuan itu:

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

Lihat di sini untuk informasi lebih lanjut tentang kemampuan.

gmazzap
sumber
1
apakah Anda perlu memeriksa apakah is_logged_in();?
RobBenz
3
@RobBenz tidak, dalam hal apa pun. Karena current_user_can()selalu mengembalikan false jika pengguna tidak masuk, dan wp_get_current_user()akan mengembalikan pengguna tanpa peran apa pun jika pengguna tidak masuk, sehingga array_intersect()akan selalu salah.
gmazzap
1
Dalam PHPDoc current_user_can()fungsi, kita dapat melihat baris " Sementara memeriksa peran tertentu di tempat kemampuan didukung sebagian, praktik ini tidak dianjurkan karena dapat menghasilkan hasil yang tidak dapat diandalkan ". Jadi saya pikir akan lebih baik untuk menghindari menggunakan peran sambil memeriksa kemampuan pengguna :-)
Erenor Paz
Ketika saya menggunakan array_intersectmetode ini, saya mendapatkan peringatan PHP di server kami mengatakan kesalahan log array_intersect(): Argument #2 is not an array. Apakah ini karena pengguna yang memeriksa hanya memiliki satu Peran?
Garconis
@ Garcon biasanya merupakan array. Untuk beberapa alasan tampaknya bagi Anda bukan array. array_intersect($allowed_roles, (array)$user->roles )akan bekerja tanpa masalah.
gmazzap
9

Pertama, current_user_can()tidak boleh digunakan untuk memeriksa peran pengguna - itu harus digunakan untuk memeriksa apakah pengguna memiliki kemampuan tertentu .

Kedua, alih-alih memusatkan perhatian pada peran pengguna tetapi alih-alih berfokus pada kemampuan, Anda tidak perlu repot melakukan hal-hal seperti masalah yang ditanyakan dalam pertanyaan awal (yang memeriksa apakah pengguna adalah administrator atau editor). Alih-alih, jika current_user_can()digunakan sebagaimana dimaksud, yaitu untuk memeriksa kemampuan pengguna, bukan peran mereka, Anda tidak akan memerlukan pemeriksaan bersyarat untuk memuat tes "atau" (||). Sebagai contoh:

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

edit_pages adalah kapabilitas dari peran administrator dan editor, tetapi tidak pada peran yang lebih rendah seperti penulis. Inilah current_user_can()yang dimaksudkan untuk digunakan.

butlerblog
sumber
Harap dicatat : WP tingkat tinggi setuju dengan jawaban ini. Anda harus mencoba untuk menghindari pengecekan peran sebanyak mungkin, gunakan kemampuan. Saat ini saya sedang mengerjakan proyek dengan beberapa peran yang hanya memiliki batas 'baca'. Satu-satunya solusi adalah memeriksa peran untuk saya. Maaf, saya tidak dapat menemukan tautannya, itu adalah diskusi terbuka di WP Github.
Bjorn
Ini harus menjadi jawaban yang diterima, IMO. current_user_canumumnya harus digunakan untuk kemampuan, bukan peran.
Armstrongest
2

Sebagai balasan @butlerblog dinyatakan, Anda seharusnya tidak menggunakan current_user_can untuk memeriksa peran

Pemberitahuan ini secara khusus ditambahkan dalam dokumentasi PHP tentang has_capfungsi yang dipanggil olehcurrent_user_can

Sementara memeriksa peran sebagai pengganti kemampuan didukung sebagian, praktik ini tidak dianjurkan karena dapat menghasilkan hasil yang tidak dapat diandalkan.

Cara CORRECT untuk melakukan ini adalah untuk mendapatkan pengguna dan memeriksa $user->roles, seperti ini:

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

Berikut adalah beberapa fungsi pembantu yang saya gunakan untuk melakukan ini (karena kadang-kadang saya tidak ingin hanya pengguna saat ini):

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

Maka Anda bisa melakukan ini:

current_user_has_role( 'editor' );

atau

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

sMyles
sumber
-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;
?>
seowmx
sumber
1
Akan lebih bagus jika Anda bisa menjelaskan bagaimana itu membantu OP.
bravokeyl
Anda dapat mengizinkan untuk melihat hanya halaman "editor" atau "anggota" Anda dapat memposting kode ini langsung di generic-page.php
seowmx
5
Tolong jangan hanya menjatuhkan kode. Tambahkan komentar dan beberapa penjelasan bagaimana ini memecahkan masalah para penanya.
kraftner
Jadi jawaban Anda adalah duplikasi kode untuk setiap peran?
Julix