对管理员中的特定用户角色隐藏某些小部件

时间:2013-03-03 作者:dclawson

我正在寻找一种方法来隐藏特定用户类型的特定小部件,在管理,外观>小部件页面?

例如,管理员可以看到所有小部件,但作者只能看到少数几个?

我注意到有一个CodeCanyon插件,但它也需要一个框架,我没有使用它。

2 个回复
最合适的回答,由SO网友:brasofilo 整理而成

你必须检查Roles and Capabilities 在行动挂钩中widgets_init 并据此进行。

add_action( \'widgets_init\',  \'remove_widgets_wpse_89138\' , 15 );

function remove_widgets_wpse_89138()
{
    // http://codex.wordpress.org/Function_Reference/is_admin
    if( !is_admin() )
        return;

    // Grab current user info
    global $current_user;

    // Check for specific user
    /*
    $username = $current_user->user_login;
    if( \'the_user_login\' != $username)
        return;
    */

    // Check for capability
    if( current_user_can( \'add_users\' ) )
        return;

    unregister_widget( \'WP_Widget_Pages\' );
}
问:;利益相关方:

SO网友:Bainternet

实际上,我有一个专门用于此目的的类:

/**
* Hide_widgets_role_based
* @author Ohad Raz <[email protected]>
*/
class Hide_widgets_role_based{
    $has_selector = false;
    $js_selector = \'\';
    $roles_hide =array();
    /**
     * class constructor
     * @author Ohad Raz <[email protected]>
     * @param array $args [description]
     */
    function __construct($args = array()){
        if (is_admin())
            add_action(\'widgets_init\', array($this,\'hide\', 999));
    }

    /**
     * the money function that hides the widgets on the admin side when the user has a specific role
     * @return void
     */
    public function hide(){
        global $pagenow;
        if ($pagenow == \'widgets.php\'){
            global $current_user;
            get_currentuserinfo();
            $sperator = "";
            foreach ($this->roles_hide as $role => $widgets) {
                if ($this->has_role($role)){
                    foreach ((array)$widgets as $w_id) {
                        unregister_widget( $w_id );
                    }
                }
            }
        }
    }


    /**
     * add a widget to hide per role
     * @param string $role   role name
     * @param string $widget widget id
     */
    public function addHide($role,$widget){
        if (is_array($widget)){
            $tmp = isset($roles_hide[$role])? $roles_hide[$role]: array();
            $roles_hide[$role] = array_merge($tmp, (array)$widget);
        }else{
            $roles_hide[$role][] = $widget;
        }
    }

    /**
     * has_role check if a user has a role
     * @param  int  $user_id user id
     * @return boolean          
     */
    public function has_role($user_id = null){
        if ( is_numeric( $user_id ) )
            $user = get_userdata( $user_id );
        else
            $user = wp_get_current_user();

        if ( empty( $user ) )
        return false;

        return in_array( $role, (array) $user->roles );
    }
}

Usage:

$widgets_hide = new Hide_widgets_role_based();
$widgets_hide->addHide(\'contributor\',array(\'WP_Widget_Pages\',\'WP_Widget_Calendar\',\'WP_Widget_Links\'));
$widgets_hide->addHide(\'editor\',\'WP_Widget_Links\');

结束

相关推荐

Prevent widgets removal

我正在用许多小部件构建一个网站。它们是高度定制的。当站点处于活动状态时,几个管理员/编辑器必须编辑这些小部件。现在,我很害怕看到一个小部件(及其配置)可以在一次鼠标移动中完全擦除(将其从侧栏中删除)。有没有什么方法可以防止小部件被删除,同时保持编辑其内容的能力?此外,在我看来,管理中的widget管理页面为“添加widget”模块提供了太多的空间,而为“激活的widget”模块提供的空间不足。这在创建站点时很有用,但在完成站点时却毫无用处。有没有办法切换这些模块的大小?非常感谢