确认(&H)
是的,目前没有办法修改管理菜单页面的访问参数。唯一可以通过公共wp API修改的是“注释”菜单项。所有其他都是手工注册的。
但是有人来帮忙@scribu (read more at the trac ticket) 迄今为止,世卫组织已经付出了大量努力,为core带来了更有用的东西。
解释
当深入查看核心时,您将看到函数
wp_widgets_add_menu()
在…内
~/wp-includes/functions.php
. 这一个基本上添加了子菜单项,因为WP 2.2…
function wp_widgets_add_menu() {
global $submenu;
$submenu[\'themes.php\'][7] = array( __( \'Widgets\' ), \'edit_theme_options\', \'widgets.php\' );
ksort( $submenu[\'themes.php\'], SORT_NUMERIC );
}
此函数将添加到
_admin_menu
采取的行动
wp_maybe_load_widgets()
作用
菜单项的中间解决方法;widgets页面当前是加载默认小部件并注册子菜单项(即wp_maybe_load_widgets
) 在plugins_loaded
挂钩优先级为0
.
这使得用普通插件注销它变得很困难。因此,您需要在mu-plugins
文件夹
<?php
/* Plugin Name: »Kaisers« Deny Widgets page access */
! defined( \'ABSPATH\' ) AND exit;
// Init the plugin
add_action( \'muplugins_loaded\', array( \'wpse6106_deny_widgets\', \'init\' ), 0 );
class wpse6106_deny_widgets
{
static public $instance;
public $required_cap = \'SET_CUSTOM_CAP_HERE\';
/**
* Get the instance of the plugin
* @since 2012-08-07.1505
* @return void
*/
static function init()
{
null === self :: $instance AND self :: $instance = new self;
return self :: $instance;
}
/**
* Setup
* Removes the default function that registers the widgets.php sub menu item.
* @since 2012-08-07.1505
* @return void
*/
function __construct()
{
// remove core function...
remove_action( \'plugins_loaded\', \'wp_maybe_load_widgets\', 0 );
// ...and add our own
add_action( \'admin_head\', array( $this, \'widgets_menu_access\' ), 0 );
// Then abort any attempt to access the widgets page
add_action( \'load-widgets.php\', array( $this, \'widgets_page_access\' ), 0 );
}
/**
* Adds an action, that re-registers the sub menu item with a custom capability.
* @since 2012-08-07.1505
* @return void
*/
function widgets_menu_access()
{
global $submenu;
// Call default widgets file
require_once( ABSPATH . WPINC . \'/default-widgets.php\' );
$submenu[\'themes.php\'][7] = array(
__( \'Widgets\' )
,$this->required_cap
,\'widgets.php\'
);
ksort( $submenu[\'themes.php\'], SORT_NUMERIC );
}
/**
* Does a second check if someone without the custom cap entered the widgets page and dies.
* @since 2012-08-07.1505
* @return void
*/
function widgets_page_access()
{
get_currentuserinfo();
global $current_user;
if ( ! current_user_can( $this->required_cap ) )
wp_die( __( \'Cheatin’ uh?\' ) );
}
}
只需将其放入您的MU插件文件夹,调整
SET_CUSTOM_CAP_HERE
插件内的字符串(顶部的类变量↑) 你已经准备好了。确保您使用的是某种角色管理器(如
Members, 这允许您将此角色仅授予那些打算访问widgets页面的人。或者使用一些自己的/自定义插件手动添加它。
还要确保用户没有一些遗留的功能。如果它不起作用,请停用所有插件,切换回二十/十一,并使用如下插件重置本地数据库»WordPress Reset«.
经验证的结果
注意:插件已经过测试,可以在普通安装中使用
禁用默认窗口小部件和子菜单项注意:这仅适用于以后的读者,他们希望将其全部删除
如果您想完全摆脱所有默认小部件,那么有一个简单的过滤器,您可以调用它,它停止包含~/wp-includes/default-widgets.php
文件并禁用页面注册:
add_filter( \'load_default_widgets\', \'__return_false\' );