Wordpress中断使用选项API存储的超链接


Wordpress breaks hyperlinks stored with the Options API

我有一个Wordpress主题,它使用update_option函数将版权行存储在Wordpress选项中。在文本中,我包含了一个返回到我的网站的链接。

Copyright &copy; 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内部正试图从它认为的页面碎片中创建一个绝对的url。我该如何阻止这种行为?我已经检查了wp-includes/options.php中定义的get_options函数,并确定它不是问题所在。问题出现在主题处理的后期。

编辑:

根据David的建议,我已经查看了DB。此选项的值在写入之前正在更改。HTML实体正在被解析,引号正在被转义。这是DB中的实际值。

Copyright © 2015 ABC Company, Inc.  All rights reserved. Site design by <a href='"http://www.example.com'">My Company</a>.

当我在数据库中手动更正时,它显示得很好。在将选项值写入DB之前,Wordpress正在执行某种后期处理或解析。

Wordpress在清理过程中不必要地转义选项值中的引号。最简单的解决方案是在将值写入数据库之前,使用pre_update_option_(选项名称)钩子来处理和删除不必要的转义符。这个钩子可以在主题的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' );

我有意避免使用PHP的stripslashes函数,以保持代码简单,并避免检查魔术引号。

Wordpress实际上并没有为超链接目的地做任何准备。但是,由于超链接不能用转义引号识别,因此会将其视为导致所述行为的相对链接。