Özel bir rol yeteneği nasıl oluştururum?


26

Eklentimin arayüzüne erişmek için özel bir yetenek oluşturmak istiyorum.

  • Eklenti, bu özelliği etkinleştirmeden önce tüm yönetici hesaplarına eklemeyi başarabilir mi?
  • Öyleyse: WordPress, çok kullanıcılı yüklemelerde alt blogların ve süper yöneticilerin tüm yöneticilerine yetenek ekleme özelliğini yönetiyor mu, yoksa bu işlevin eklenti tarafından mı yapılması gerekiyor?

Ayrıntılı bir blog: goo.gl/xNuafH
Suresh Kamrushi

Yanıtlar:


11

Eklediklerinizi kaldırın

Öncelikle, lütfen aktivasyona eklediğiniz her şeyin kaldırma sırasında da silindiğinden emin olun . Sizin için örnek kod içeren kısa bir eğiticim var .

Küçük bir eklentiyle test edin:

MU hakkında pek bir şey bilmiyorum, ama söyleyebileceğim kadarıyla, roller nesnesi tüm bloglarda küresel. Sadece bu küçük eklentiyi deneyin ve neler bulabileceğinizi görün:

<?php
/*
Plugin Name:    MU Roles check
Plugin URI:     https://github.com/franz-josef-kaiser/
Description:    Check roles during viewing a blog
Author:     Franz Josef Kaiser
Author URI:     https://plus.google.com/u/0/107110219316412982437
Version:        0.1
Text Domain:    murc
License:        GPL v2 - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*/

/**
 * Show the blog data and the role names in this blog
 * Also shows if the custom capability was successfully added, or displays n/a for the role
 * 
 * @return void
 */
function wpse35165_role_check()
{
    $blog = get_current_site();
    $custom_cap = 'name_of_your_custom_capability';

    $html = "<hr /><table>";
    $html .= "<caption>List roles in (Blog) {$blog->site_name} / ID#{$blog->id}</caption>"
    $html .= "<thead><tr><th>Role Name</th><th>Capabilties</th></tr></thead><tbody>";
    foreach ( $GLOBALS['wp_roles'] as $name => $role_obj )
    {
        $cap = in_array( $custom_cap, $role_obj->caps ) ? $custom_cap : 'n/a';
        $cap = $cap OR in_array( $custom_cap, $role_obj->allcaps ) ? $custom_cap : 'n/a';
        $html .= "<tr><td>{$name}</td><td>{$cap}</td></tr>";
    }
    $html .= '</tbody></table>';

    print $html;
}
add_action( 'shutdown', 'wpse35165_role_check' );

Yetenek Eklemek

/**
 * Add the capability to the role objects
 * Should be in your activation function and done before you inspect with your plugin
 * 
 * @return void
 */
function wpse35165_add_cap()
{
    $custom_cap = 'name_of_your_custom_capability';
    $min_cap    = 'the_minimum_required_built_in_cap'; // Check "Roles and objects table in codex!
    $grant      = true; 

    foreach ( $GLOBALS['wp_roles'] as $role_obj )
    {
        if ( 
            ! $role_obj->has_cap( $custom_cap ) 
            AND $role_obj->has_cap( $min_cap )
        )
            $role_obj->add_cap( $custom_cap, $grant );
    }
}

Not: Bu özelliği erişim izni vermeden role ekleyebilirsiniz - sadece ikinci argümanı ayarlayın $grant = false;. Bu, beyaz listelerin tek kullanıcıların son argümanı içeren başlığı doğru olarak eklemelerini sağlar.


17

Şu anda üzerinde çalışmakta olduğum bir eklenti için, rol bazında eklenti ayarlarına (yani, yönetici menüsü sayfalarına göre) erişim izni vermek / kısıtlamak istedim .
Bu nedenle, yapmak zorundaydım yeni eklenti-özgü eklemek capabilityiçinuser roles .

Ne yazık ki, kaiser'in yanıtı artık çalışmıyor gibi görünüyor, bu yüzden yukarıda belirtilen işlevsellik için nasıl izin verileceğini bulmak için biraz zaman harcadım.


Program

Kodumu sizinle paylaşmadan önce, bunun neyle ilgili olduğu, düz metin halinde:

  1. Eklenti etkinleştirme işleminde, THE_NEW_CAPbelirli bir yerleşik yeteneği olan rollere yeni yetenek ekleyin BUILT_IN_CAP(benim durumumda:) edit_pages.
  2. Her sayfa yüklemesinde, 1 yapın (yani, yeteneği tekrar ekleyin). Bu, yalnızca eklentinin etkinleştirilmesinden sonra oluşturulan olası yeni rolleri hesaba katmak istediğinizde gereklidir. Dolayısıyla, bu yeni roller, gerekli yerleşik yeteneklere sahip olsalar bile, eklentiye özgü özelliğe sahip değildir.
  3. İstediğiniz şey için yeni yeteneği kullanın. Daha önce açıklandığı gibi, eklentinin yönetici menüsü sayfalarına erişim izni vermek / kısıtlamak için kullanıyorum, böylece aşağıdaki kod örneğinde böyle yapılır.
  4. Eklenti devre dışı bırakıldığında, özelliği kaldırın. Tabii ki, eklenti kaldırılırken de bunu yapabilirsiniz. Her iki durumda da, sonunda yapın.

Kod

Ve işte yukarıdaki liste koda dönüştürülmüş:

»Kurma

class WPSE35165Plugin {

    public function __construct() {
        // Register hooks
        register_activation_hook(__FILE__, array(__CLASS__, 'activation'));
        register_deactivation_hook(__FILE__, array(__CLASS__, 'deactivation'));

        // Add actions
        add_action('admin_menu', array(__CLASS__, 'admin_menu'));
    }

    public function activation() {
        self::add_cap();
    }

    // Add the new capability to all roles having a certain built-in capability
    private static function add_cap() {
        $roles = get_editable_roles();
        foreach ($GLOBALS['wp_roles']->role_objects as $key => $role) {
            if (isset($roles[$key]) && $role->has_cap('BUILT_IN_CAP')) {
                $role->add_cap('THE_NEW_CAP');
            }
        }
    }

»Kullanma

    // Add plugin menu pages to admin menu
    public function admin_menu() {
        // Remove the following line if you don't care about new roles
        // that have been created after plugin activation
        self::add_cap();

        // Set up the plugin admin menu
        add_menu_page('Menu', 'Menu', 'THE_NEW_CAP', …);
        add_submenu_page('wpse35165', 'Submenu', 'Submenu', 'THE_NEW_CAP', ...);
    }

»Temizleme

    public function deactivation() {
        self::remove_cap();
    }

    // Remove the plugin-specific custom capability
    private static function remove_cap() {
        $roles = get_editable_roles();
        foreach ($GLOBALS['wp_roles']->role_objects as $key => $role) {
            if (isset($roles[$key]) && $role->has_cap('THE_NEW_CAP')) {
                $role->remove_cap('THE_NEW_CAP');
            }
        }
    }

}

Not: Lütfen büyük harf yeteneklerini kullanmayın. Bu sadece okunabilirlik içindir.


1
get_editable_roles()Düzenlemek istediğiniz rolleri almak için her zaman kullanın . Sen olacak , aksi takdirde eklentileri bölünürler.
fuxia

1
@toscho Peki, tamam, bunu bile Codex bilmediği bu işlevlerden birini ... varsayalım;) Tabii ki, bu fonksiyon var olma hakkına sahiptir, ancak, küresel WP_Roles dizi kullanarak görmüyorum kırılmasını benim durumumdaki herhangi bir eklenti .
tfrommen

2
Bazı eklentiler özel kullanıcı rolleri yaratır ve tam bir yetenekler kümesine dayanır. Bazı durumlarda bir yetenek, program mantığında bir başkasının kullanımını dışlar. Bunun ne zaman olduğunu bilemezsin.
fuxia

0

Bu benim için çalışıyor:

    add_action('admin_init', 'add_custom_cap');
    function add_custom_cap()
    {
        $custom_cap = 'test_cap';
        $min_cap    = 'read';
        $grant      = true;
        $to_role = 'your_user_role';
        $role = 'user_role';

        foreach ( $GLOBALS['wp_roles'] as $role_obj )
        {
            if (is_object($role_obj[$role])) {
                if (!$role_obj[$role]->has_cap( $custom_cap ) && $role_obj[$role]->has_cap( $min_cap )) {
                    $role_obj[$role]->add_cap( $custom_cap, $grant );
                }
            }
        }
    }

Rollerin dünyasını asla değiştirmeyin ! Asla. Yapma! Kancaları tetikleyemez, filtreleri reddedemez ve kodunuzu hareketli bir hedef haline getiremezsiniz. Hiç kimse bu rolü ne zaman ve nerede kaydettiğini bilemeyecek (sen yapmadın, sadece bir yerde, bir şekilde, bir yere doldurdun). Lütfen: Bunu asla yapma. Özellikle de rollerle değil.
kaiser
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.