如何阻止自定义元框中的HTML实体被取消HTMLList?

时间:2011-07-06 作者:gillespieza

我有一个自定义的元框,它应该接受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 &amp; 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 应用程序,或者这里发生的任何事情。。。

2 个回复
最合适的回答,由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 />\';
  }
?>
这一点,再加上上面的单引号/双引号,现在可以很好地工作了。

SO网友:user3159159

这对我有用:使用esc_html() 保存元盒文本时:

$my_data = esc_html( $_POST[\'my_value\'] );

// Update the meta field in the database.
update_post_meta( $post_id, \'_my_field\', $my_data );
像往常一样检索元数据库文本:

$value = get_post_meta( $post->ID, \'_my_field\', true );

结束