该插件是否应在激活时将此功能添加到所有管理员帐户?
如果是这样:WordPress是否可以将功能添加到所有子博客管理员和超级管理员?多站点安装,还是该功能需要由插件处理?
#1 楼
删除添加的内容首先,请确保在激活时添加的所有内容在卸载时也会被删除。我有一个简短的教程,其中包括示例代码。
使用一个小插件进行测试:
我对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;
。这样一来,只要将包含最后一个参数的上限添加为true,即可将单个用户列入白名单。#2 楼
对于我当前正在使用的插件,我想基于每个角色授予/限制对插件设置(即相应的管理菜单页面)的访问。因此,我必须添加一个新插件-
,不幸的是,kaiser的答案似乎不再起作用,所以我花了一些时间试图弄清楚如何允许上述功能。
时间表
在我与您分享代码之前,这是全部内容,以纯文本格式显示:
关于插件激活,将新功能
capability
添加到具有特定内置功能user roles
的角色中(在我的情况下为THE_NEW_CAP
)。在每个页面加载中,执行1。(即,再次添加功能)。仅当您要考虑激活插件后创建的可能的新角色时,才需要执行此操作。因此,这些新角色即使具有必需的内置功能也没有特定于插件的功能。
将新功能用于您想要的任何功能。如前所述,我使用它来授予/限制访问插件的管理菜单页面,因此在以下代码示例中将执行此操作。
在停用插件时,请删除该功能。当然,在卸载插件时,您也可以这样做。无论哪种方式,最终都可以做到。
代码
上面的列表转换为代码:
»进行设置Up
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');
}
}
}
}
注意:请不要使用大写功能。这只是为了提高可读性。
评论
始终使用get_editable_roles()来获取要编辑的角色。否则,您将破坏插件。
– fuxia♦
13年4月28日在17:38
@toscho好吧,我想这是即使是法典也不知道的功能之一;;)当然,此功能有其存在的权利,但是,我看不到使用全局WP_Roles数组中断就我而言,任何插件。
–tfrommen
13年4月28日在17:44
一些插件会创建专门的用户角色,并依赖于确切的功能集。在某些情况下,一种功能会在程序逻辑中排除对另一种功能的使用。您不知道是什么时候。
– fuxia♦
13年4月28日在17:54
#3 楼
这对我有用: 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 );
}
}
}
}
评论
永远不要修改角色的全局变量!决不。别!您不会触发任何钩子和拒绝过滤器,也不会使代码成为移动目标。没有人会知道您何时何地注册了该角色(您没有,只是将其塞在某个地方,无论何时何地)。请:永远不要那样做。特别是没有角色。
– kaiser
19-10-13在16:46
评论
详细博客:goo.gl/xNuafH