我有一个Wordpress主题,使用update_option
功能在Wordpress选项中存储版权行。在文中,我将链接包含在我的网站上。
Copyright © 2015 ABC Company, Inc. Site design by <a href="http://www.example.com">My Company</a>.
然后在主题的页脚中检索该信息。
<p id="footer-copyright"><?php echo get_option('copyright'); ?></p>
但是,该链接显示为http://www.blogsite.com/"http://www.example.com/"
。我假设内部Wordpress试图从它认为是页面slug的东西创建一个绝对URL。我怎么能阻止这种行为?我检查了get_options
中定义的wp-includes/options.php
函数,并确定它不是问题。问题发生在主题处理的后期。
根据大卫的建议,我检查了数据库。在写入之前,此选项的值正在被更改。正在解析HTML实体并且正在转义引号。这是DB中的实际值。
Copyright © 2015 ABC Company, Inc. All rights reserved. Site design by <a href=\"http://www.example.com\">My Company</a>.
当我在数据库中手动更正它时,它显示正常。在将选项值写入数据库之前,Wordpress正在执行某种后处理或解析。
答案 0 :(得分:0)
Wordpress在其清理过程中不必要地逃避选项值中的引号。最简单的解决方案是在将值写入数据库之前使用pre_update_option_(option name) hook处理并删除不必要的转义字符。此挂钩可以在您的主题functions.php
文件中实现。 (NAME
所有大写字母中的update_option
应替换为function myplugin_update_option_NAME( $new_value, $old_value ) {
$new_value = str_replace('\"', '"', $new_value); // replaces \" with "
return $new_value;
}
function myplugin_init() {
add_filter( 'pre_update_option_NAME', 'myplugin_update_option_NAME', 10, 2 );
}
add_action( 'init', 'myplugin_init' );
函数中其他位置定义的选项的名称。
stripslashes
我故意避免使用PHP的Sites.destroy_all({ :_id => BSON::ObjectId('5685a45be4b06ab5911dcd12')})
函数来保持代码简单并避免检查魔术引号。
Wordpress实际上并没有将任何内容添加到超链接目标。但是,由于超链接无法使用转义引号进行识别,因此将其视为导致所述行为的相对链接。