add_role () yalnızca bir kez çalışır mı?


11

Add_role () veritabanını değiştirir ve rol zaten varsa başarısız olduğunu keşfetmek için sürpriz oldu. Burada iki sonuç vardır, birincisi diğerinden daha ciddidir: 1) geliştirme aşamasındaysanız ve add_role kodunuzu güncellerseniz, doğru olduktan sonra önce remove_role () 2) 'yi kaldırmalısınız, bu kodu asla çalıştırmamalısınız tekrar.

Yani genellikle bir wp_loaded eylem kanca içine benim add_role () koyuyorum. Ve geliştirildiğim için, add_role'ımdan önce bir remove_role () ekledim.

Ancak bu, blogun bir sayfasına her erişildiğinde açık bir şekilde çalışıyor. Tamam, bunu yalnızca yönetici işlemine sokabilirim veya belki de bu rolün bir kez oluşturulabileceği Kullanıcılar veya Araçlar altında bir eklenti sayfası oluşturabilirim. Sanırım orada daha basit ve daha zarif bir çözüm var.

Ben run_once bir tür eylem olduğunu düşünmüyorum?

Yoksa rol eklemek ve sonra add_cap () bir sürü kez kullanmak için en iyi yöntem mi? Ve o zaman bile add_cap db erişiyor hayal.

Sadece gereksiz db erişimini azaltmak için en iyi yolu açısından düşünüyorum. En iyi uygulamalarınız neler?


Müthiş! Bu soru için teşekkür ederim .. Sadece remove_role()önce add_role()bana fonksiyon eklemek yardımcı oldu.
beytarovski

Yanıtlar:


10

Kullanıcı rolleri ve yetenekleri veritabanına kaydedilir, böylece bir kez add_role()kaydettiğinizi kullandıktan sonra bir sonraki yüklemede WordPress bu rolleri yerleşik roller gibi bilecektir.

Şimdi fonksiyona add_role()daha spesifik olarak 141 satırında bakarsanız, sadece var $use_dbdoğru olarak ayarlanmışsa (varsayılan olarak odur) veritabanındaki rolü ve yetenekleri kaydettiğini göreceksiniz, böylece telefonunuzu çağırmadan önce değiştirebilirsiniz. add_role()işlevinde rol kaydedilmez.

Deneyin:

//globalize $wp_roles
global $wp_roles;
//set use_db to flase
$wp_roles->use_db = false;
//then add your role
$wp_roles->add_role( $role, $display_name, $capabilities );

Güncelleme:

Eğer onun bir test / geliştirme ortamında sonra hiçbir dezavantajı görmüyorum, ancak canlı bir ortamda iseniz, o zaman her yükte rol oluşturmak için zamandan tasarruf edin.

En iyi uygulama bir kez çalıştırmak gelince, bir eklentide kullanmanız gerekir register_activation_hookve başka bir şey için basit bir özel koşullu işlev kullanın:

function run_once($key){
    $test_case = get_option('run_once');
    if (isset($test_case[$key]) && $test_case[$key]){
        return false;
    }else{
        $test_case[$key] = true;
        update_option('run_once',$test_case);
        return true;
    }
}

**usage:**
if (run_once('add_user_role')){
    //do you stuff and it will only run once
}

Hata! Hatta WP_Roles sınıfı hakkında daha önceki bazı köklenme de biliyordum. Rol için veritabanını KULLANMAMANIN bir dezavantajı var mı? Ve sadece bir kez bir şey yapmak için bir WP en iyi uygulaması var mı?
Tom Auger

Güncelleme için teşekkürler - update_option çözümünün basitliğini beğendim
Tom Auger

Gerçekten tatmin edici değil ama en iyi çözüm gibi görünüyor 👍
Blackbam

Bu işlev run_once, her sayfa yüklemesinde çok fazla okuma / yazma veritabanı işlemini artırır. Lütfen bunu kullanma.
Mayank Dudakiya
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.