WP_USER->Add_Role产生意外结果

时间:2016-01-12 作者:Adrian

最近,我不得不编写脚本,将一些角色添加到数据库中的一组用户中。为此,我编写了如下脚本:

error_reporting(E_ALL);
require("../../wp-load.php");

$source_file = \'role_source\';

if(($source_handle = fopen($source_file, "r")) !== false) {
    while(($row = fgetcsv($source_handle)) !== false) {

        if(count($row) > 2) {

            if(($user = get_user_by(\'id\', $row[1])) !== false) {
                for($i = 2; $i < count($row); $i++) {
                    if(!$user->has_cap($row[$i])) {
                        $user->add_role($row[$i]);
                    }
                }   
            } 
        }
    }

    fclose($source_handle);
}
此操作针对的源数据如下所示:

[email protected],2,role-slug-1,role-slug-2
并用于将用户尚未拥有的每个列出的角色添加到其集合中。问题是,这不太管用。如果我看看wp_usermeta 表,位于wp_capabilities 行I可以看到正确列出的角色,以及所有后续调用WP_User->has_cap(<role name>) 返回true,但它们是唯一可以充当该用户角色的东西。使命感current_user_can() 返回false,任何允许您管理用户并授予其多个角色的插件都会拒绝该用户具有这些功能。我错过什么了吗?从文档中可以看出WP_User->add_role() 应该是我需要做的全部。

2 个回复
SO网友:urka_mazurka

这是最好的评论,但没有声誉:)

codex 他们说

“如果要定义自定义角色,并使用add\\u role()向角色添加功能,请注意,修改功能数组并重新执行add\\u role()不一定会使用新的功能列表更新角色。如果数据库中已经存在该角色,则add\\u role()函数会短路。这种情况下的解决方法是在add\\u role()调用之前使用remove\\u role()以要添加的角色为目标的调用。“”

我怀疑你可能在这条短路里

我之所以这么说,是因为(仅从粘贴的代码来看,可能会有所不同)您的脚本可能会运行多次(与插件激活挂钩的情况不同)。但这只是猜测。在这种情况下,只需挂接一次(先删除\\u role(),然后添加\\u role())就可以了

SO网友:Saikat

我不知道您为什么以这种方式编写代码来添加用户角色。和wp_usermeta 表不包含功能。它只保存分配给该特定用户的角色。功能存储到wp_options 桌子

要在Wordpress中添加角色,只需使用add_role() 作用Here 是文档。如果要删除/更改任何用户的角色,可以使用remove_role() 然后add_role() 或者只是set_role() 方法WP_UserHere 是类似的主题。

要检查用户的功能,必须将角色名称或功能名称作为的参数传递current_user_can() 作用请参阅文档here.

相关推荐

如何从USERS-edit.php中删除颜色选择器代码

我知道我不应该改变Wordpress的核心。但如果我想在“用户编辑”中使用仪表板用户配置文件页面。php和删除大块代码(如颜色选择器)的方法。从第259行到第336行-我想全部删除。<?php if ( ! ( IS_PROFILE_PAGE && ! $user_can_edit ) ) : ?> <tr class="user-rich-editing-wrap"> <th scope="