将角色的硬编码条件修改为自定义角色

时间:2014-03-24 作者:LPH

希望这是有意义的。我还在学习。

我正在开发的插件中有一个函数,我想修改它来识别自定义角色。

我的函数在硬编码为接受管理员、编辑、作者、贡献者和订阅者时工作。但是,我一直坚持修改条件以接受所有可编辑角色。

以下是工作代码(但硬编码):

    if ( $current_user->data->wp_capabilities[\'administrator\'] ) {
        $role = \'administrator\';
    } elseif ( $current_user->data->wp_capabilities[\'editor\'] ) {
        $role = \'editor\';
    } elseif ( $current_user->data->wp_capabilities[\'author\'] ) {
        $role = \'author\';
    } elseif ( $current_user->data->wp_capabilities[\'contributor\'] ) {
        $role = \'contributor\';
    } elseif ( $current_user->data->wp_capabilities[\'subscriber\'] ) {
        $role = \'subscriber\';
    }

    if ( isset( $role ) ) {
        /* If they are an admin then we grant them all permissions that they ask for */
        if ( $current_user->data->wp_capabilities[\'administrator\'] ) {
            foreach ( $new_caps as $new_cap ) {
                $capabilities[ $new_cap ] = true;
            }
            $user->add_role( $role );
        } /* Otherwise lets check if their role deserves that capability    */
        else {
            foreach ( $new_caps as $new_cap ) {
                if ( $wp_roles->get_role( $role )->has_cap( $new_cap ) ) {
                    $capabilities[ $new_cap ] = true;
                    $user->add_role( $role );
                }
            }
        }
    }
而不是如果。。。管理员然后分配角色。。。。它应该是一个变量。

我猜,但不知何故,可编辑角色应该可用(?)例如以下内容。

    $all_roles = $wp_roles->roles;

    $editable_roles = apply_filters(\'editable_roles\', $all_roles);
有人能帮助我,并建议如何重写条件,使其不是硬编码的吗?

非常感谢。

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

首先,检查代码有效,并采用以下模式:

if ( $current_user->data->wp_capabilities[\'hardcoded role name\'] ) {
    $role = \'hardcoded role name\';
}
因此,让我们将硬编码的角色字符串交换为一个名为$role_name (如果你愿意,可以叫它别的名字)。对角色名称的检查现在是:

if ( $current_user->data->wp_capabilities[$role_name] ) {
    $role = $role_name;
}
但我们需要检查多个角色,所以,让我们列出要检查的角色列表

$roles_to_check = array(
    \'administrator\',
    \'editor\',
    \'author\',
    \'contributor\',
    \'subscriber\'
);
然后检查列表中的每个角色

foreach ( $roles_to_check as $role_name ) {
    .. do the check ..
}
到目前为止,我们所做的一切都是标准编程,很少涉及PHP的具体知识。我建议您仔细查看循环和数组,因为您的问题表明您对这些领域缺乏知识或信心。

但我们还没有结束。您希望能够处理任意角色!

因此,让我们从get_editable_roles(). 这将为我们提供一个角色数组,但如果不稍加修改,我们无法从上面交换该数组。

$roles = get_editable_roles();
foreach ( $roles as $role_name => $role_info ) {
    .. do our check ..
}
然而,在您的情况下,您需要特定用户的角色,因此回到原始检查,您使用以下数组:

$current_user->data->wp_capabilities
因此,如果我们为循环执行此操作:

foreach ( $current_user->data->wp_capabilities as $role_name => $capability ) {
你应该能做你想做的事

结束

相关推荐