Wp_kses()会剥离数据属性,即使它在允许的列表中

时间:2017-08-09 作者:dingo_d

我添加了一个函数,该函数将返回允许的html标记数组

if ( ! function_exists( \'allowed_html_tags\' ) ) {
  /**
   * Allowed html tags for wp_kses() function
   *
   * @return array Array of allowed html tags.
   */
  function allowed_html_tags() {
    return array(
      \'a\' => array(
        \'href\' => array(),
        \'title\' => array(),
        \'class\' => array(),
        \'data\' => array(),
        \'rel\'   => array(),
      ),
      \'br\' => array(),
      \'em\' => array(),
      \'ul\' => array(
          \'class\' => array(),
      ),
      \'ol\' => array(
          \'class\' => array(),
      ),
      \'li\' => array(
          \'class\' => array(),
      ),
      \'strong\' => array(),
      \'div\' => array(
        \'class\' => array(),
        \'data\' => array(),
        \'style\' => array(),
      ),
      \'span\' => array(
        \'class\' => array(),
        \'style\' => array(),
      ),
      \'img\' => array(
          \'alt\'    => array(),
          \'class\'  => array(),
          \'height\' => array(),
          \'src\'    => array(),
          \'width\'  => array(),
      ),
      \'select\' => array(
          \'id\'   => array(),
          \'class\' => array(),
          \'name\' => array(),
      ),
      \'option\' => array(
          \'value\' => array(),
          \'selected\' => array(),
      ),
    );
  }
}
但是当我在一个变量中使用html时foreach 回路,我的data 属性被剥离。

$my_var = \'<div class="my-class" data-term="$term_id">$content</div>\';

wp_kses( $my_var, allowed_html_tags() );
这将返回

<div class="my-class">This is my content... no data attribute...</div>
我试图修改我的数组data-* 但那没用。

我希望您不必用完整的数据名修改允许的数组(data-term) 为了让它工作。。。

编辑检查Matt Thomason\'s 关于kses数据更新的回答。

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

我希望您不必修改允许使用完整数据名(数据项)的数组,这样就可以工作了。。。

看起来是这样的。data-termdata 毕竟不是同一个属性,我不认为任何类型的正则表达式都可以用作受支持的属性。

你不需要跑wp_kses() 但在您自己的标记上,您应该知道它是安全的。wp_kses() 通常仅用于处理来自用户的不可信输入。用户是否要提交数据属性,而您需要支持所有这些属性?

您可以这样做:

$my_var = \'<div class="my-class" data-term="\' . esc_attr( $term_id ) . \'">\' . wp_kses_post( $content ) . \'</div>\';
使用wp_kses_post() 这将为帖子使用默认允许的html,但它只适用于任何内容$content

SO网友:Matt Thomason

2018年12月后来到这里的任何人的最新信息:

数据-*现在在KSES筛选器中受支持,因为此提交-https://github.com/markjaquith/WordPress/commit/a0309e80b6a4d805e4f230649be07b4bfb1a56a5#diff-a0e0d196dd71dde453474b0f791828fe

现在您可以执行以下操作:

add_filter(\'wp_kses_allowed_html\', "kses_filter_allowed_html"));

function kses_filter_allowed_html( $allowed, $context )
{
    if (is_array($context))
    {
        return $allowed;
    }

    if ($context === \'post\')
    {
        $allowed[\'a\'][\'data-*\'] = true;
        $allowed[\'table\'][\'data-*\'] = true; 
        // ... keep on doing these for each HTML entity you want to allow data- attributes on
    }

    return $allowed;
}

结束

相关推荐