ฉันจะสร้างความสามารถของบทบาทที่กำหนดเองได้อย่างไร


26

ฉันต้องการสร้างความสามารถที่กำหนดเองสำหรับการเข้าถึงส่วนต่อประสานของปลั๊กอินของฉัน

  • ปลั๊กอินควรจัดการเพิ่มความสามารถนี้ให้กับบัญชีผู้ดูแลระบบทั้งหมดเมื่อเปิดใช้งานหรือไม่
  • ถ้าเป็นเช่นนั้น: WordPress จัดการเพิ่มความสามารถให้กับผู้ดูแลระบบทั้งหมดของบล็อกย่อยและผู้ดูแลระบบขั้นสูงในการติดตั้งแบบหลายไซต์หรือไม่หรือว่าฟังก์ชั่นนั้นต้องจัดการโดยปลั๊กอินหรือไม่?

บล็อกรายละเอียด: goo.gl/xNuafH
Suresh Kamrushi

คำตอบ:


11

ลบสิ่งที่คุณเพิ่ม

ครั้งแรกโปรดตรวจสอบให้แน่ใจว่าทุกสิ่งที่คุณเพิ่มในการเปิดใช้งานยังได้รับเอาออกบนถอนการติดตั้ง ฉันได้รับการสอนสั้น ๆ พร้อมรหัสตัวอย่างสำหรับคุณ

ทดสอบด้วยปลั๊กอินขนาดเล็ก:

ฉันไม่ค่อยรู้อะไรเกี่ยวกับ MU มากนัก แต่เท่าที่ฉันจะบอกได้วัตถุบทบาทนั้นมีอยู่ทั่วโลกในบล็อกทั้งหมด ลองใช้ปลั๊กอินตัวเล็ก ๆ นี้แล้วดูว่าคุณจะได้อะไร:

<?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' );

การเพิ่มความสามารถ

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

หมายเหตุ:คุณสามารถเพิ่มความสามารถในการที่จะมีบทบาทโดยไม่อนุญาตให้เข้าถึงมัน - $grant = false;เพียงแค่ตั้งอาร์กิวเมนต์ที่สอง สิ่งนี้ช่วยให้ผู้ใช้ที่อยู่ในรายการเดียวสามารถยกเว้นเพียงแค่เพิ่มขีด จำกัด รวมถึงอาร์กิวเมนต์สุดท้ายเป็นจริง


17

สำหรับปลั๊กอินที่ฉันกำลังทำงานอยู่บนผมอยากจะให้ / จำกัด การเข้าถึงการตั้งค่าปลั๊กอิน (เช่นตามหน้าเมนูผู้ดูแลระบบ) บนต่อบทบาทฐาน
ดังนั้นผมต้องเพิ่มใหม่ปลั๊กอินที่เฉพาะเจาะจงcapabilityuser rolesไปที่

น่าเสียดายที่คำตอบของไกเซอร์ดูเหมือนจะไม่ทำงานอีกต่อไปดังนั้นฉันจึงใช้เวลาพยายามหาวิธีการใช้งานฟังก์ชั่นดังกล่าวข้างต้น


กำหนดการ

ก่อนที่ฉันจะแบ่งปันรหัสของฉันกับคุณนี่คือสิ่งที่เกี่ยวกับในข้อความล้วน:

  1. เมื่อวันที่เปิดใช้งานปลั๊กอินเพิ่มความสามารถใหม่THE_NEW_CAPกับบทบาทการมีบางความสามารถในตัวBUILT_IN_CAP(ในกรณีของฉัน: edit_pages)
  2. ในการโหลดแต่ละหน้าให้ทำ1 (เช่นเพิ่มความสามารถอีกครั้ง) สิ่งนี้จำเป็นเฉพาะถ้าคุณต้องการบัญชีสำหรับบทบาทใหม่ที่เป็นไปได้ที่สร้างขึ้นหลังจากการเปิดใช้งานปลั๊กอิน ดังนั้นบทบาทใหม่เหล่านี้ไม่มีความสามารถเฉพาะปลั๊กอินแม้ว่าจะมีความสามารถในตัวที่จำเป็น
  3. ใช้ความสามารถใหม่สำหรับสิ่งที่คุณต้องการ ตามที่อธิบายไว้ก่อนหน้านี้ฉันใช้เพื่ออนุญาต / จำกัด การเข้าถึงหน้าเมนูผู้ดูแลระบบของปลั๊กอินดังนั้นจึงเป็นวิธีที่ทำได้ในตัวอย่างโค้ดต่อไปนี้
  4. ในการปิดใช้งานปลั๊กอินให้ลบความสามารถออก แน่นอนคุณสามารถทำได้เมื่อปลั๊กอินถูกถอนการติดตั้ง ไม่ว่าจะด้วยวิธีใดให้ทำในที่สุด

รหัส

และนี่คือรายการด้านบนที่ถูกแปลงเป็นรหัส:

»การตั้งค่า

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

»ใช้มัน

    // 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', ...);
    }

»ทำความสะอาดมัน

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

}

หมายเหตุ: โปรดอย่าใช้ความสามารถของตัวพิมพ์ใหญ่ นี่เป็นเพียงสำหรับการอ่าน


1
ใช้get_editable_roles()เพื่อดึงข้อมูลบทบาทที่คุณต้องการแก้ไขเสมอ คุณจะทำลายปลั๊กอินเป็นอย่างอื่น
fuxia

1
@toscho ดีโอเคผมคิดว่าเป็นหนึ่งในฟังก์ชั่นเหล่านี้แม้ Codex ไม่ทราบเกี่ยวกับ ... ;) แน่นอนว่าฟังก์ชั่นนี้มีสิทธิที่จะอยู่ แต่ผมไม่เห็นใช้ WP_Roles โลกอาร์เรย์ทำลาย ปลั๊กอินใด ๆในกรณีของฉัน
tfrommen

2
ปลั๊กอินบางตัวสร้างบทบาทผู้ใช้พิเศษและพึ่งพาความสามารถที่แน่นอน ในบางกรณีความสามารถหนึ่งแยกออกจากการใช้งานอื่นในตรรกะของโปรแกรม คุณไม่สามารถรู้ได้ในกรณีนี้
fuxia

0

สิ่งนี้ใช้ได้กับฉัน:

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

ไม่เคยปรับเปลี่ยนGlobalsบทบาท! ไม่เคย ทำไม่ได้! คุณจะไม่เรียกใช้ hooks และ deny filter ใด ๆ และทำให้โค้ดของคุณเป็นเป้าหมายที่เคลื่อนไหว ไม่มีใครจะรู้ได้ว่าคุณลงทะเบียนบทนั้นเมื่อไหร่และที่ไหน ได้โปรด: อย่าทำอย่างนั้น โดยเฉพาะอย่างยิ่งไม่ได้มีบทบาท
ไกเซอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.