我有一个输入名称=“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中的其他内容冲突,我不知道为什么转义函数不起作用。
答案 0 :(得分:0)
让我们逐步探讨可能导致此问题的思考过程。
使用所显示的代码,代码中的任何内容都不会影响变量或$_POST
。您只是一个接一个地回显每个变量(如上所示)。
这意味着esc_attr
的某些事情很糟糕。可能性是什么:
可能性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()
时,正在踩踏(过滤)文本。您需要消除所有变量,将网站剥离到基本的基础,然后查看问题是否自行解决。
以下步骤是发现问题所在的过程。这是一种消除方法。当您浏览它时,它将帮助您确定哪个组件(主题,插件,甚至核心)正在影响它。
functions.php
文件的顶部。为什么?当functions.php
文件首先加载时,它会消除主题中的任何内容影响文本。$_POST['title']
。作为functions.php
中的第一行:$_POST['title'] = "Swedish House Mafia – Doooon't You Worry Child ft. John Martin";
。 它是否正常工作,意味着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 );