WordPress:从短代码中删除#038

时间:2012-12-13 06:03:00

标签: wordpress special-characters shortcode

简短代码的简单示例:

function s_print( $atts ){
    return 'http://abc.com/?foo=1&bar=2';
}
add_shortcode( 'my_shortcode', 's_print' );

它返回:

http://abc.com/?foo=1&bar=2

此功能通过短代码[my_shortcode]插入指向页面正文的链接,但&始终更改为&#038,这会破坏链接(它不再起作用)。 我google了很多。有一些解决方案:

wp_specialchars_decode($foo);
remove_filter('the_content','wptexturize');

但这些似乎仅用于主题(functions.php),并且它不适用于短代码(我尝试在短代码函数之前或之内添加它)。

我不想归结为最后一个解决方案,即在WordPress formatting.php文件中注释某些行,因为我正在处理一个将被许多人使用的插件。

3 个答案:

答案 0 :(得分:5)

我遇到过与clean_url过滤器相关的类似问题。请参阅我的回答here上的修改。

它不是短代码,所以我不能保证它会在你的特定情况下工作。可能值得一试。

oyatek

编辑 (来自链接的修改后的解决方案):

function so_handle_038($content) {
    $content = str_replace(array("&","&"), "&", $content); 
    return $content;
}
add_filter('the_content', 'so_handle_038', 199, 1);

答案 1 :(得分:3)

事实是,当您使用Visual Editor时,&将更改为&。但是,如果您使用文本编辑器,则单&后跟无字符保持不变,而&sth将更改为&sth

总共&将更改为&&。我认为上面的解决方案:

function so_handle_038($content) {
    $content = str_replace(array("&","&"), "&", $content); 
    return $content;
}
add_filter('the_content', 'so_handle_038', 199, 1);

是一种矫枉过正,因为so_handle_038();会对&中的所有&$content进行解码,而在您的情况下,您只需解码$atts数组。您的短代码条目可能是这样的:

[my_shortcode url="http://abc.com/?foo=1&bar=2" /]

$atts将是:

array( 'url' => "http://abc.com/?foo=1&bar=2" )

或:

array( 'url' => "http://abc.com/?foo=1&bar=2" )

因此您只需要解码$atts['url']

html_entities_decode($atts['url']);

在你尝试对它做任何事情之前。

答案 2 :(得分:0)

这是一个我用过的绑带黑客,基本上是为了解决wordpress中的问题(因为我在iFrame中有我的链接),我去了Bitly并创建了一个没有&符号的链接。标志!所以最后我得到了一个DIDN&T已经拥有任何&的链接。标志,但STILL指向同一位置(另外,我通过Bit.ly获得链接的免费跟踪,因此我可以检查链接被点击的次数的双倍奖励)。不是" Best"解决方案,但它对我有用,我没有时间浪费时间试图找出其他解决方案。 Wordpress中的符号。