如何在WordPress多站点安装中允许未过滤的HTML

时间:2016-10-13 作者:Angelo C

我试图在wordpress多站点环境中创建自定义角色。这个角色的功能与管理员相同,但也可以像超级管理员一样提交未过滤的HTML。我成功地创建了角色并将unfiltered\\u html设置为true,但文本编辑器仍然会剥离iframe和其他html元素。下面是我命名为“开发者”的新角色的PHP代码。

function add_developer()
{
//remove role if it already exists
if( get_role(\'developer\') ){
      remove_role( \'developer\' );
}
//custom user role for unfiltered_html
$result = add_role(\'developer\', __(\'Developer\' ),
                  array(
                  \'read\' => true,
                  \'activate_plugins\' => true,
                  \'delete_others_pages\' => true,
                  \'delete_others_posts\' => true,
                  \'delete_pages\' => true,
                  \'delete_posts\' => true,
                  \'delete_private_pages\' => true,
                  \'delete_private_posts\' => true,
                  \'delete_published_pages\' => true,
                  \'delete_published_posts\' => true,
                  \'edit_dashboard\' => true,
                  \'edit_others_pages\'  => true,
                  \'edit_others_posts\' => true,
                  \'edit_pages\' => true,
                  \'edit_posts\' => true,
                  \'edit_private_pages\' => true,
                  \'edit_private_posts\' => true,
                  \'edit_published_pages\' => true,
                  \'edit_published_posts\' => true,
                  \'edit_theme_options\' => true,
                  \'export\' => true,
                  \'import\' => true,
                  \'list_users\' => true,
                  \'manage_categories\' => true,
                  \'manage_links\' => true,
                  \'manage_options\' => true,
                  \'manage_comments\' => true,
                  \'promote_users\' => true,
                  \'publish_pages\' => true,
                  \'publish_posts\' => true,
                  \'read_private_pages\' => true,
                  \'read_private_posts\' => true,
                  \'remove_users\' => true,
                  \'switch_themes\' => true,
                  \'upload_files\' => true,
                  \'unfiltered_html\' => true
                  )
                  );
if ( null !== $result ) {
    echo \'Yay! New role created!\';
}
else {
    echo \'Oh... the basic_contributor role already exists.\';
}

}
我正在一个团队中工作,以转换一个有数千页的大型网站,并希望避免给每个人超级管理员访问权限。我是否可以避免只针对特定用户角色使用html过滤器?如果没有,是否可以为特定用户执行此操作?我想避免改变核心,不介意删除所有过滤。我目前正在我的函数中测试这一点。我的主题的php文件,但最终将为此编写一个插件。

我知道,由于用户能够发布javascript,将存在安全风险,但如果我们不必明确授予整个团队超级管理员访问权限,我的团队愿意接受这种风险。

非常感谢您的帮助!

2 个回复
SO网友:MastaBaba

这也让我困惑了一段时间。这并不能完全解决你的问题,但这应该会让你走上正轨。

add_action( \'admin_init\', \'my_kses_remove_filters\' );
function my_kses_remove_filters() {
    $current_user = wp_get_current_user();
 
    if ( my_user_has_role( \'administrator\', $current_user ) )
        kses_remove_filters();
}
 
function my_user_has_role( $role = \'\', $user = null ) {
    $user = $user ? new WP_User( $user ) : wp_get_current_user();
 
    if ( empty( $user->roles ) )
        return;
 
    if ( in_array( $role, $user->roles ) )
        return true;
 
    return;
}
此操作将删除管理员的筛选器。首先,它获取当前用户的角色,如果角色是“管理员”,则删除编辑内容时的筛选器。

该解决方案主要从this page.

SO网友:Brett Donald

添加调用kses_remove_filters() 不适合我。实际上,我必须破解WordPress才能实现这一点。

问题是WordPress在方法中有一个全局覆盖map_meta_cap() 在里面wp-includes/capabilities.php, 忽略了unfiltered_html 如果用户不是超级管理员,则支持多站点安装。

摆脱这种干扰,你就很可爱了。当然,在你必须更新WordPress之前,你必须重新进行更新。

        case \'unfiltered_html\':
        // Disallow unfiltered_html for all users, even admins and super admins.
            if ( defined( \'DISALLOW_UNFILTERED_HTML\' ) && DISALLOW_UNFILTERED_HTML ) {
                $caps[] = \'do_not_allow\';
//          } elseif ( is_multisite() && ! is_super_admin( $user_id ) ) {
//              $caps[] = \'do_not_allow\';
            } else {
            $caps[] = \'unfiltered_html\';
            }
        break;

相关推荐

绕过WP查询中的“supress_Filters”

显然,出于某种不合逻辑的原因,开发人员决定获取所有语言帖子的唯一方法是添加supress_filters=true 到WP\\u查询(而不是像这样language_code=all 选项)。无论如何,我的情况是,我需要获取所有语言的帖子,但也需要使用过滤器修改WP\\u查询。有没有办法强制将我的过滤器添加到查询中,即使supress_filters 设置为false?这是我需要添加的过滤器:add_filter( \'posts_where\', function($where, $wp_query) {