Mevcut kullanıcı yönetici veya editör ise


101

Geçerli oturum açmış kullanıcının bir yönetici veya editör olup olmadığını nasıl kontrol edebilirim?

Bireysel olarak nasıl yapılacağını biliyorum:

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

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

Ama bunları birlikte nasıl çalışırım? Yani, kullanıcı bir yönetici veya editör mü?


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

Yanıtlar:


190

İlk cevap, WordPress ile ilgili değil, sadece PHP olduğundan: "VEYA" operatörünü kullanın:

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

İkiden fazla rol kontrol etmek istiyorsanız, geçerli kullanıcının rollerinin bir rol dizisinde olup olmadığını kontrol edebilirsiniz:

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

Ancak, current_user_canyalnızca kullanıcıların rol adıyla değil, yetenekleriyle de kullanılabilir.

Bu nedenle, hem editörler hem de yöneticiler sayfaları düzenleyebildiklerinde, bu yetenekleri kontrol etmek hayatınızı kolaylaştırabilir:

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

Yetenekler hakkında daha fazla bilgi için buraya bir göz atın .


kontrol etmen gerekiyor is_logged_in();mu
RobBenz

3
@RobBenz no, hiçbir durumda. Çünkü current_user_can()kullanıcı giriş yapmadıysa her zaman false döndürür ve kullanıcı giriş yapmamışsa, wp_get_current_user()hiçbir rolü olmayan bir kullanıcıyı döndürür, böylece array_intersect()yanlış olur.
gmazzap

1
current_user_can()Fonksiyonun PHPDoc'unda " Yetenek yerine belirli rollere karşı kontrol edilirken kısmen desteklenirken, bu uygulama güvenilmez sonuçlar üretebileceği için önerilmemektedir " satırını görebiliriz . Bu nedenle, kullanıcının kapasitesini kontrol ederken rol kullanmaktan kaçınmanın daha iyi olacağını düşünüyorum :-)
Erenor Paz

Bu array_intersectyöntemi kullandığımda, sunucu hata günlüğümüzde bir PHP uyarısı alıyorum diyerek array_intersect(): Argument #2 is not an array. Bu, kontrol ettiği kullanıcının yalnızca bir Rolü olduğu için mi?
Garconis

@Garconis normalde bir dizi olmalıdır. Bazı nedenlerden dolayı sizin için bir dizi değil gibi görünüyor. array_intersect($allowed_roles, (array)$user->roles )sorunsuz çalışacak.
gmazzap

9

Öncelikle, current_user_can()bir kullanıcının rolünü kontrol etmek için kullanılmamalı - bir kullanıcının belirli bir yeteneği olup olmadığını kontrol etmek için kullanılmalıdır .

İkincisi, kullanıcının rolüyle ilgilenmek yerine, yeteneklere odaklanmak yerine, orijinal soruda sorulan gibi (örneğin, kullanıcının bir yönetici VEYA editör olup olmadığını kontrol eden) bir şey yapmakla uğraşmak zorunda değilsiniz. Bunun yerine, amaç current_user_can()olarak kullanılıyorsa, kullanıcının rollerini değil , kullanıcının yeteneklerini kontrol etmek için bir "veya" (||) testi içermek için şartlı kontrol gerekmez. Örneğin:

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

edit_pages, hem yönetici hem de editör rolünün bir özelliğidir, ancak yazarlar gibi daha düşük roller yoktur. Bu nasıl current_user_can()kullanılması amaçlanmıştır.


Lütfen dikkat : Yüksek seviye WP devs bu cevabı kabul eder. Rol kontrolünü mümkün olduğunca engellemekten kaçınmalı, yetenek kullanmalısınız. Şu anda yalnızca 'okuma' başlığına sahip birden fazla rol içeren bir proje üzerinde çalışıyorum. Tek çözüm benim için rol kontrol etmektir. Üzgünüm, bağlantıyı bulamıyorum, WP Github hakkında açık bir tartışma oldu.
Bjorn

Bu kabul edilen cevap olmalı, IMO. current_user_cangenellikle roller için değil yetenekler için kullanılmalıdır.
Armstrongest

2

@Butlerblog cevabı belirtildiği gibi, bir role karşı kontrol etmek için current_user_can kullanmamalısınız

Bu uyarı özellikle PHP has_captarafından çağrılan fonksiyonun belgelerine eklenmiştir.current_user_can

Yetenek yerine bir rolü kontrol etmek kısmen desteklenirken, güvenilmez sonuçlar üretebileceği için bu uygulama önerilmemektedir.

Bunu yapmanın DOĞRU yolu, kullanıcıyı alıp kontrol etmektir $user->roles, şöyle:

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

İşte bunu yapmak için kullandığım bazı yardımcı fonksiyonlar (bazen sadece şu anki kullanıcıları istemiyorum):

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

O zaman bunu sadece yapabilirsiniz:

current_user_has_role( 'editor' );

veya

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'ye nasıl yardımcı olduğunu açıklayabilirseniz çok iyi olur.
bravokeyl

Bu sayfayı doğrudan "düzenleyici" veya "üye" olarak görebilirsiniz, bu kodu doğrudan generic-page.php
seowmx içinde 29.16 'de

4
Lütfen sadece kod girmeyin. Bunun, askerler sorununu nasıl çözdüğü hakkında açıklamalar ve bazı açıklamalar ekleyin.
kraftner
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.