WordPress esc_attr返回空字符串

时间:2016-12-09 15:50:56

标签: php wordpress escaping

我有一个输入名称=“title”的表单,在functions.php中我只是从该表单中获取所有数据

以下是代码:

$title = $_POST['title'];
print_r($_POST);
var_dump($title);
var_dump(esc_attr($title));

预期结果将是相同的字符串,但是,我不知道为什么,WordPress在esc_attr上显示一个空字符串

这是输出:

Array ( [title] => Swedish House Mafia – Doooon\'t You Worry Child ft. John Martin )

string(63) "Swedish House Mafia – Doooon\'t You Worry Child ft. John Martin" 

string(0) "" 

它与被称为title的输入字段或被称为$title的变量无关,并且与WordPress中的其他内容冲突,我不知道为什么转义函数不起作用。

3 个答案:

答案 0 :(得分:0)

让我们逐步探讨可能导致此问题的思考过程。

使用所显示的代码,代码中的任何内容都不会影响变量或$_POST。您只是一个接一个地回显每个变量(如上所示)。

这意味着esc_attr的某些事情很糟糕。可能性是什么:

  1. 此功能尚不可用。
  2. 有些东西会覆盖返回的值和行为。
  3. 可能性1不可行,因为您正在使用主题的function.php文件。 WordPress在调用主题时加载了转义函数。要检查一下,你可以这样做:

    echo function_exists( 'esc_attr' ) ? 'yes, loaded' : 'whoops, not loaded';
    

    这给我们留下了可能性2.让我们看一下WordPress Core中的函数。

    function esc_attr( $text ) {
        $safe_text = wp_check_invalid_utf8( $text );
        $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
        /**
         * Filters a string cleaned and escaped for output in an HTML attribute.
         *
         * Text passed to esc_attr() is stripped of invalid or special characters
         * before output.
         *
         * @since 2.0.6
         *
         * @param string $safe_text The text after it has been escaped.
         * @param string $text      The text prior to being escaped.
         */
        return apply_filters( 'attribute_escape', $safe_text, $text );
    }
    

    有3个与文本交互的功能。我在前两个看不到任何东西。但是,请查看过滤器事件attribute_escape。任何其他插件或主题都可以注册到该事件并更改返回的文本,包括返回空字符串。

    这听起来像是一个极有可能的候选人。

    后续步骤

    当文本通过esc_attr()时,正在踩踏(过滤)文本。您需要消除所有变量,将网站剥离到基本的基础,然后查看问题是否自行解决。

    以下步骤是发现问题所在的过程。这是一种消除方法。当您浏览它时,它将帮助您确定哪个组件(主题,插件,甚至核心)正在影响它。

    1. 第1步:拒绝所有插件
    2. 第2步:将代码移至主题functions.php文件的顶部。为什么?当functions.php文件首先加载时,它会消除主题中的任何内容影响文本。
    3. 第3步:手动将标题添加到$_POST['title']。作为functions.php中的第一行:$_POST['title'] = "Swedish House Mafia – Doooon't You Worry Child ft. John Martin";
    4. 第4步:刷新浏览器。
    5. 它是否正常工作,意味着esc_attr()返回字符串?

      不,问题仍然存在。

      嗯,这意味着WordPress Core中的内容并不好玩。您可以通过深入研究Core并找出导致冲突的原因进行调查。或重新加载它的新版本。

      是的,问题已经消失了

      一次添加一个插件。刷新浏览器。检查问题是否再次出现。如果是,那么您找到了导致它的插件。

      现在是什么?

      找到罪魁祸首后,您可以采取措施解决问题。然后,您可以从我添加的functions.php文件中删除代码。

答案 1 :(得分:0)

这可能是极端情况,但我遇到了同样的问题,问题出在多字节字符上。

我的代码如下所示:esc_attr( substr( $desc, 0, 152 ) )

没有 esc_attr() 也能工作,但我有时会得到 � 字符。当它运行 esc_attr() 时,我什么也没得到。

所以我的解决方案是用 mb_substr() 替换 substr()。了解差异 in this answer

答案 2 :(得分:-2)

使用此代码检索数据

echo esc_attr( $title );