Current_user_can () ve ilgili işlevleri kullanmanın geçerli zamanlaması nedir?


10

Vanilya WP çekirdek yükü sırasında mevcut kullanıcı, $wp-init()tema yükünden sonra ve initkancadan önce kurulmaktadır . Bu, initveya daha sonra bağlanmak için iyi işlevsellik pratiğine uygundur .

Bununla birlikte, current_user_can() daha önce olduğu gibi ilgili işlevleri çağırmak da yaygın bir uygulamadır . Tanımlama gereği, yükleme işleminin önceki aşamalarıyla çalışan eklentiler için gereklidir (Araç Çubuğu Tema Değiştirici eklentim bir örnek olacaktır).

Belgeler bu uygulama için veya bu uygulama hakkında herhangi bir iddiada bulunmaz (bulabildiğim).

Bununla birlikte, bazı eklentiler kullanıcıyla ilgili işlevselliğe bağlanmış gibi görünüyor ve post- initstate her zaman bekliyor.

Örneğin bbPress aşağıdaki bildirimi atar:

// If the current user is being setup before the "init" action has fired,
// strange (and difficult to debug) role/capability issues will occur.
if ( ! did_action( 'after_setup_theme' ) ) {
    _doing_it_wrong( __FUNCTION__, __( 'The current user is being initialized without using $wp->init().', 'bbpress' ), '2.3' );
}

Hızlı tanıtım için bunu çekirdeğin şu tanımına atın current_user_can():

function current_user_can( $capability ) {

    if ( ! did_action('after_setup_theme') ) {
        echo wp_debug_backtrace_summary();
    }

Bu durumda kim “haklı”? Kullanıcı ile ilgili işlevlerin daha önce izin verilen / yasaklanan kullanımına ilişkin kanonik bir belirleme var initmı?


Yanıtlar:


7

Bunun için tek ön şart current_user_can()var wp_get_current_user(). İkincisi içinde tanımlanır pluggable.php, böylece daha sonra kullanabilirsiniz plugins_loaded.

_doing_it_wrong()Eğer söz konusu gerekçe olan çağrı kendisi için yanlıştır. Benim tahminim BuddyPress veya bbPress'den aldınız. Bu kadar beklemezlerse ikisi de özyinelemeye başlar. Özyinelemeyi önlemenin başka, daha iyi yolları vardır.

Bazı durumlarda, gibi yerel ayarını değiştirerek , sen sahip öylesine bekliyor, geçerli kullanıcı nesnesi önceki erişimine after_setup_themehatta bir seçenek değildir.



2

Daha önce kullanıcı yeteneği işaretlerseniz initvasıtası ordasın şansını size geçerli kullanıcı nesnesinin ayarı sorumludur.

Kullanıcıya daha sonra erişirseniz, kullanıcıyı başka bir şeyin zaten kurduğundan initemin olursunuz , çoğu zaman kendi kendini çeker.

Bu yüzden kullanıcıya daha sonra erişmek güvenliinit kabul edilir .

Aslında, erken erişim muhtemelen bazı filtrelerin çalışmasına neden olabilir determine_current_user.

Birinin "kırılgan" bir kanca olduğunu söylemeye değer, çünkü asla çalışamaz, sadece takılabilir işlevlerde ateşlenir.

Ancak, durumlar (gibi orada @toscho dediğin) olamaz seçme şansın yok bu durumlarda init kadar bekleyin.

Herhangi bir uyumsuzluğu çözmenin tek yolu, eğer varsa, duruma göre.

Bir çözelti olabilir (bbPress / BuddyPress dahil) çoğu durumda iş yerine fonksiyonu şu kullanmaktır current_user_can:

function compat_current_user_can( $capability )
{
  if ( did_action( 'init' ) ) {
     return current_user_can( $capability );
  }

  $user_id = apply_filters( 'determine_current_user', false );

  return user_can( $user_id, $capability );
}

Bu, mevcut kullanıcı kapasitesini global kullanıcı ayarlamadan erken kontrol etmeyi sağlar, bu nedenle teoride daha önce çalıştırılması güvenlidir init.

Sorun, yukarıda belirtildiği gibi, takılabilir fonksiyonları geçersiz kılan ve ateşlemeyen herhangi bir kodun onu kırmasıdır determine_current_user.


Bence fonksiyonunuzun değişkenleri biraz bozuldu. :)
Rarst

Evet ... akşam yemeğinden önce çok hızlı yazılmış: P @ sabitleme için teşekkür.
gmazzap

Bahsetme. Ayrıca sadece neyin yanlış olduğunu söylemeyin, bunu düzelt @Rarst :)
Nicolai

1

BuddyPress ve bbPress'in _doing_it_wrongmesajı vermeden önce başka bir şeyi kontrol etmesi gerektiğini düşünmeye meyilliyim

Ben de $ current_user gerçek ayarını kontrol etmek için her iki rutin değiştirdi.

global $current_user; 
if ( is_null( $current_user ) ) {
    _doing_it_wrong( ... );
}

Bildirimler artık görüntülenmedi.

İçin test did_action( "after_setup_theme" )kemer ile gitmek için parantez haline gelir.

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.