Php WordPress esc_attr返回空字符串

Php WordPress esc_attr返回空字符串,php,wordpress,escaping,Php,Wordpress,Escaping,我有一个输入名为title的表单,在functions.php中,我只是从该表单获取所有数据 代码如下: $title = $_POST['title']; print_r($_POST); var_dump($title); var_dump(esc_attr($title)); 预期结果将是相同的字符串,但我不知道为什么,WordPress在esc_attr one上显示一个空字符串 以下是输出: Array ( [title] => Swedish House Mafia – Do

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

代码如下:

$title = $_POST['title'];
print_r($_POST);
var_dump($title);
var_dump(esc_attr($title));
预期结果将是相同的字符串,但我不知道为什么,WordPress在esc_attr one上显示一个空字符串

以下是输出:

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中的其他内容冲突无关,我不知道为什么转义函数不起作用。

使用此代码检索数据

echo esc_attr( $title );

让我们通过思考过程了解什么可能是这个问题的原因

对于所显示的代码,代码中的任何内容都不会影响变量或$\u POST。正如上面介绍的那样,您只是一个接一个地回显每个变量

这意味着esc_attr有问题。可能的情况是:

该功能尚不可用。 某些内容正在覆盖返回的值和行为。 可能性1不可行,因为您正在使用主题的function.php文件。WordPress在调用主题时已加载转义函数。要检查这一点,您可以执行以下操作:

echo function_exists( 'esc_attr' ) ? 'yes, loaded' : 'whoops, not loaded';
这给我们留下了可能性2。让我们看看中的函数

有3个与文本交互的函数。前两个我什么都没看到。但是,请查看过滤器事件属性_escape。任何其他插件或主题都可以注册到该事件并更改返回的文本,包括返回空字符串

这听起来很有可能成为候选人

下一步 当文本通过esc_attr时,某些内容正在对其进行过滤。您需要消除所有变量,将站点剥离到最基本的部分,然后查看问题是否自行解决

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

步骤1:停用所有插件 步骤2:将代码移到主题的functions.php文件的顶部。为什么?在首先加载functions.php文件时,它消除了主题中的任何内容对文本的影响。 步骤3:手动将标题添加到$\u POST['title']。放在functions.php中的第一行:$\u POST['title']=瑞典房屋黑手党–Dooon't You sure Child ft.John Martin;。 步骤4:刷新浏览器。 它是否正常工作,即esc_attr返回字符串

不,问题还在发生。 嗯,这意味着WordPress核心中的某些东西玩得不好。你可以通过挖掘核心并找出冲突的原因来进行调查。或者重新加载它的新版本

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

现在怎么办?
一旦找到了罪魁祸首,就可以采取措施解决问题。然后,您可以从我让您添加的functions.php文件中删除代码

这可能是边缘情况,但我有同样的问题,问题是多字节字符

我的代码如下所示:esc_attr substr$desc,0152

没有esc_attr,它可以工作,但有时我会�-性格当通过esc_attr运行它时,我什么也没有得到


所以我的解决方案是用替换substr。请阅读差异。

再次说明,更改变量名称对此没有影响。如果我手动将标题放入一个变量中,然后转义\u attr,它就会工作。它在$POST中不起作用如果设置了标题,则可以使用此代码echo esc\u attr$title获取数据;我很想看看这个问题的答案,虽然我想知道我们是否需要更多实际使用的代码,但现在还不明白为什么会得到$title的var转储,而不是esc_attr$title。出于好奇,当您尝试$esc_title=esc_attr$title时,是否会得到相同的非结果;echo$esc_title?如果您强烈怀疑它是其他地方作用于“attribute_escape”的过滤器,那么您可以在主题和插件文件夹中搜索它,而不是执行停用/重新激活例程。
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 );
}