DISALOW_FILE_EDIT常量被忽略

时间:2017-06-30 作者:indextwo

在我的wp-config.php 文件,我有一句话:

define(\'DISALLOW_FILE_EDIT\', true);

我总是将此作为标准包含在所有网站上,并且它总是完全按照预期工作。然而,我刚刚注意到,在一个客户的网站上,它已经停止工作。

他们有一个用户角色编辑器插件,用来定义一些自定义角色。一旦设置了角色,插件就被停用(角色不需要处于活动状态才能存在),角色的所有上限都通过自定义插件控制。

然而,自上次插件更新以来,它看起来像wp_user_roles 数据库中的条目已更新,管理员级用户现在可以访问主题文件编辑器;插件,尽管DISALLOW_FILE_EDIT 仍被定义为true。

我在我的一个插件中添加了一个过滤器,它的作用与wp-includes/capabilities.php:

function vnmAdmin_preventFileEdits($required_caps, $cap, $user_id, $args) {

    $blocked_caps = array(
        \'edit_files\',
        \'edit_plugins\',
        \'edit_themes\',
    );

    if (in_array($cap, $blocked_caps)) {
        $required_caps[] = \'do_not_allow\';
    }

    return $required_caps;
}

add_filter(\'map_meta_cap\', \'vnmAdmin_preventFileEdits\', 10, 4);
。。。但这仍然不起作用。无论我做什么,我都无法删除edit_files/themes/plugins 管理员用户的能力。我当然想这么做。

我还缺什么吗?

1 个回复
SO网友:indextwo

这似乎是由于(我假设)用户角色编辑器插件被更新,然后直接影响wp_user_role 上的字段options 数据库的表DISALLOW_FILE_EDIT 正在被忽略。

我必须采取几个步骤来解决这个问题,因为我创建了自定义用户角色,以及WooCommerce添加的角色。我采取的步骤:

复制了wp_user_roles 字段,以便我手头有一个包含所有自定义用户角色的序列化数组

  • 在用户角色编辑器插件处于活动状态时,转到Settings->User Role Editor, 单击Tools 选项卡,然后单击红色Reset 按钮(注意有关此重置的警告ALL 用户角色)。完成后,插件/主题文件编辑器消失了-DISALLOW_FILE_EDIT 不再被忽视
  • 停用用户角色编辑器,然后重新激活WooCommerce(以重新添加WooCommerce用户角色,如Customer&Shop Manager)
  • 编写了一个自定义插件,以添加用户角色编辑器先前添加的角色

    //  Activate the plugin
    
    function myPlugin_install() {
        addCustomRoles();
    }
    
    register_activation_hook( __FILE__, \'myPlugin_install\');
    
    //  Add the custom roles
    
    function addCustomRoles() {
        $userRolesArray = array();
    
        $userRolesArray[\'content_management\'] = array(
            \'name\'  => \'Content Management\',
            \'capabilities\'  => array(
                \'level_0\' => true,
                \'level_1\' => true,
                \'level_2\' => true,
                \'level_3\' => true,
                \'edit_published_pages\' => true,
                \'edit_published_posts\' => true,
                \'edit_published_products\' => true,
            )
        );
    
        $userRolesArray[\'content_consumer\'] = array(
            \'name\'  => \'Content Consumer\',
            \'capabilities\'  => array(
                //  etc.
            )
        );
    
        foreach($userRolesArray as $role=>$detailsArray) {
    
            $result = add_role(
                $role,
                $detailsArray[\'name\'],
                $detailsArray[\'capabilities\']
            );
        }
    }
    
    然后我停用(&A);重新激活了我的自定义插件和boom,所有用户角色都恢复了原来的状态,文件编辑器再次在所有角色中禁用。

  • 结束