我有一个自定义的元框,它应该接受HTML,但我试图输入的文本包含双引号和单引号(以及符号),它会弄乱保存的数据-每次我重新加载帖子时,数据都会被复制,并在末尾插入一个额外的单引号(和尖括号)。我猜它试图用单引号“关闭”它认为是一个未关闭的短语,而实际上它是一个撇号。
我现在可以通过在撇号中使用html字符代码暂时解决这个问题,但(a)这并不是最终的解决方案,因为我无法控制主题推出后其他用户可能输入的内容,以及(b)页面重新加载后,html字符再次被撇号替换,这意味着如果我保存任何进一步的更改,我将回到原点。
那么,如何在不剥离html标记的情况下“转义”元数据库中的html内容呢?我是否应该使用特殊的wordpress函数/钩子/动作/等或特殊的metabox格式,还是应该在PHP手册中查找?
PS:它还“删除”任何html字符,如&
, 因此帖子无法正确验证,因为现在有&
在文本中。
UPDATE:<那么谁知道单引号和双引号在简单php中有什么不同呢?我通过在代码中替换引号,成功地修复了撇号的奇怪重复和“更正”。
我的原始代码是:
echo "<textarea class=\'meta-textarea\' style=\'width: 100%;\' cols=\'20\' rows=\'2\' name=\'" . $meta_box[\'name\'] . "_value\' value=\'" . $meta_box_value . "\'>" . $meta_box_value . "</textarea><br />";
如果我保存以下短语:
<p>Blah & blah \'blah\'</p>
在生成的文本框中,它将返回
\'><p>Blah & blah \'blah\'</p>
.
如果我只是交换代码中的单引号和双引号,如下所示:
echo \'<textarea class="meta-textarea" style="width: 100%;" cols="20" rows="2" name="\' . $meta_box[\'name\'] . \'_value" value="\' . $meta_box_value . \'">\' . $meta_box_value . \'</textarea><br />\';
然后它就可以正常工作了(除了html实体,这仍然是一个问题)。
这两行代码放在一起,所以您可以看到我没有遗漏任何引号(顶部有效,底部无效):
echo \'<textarea class="meta-textarea" style="width: 100%;" cols="20" rows="2" name="\' . $meta_box[\'name\'] . \'_value" value="\' . $meta_box_value . \'">\' . $meta_box_value . \'</textarea><br />\';
echo "<textarea class=\'meta-textarea\' style=\'width: 100%;\' cols=\'20\' rows=\'2\' name=\'" . $meta_box[\'name\'] . "_value\' value=\'" . $meta_box_value . "\'>" . $meta_box_value . "</textarea><br />";
所以,现在,奇怪的重复问题已经解决了(虽然我不明白为什么-我认为如果你不做任何奇怪的替换,单引号和双引号是可以互换的,等等。剩下的问题是-我如何阻止文本
htmlspecialchars_decode
应用程序,或者这里发生的任何事情。。。
最合适的回答,由SO网友:gillespieza 整理而成
如果允许我在这里回答我自己的问题:我找到了一种方法,通过使用<?php esc_textarea( $text ) ?>
, 如法典所述:http://codex.wordpress.org/Function_Reference/esc_textarea.
不确定这是否是正确的做法,但它确实有效。我的(剪下的)元盒代码现在看起来是这样的:
<?php
if ( $meta_box[\'type\'] == "textarea" ) {
$meta_box_value = esc_textarea( get_post_meta($post->ID, $meta_box[\'name\'].\'_value\', true) );
echo \'<textarea class="meta-textarea" style="width: 100%;" cols="20" rows="2" name="\' . $meta_box[\'name\'] . \'_value">\' . $meta_box_value . \'</textarea><br />\';
}
?>
这一点,再加上上面的单引号/双引号,现在可以很好地工作了。