আমি কীভাবে কাস্টম রোলের সক্ষমতা তৈরি করব?


26

আমি আমার প্লাগইনটির ইন্টারফেস অ্যাক্সেসের জন্য একটি কাস্টম ক্ষমতা তৈরি করতে চাই।

  • অ্যাক্টিভেশন-এর সমস্ত প্রশাসকের অ্যাকাউন্টগুলিতে এই ক্ষমতাটি যুক্ত করার প্লাগইনটি পরিচালনা করা উচিত?
  • যদি তা হয়: ওয়ার্ডপ্রেসটি মাল্টিসাইট ইনস্টলসে সাব ব্লগের সমস্ত প্রশাসক এবং সুপার অ্যাডমিনিস্ট্রেটরগুলির সক্ষমতা যুক্ত করার ব্যবস্থা করে বা এই ফাংশনটি প্লাগইন দ্বারা পরিচালনা করা দরকার?

একটি বিশদ ব্লগ: goo.gl/xNuafH
সুরেশ কামরুশি

উত্তর:


11

আপনি যা যুক্ত করেন তা সরান

প্রথমত, দয়া করে নিশ্চিত হয়ে নিন যে আপনি অ্যাক্টিভেশনে যোগ করা সমস্ত কিছু আনইনস্টল করার সময় সরানো হবে । আমি আপনার জন্য উদাহরণ কোড সহ একটি সংক্ষিপ্ত টিউটোরিয়াল পেয়েছি ।

একটি ছোট প্লাগইন দিয়ে পরীক্ষা করুন:

আমি এমইউ সম্পর্কে সত্যই বেশি কিছু জানি না, তবে যতদূর আমি বলতে পারি, ভূমিকাগুলি সমস্ত ব্লগ জুড়ে বিশ্বব্যাপী। এই ছোট্ট প্লাগইনটি চেষ্টা করে দেখুন এবং আপনি কী পেতে পারেন তা দেখুন:

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

আমি বর্তমানে যে প্লাগিনে কাজ করছি তার জন্য আমি প্রতিটি ভূমিকা ভিত্তিতে প্লাগইন সেটিংসে (যেমন, অ্যাডমিন মেনু পৃষ্ঠাগুলি) অ্যাক্সেস মঞ্জুরি / সীমাবদ্ধ করতে চেয়েছিলাম ।
সুতরাং, আমাকে একটি নতুন প্লাগইন-নির্দিষ্ট যুক্ত capabilityকরতে হয়েছিলuser roles

দুর্ভাগ্যক্রমে, কায়সারের উত্তরটি আর কাজ করছে না বলে মনে হচ্ছে, সুতরাং উপরে উল্লিখিত কার্যকারিতাটি কীভাবে মঞ্জুর করতে পারি সে চেষ্টা করার জন্য আমি কিছু সময় ব্যয় করেছি।


তালিকা

আমি আপনার সাথে আমার কোডটি ভাগ করে নেওয়ার আগে, সরল পাঠ্যে এখানে কী রয়েছে:

  1. প্লাগইন অ্যাক্টিভেশনে, THE_NEW_CAPএকটি নির্দিষ্ট অন্তর্নির্মিত ক্ষমতা BUILT_IN_CAP(আমার ক্ষেত্রে edit_pages:) রোলগুলিতে নতুন দক্ষতা যুক্ত করুন ।
  2. প্রতিটি পৃষ্ঠার লোডে, ১ টি করুন (অর্থাত্, আবার সামর্থ্য যুক্ত করুন)। এটি কেবলমাত্র প্রয়োজনীয় যদি আপনি প্লাগইন সক্রিয় হওয়ার পরে তৈরি করা নতুন সম্ভাব্য ভূমিকার জন্য অ্যাকাউন্ট করতে চান। অতএব, এই নতুন ভূমিকাগুলির প্লাগ-ইন-সক্ষমতা নেই, এমনকি যদি তাদের প্রয়োজনীয় বিল্ট-ইন সক্ষমতা থাকে।
  3. আপনি যা চান তার জন্য নতুন ক্ষমতাটি ব্যবহার করুন। যেমন আগে ব্যাখ্যা করা হয়েছে, আমি এটি প্লাগিনের অ্যাডমিন মেনু পৃষ্ঠাগুলিতে অ্যাক্সেস মঞ্জুরি / সীমাবদ্ধ করার জন্য ব্যবহার করি, সুতরাং এটি নিম্নলিখিত কোড উদাহরণে এটি করা হয়।
  4. প্লাগইন নিষ্ক্রিয়করণে, ক্ষমতাটি সরিয়ে দিন। প্লাগইনটি আনইনস্টল করার সময় অবশ্যই আপনি এটি করতে পারেন। যেভাবেই হোক, শেষ পর্যন্ত এটি করুন।

কোড

এবং এখানে উপরোক্ত তালিকাটি কোডে রূপান্তরিত হয়েছে:

It সেট আপ করা হচ্ছে

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()আপনি সম্পাদনা করতে চান এমন ভূমিকা আনতে সর্বদা ব্যবহার করুন। আপনি হবে অন্যথায় প্লাগিন ভঙ্গ করো না।
ফুসিয়া

1
@ টসচো ওয়েল, ঠিক আছে, আমি মনে করি এটি এই ফাংশনগুলির মধ্যে একটি এমনকি এমনকি কোডেক্সও জানেন না ...;) অবশ্যই, এই ফাংশনটির বিদ্যমান থাকার অধিকার রয়েছে, তবে, আমি বিশ্বব্যাপী ডাব্লুপি_রোলস অ্যারে ব্রেকিং ব্যবহার করে দেখছি না আমার ক্ষেত্রে কোনও প্লাগইন
tfrommen

2
কিছু প্লাগইন বিশেষায়িত ব্যবহারকারীর ভূমিকা তৈরি করে এবং দক্ষতার সঠিক সেটটিতে নির্ভর করে। কিছু ক্ষেত্রে একটি দক্ষতা প্রোগ্রামের যুক্তিতে অন্যটির ব্যবহার বাদ দেয়। কখন যে কেস তা আপনি জানতে পারবেন না।
ফুসিয়া

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

গ্লোবালগুলি কখনই কোনও ভূমিকা সংশোধন করবেন না ! কখনও। করবেন না! আপনি কোনও হুক ট্রিগার করবেন না এবং ফিল্টারগুলি অস্বীকার করবেন এবং আপনার কোডটিকে চলন্ত লক্ষ্য হিসাবে পরিণত করবেন না। আপনি কখনই জানতে পারবেন না যে আপনি কখন এবং কোথায় এই ভূমিকাটি নিবন্ধ করেছিলেন (আপনি তা করেননি, আপনি কেবল এটি কোথাও কোথাও, কোনওভাবে, কোনও কোনও উপায়ে স্টাফ করেছেন)। দয়া করে: এটি কখনও করবেন না। বিশেষত ভূমিকা নিয়ে নয়।
কায়সার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.