将get_the_title()编码为Twitter分享URL

13

我正在使用直接链接并在Twitter上通过弹出窗口实现分享按钮:

<a href="https://twitter.com/intent/tweet?url=<?php echo urlencode(get_permalink());?>&amp;text=<?php echo get_the_title(); ?>&amp;via=username" target="_blank"

在所有疯狂的社交媒体插件中,这是我实现分享按钮最简单、最直接的方法。

然而,当标题中有一个&符号时,标题将破坏应该显示为状态的文本。我知道需要对标题进行urlencode()处理,但是这样做会在状态消息中显示特殊字符。

由于在Twitter分享中不需要使用+来表示空格,我需要将任何&替换为&amp;。但是,使用str_replace()似乎无法实现这一点。像<?php echo str_replace('&', '&amp;', urldecode(get_the_title())); ?>这样的操作也不起作用。


“但是当我这样做时,状态消息中会显示特殊字符”这句话的意思是什么?你最终输出的HTML是什么样子的,它在Twitter上如何显示? - deceze
它将特殊字符输出到实际状态消息中。因此,您可以在此处查看例如:https://twitter.com/intent/tweet?url=http%3A%2F%2Fgoogle.com&text=%26%238216%3BMr.+Blah+%26%23038%3B+Mrs.+Blah&via=username - AAA
1个回答

50

&在URL中有特殊含义,用于分隔多个参数。如果您的URL是...a&b...,那不代表文本"a&b",而是代表两个独立的参数。为避免这种情况,您需要对文本进行urlencode编码,将&转换为%26

&编码为&amp;仅适用于HTML中的&字符,在您的文本中不应该出现此类字符,因为所有的&都会被替换为%26

我不清楚WordPress的复杂性,但我认为get_the_title()返回的值已经经过HTML转义。也就是说,它包含&amp;而不是&,因此如果您直接发送该值到Twitter,就会发送这样的内容。你需要获取没有HTML实体的文本,即需要对其进行HTML解码,以便将&amp;转换回实际的值&。然后,需要对HTML解码后的值进行URL编码,以避免破坏URL的语法。

将它们结合起来,以下代码应该可以解决问题:

echo urlencode(html_entity_decode(get_the_title(), ENT_COMPAT, 'UTF-8'));

可能有其他方法可以直接从WordPress获取原始标题而不需要进行复杂的html_entity_decode操作,但是我对WordPress了解甚少。


PS:由于您将该URL输出到HTML上下文中,因此您应该再次对URL进行HTML编码,以确保它不会破坏您的HTML语法。尽管如此,这主要是出于学术完整性考虑,urlencode() 不应该返回任何可能破坏HTML语法的内容。但出于严谨性的考虑,在这里:

echo htmlspecialchars(urlencode(html_entity_decode(get_the_title(), ENT_COMPAT, 'UTF-8')), ENT_COMPAT, 'UTF-8');

我明白,这就是为什么我最初对其进行编码的原因,但问题在于当我对整个文本进行编码时,特殊的HTML字符会显示在实际状态中。例如,请参见此处:https://twitter.com/intent/tweet?url=http%3A%2F%2Fgoogle.com&text=%26%238216%3BMr.+Blah+%26%23038%3B+Mrs.+Blah&via=username - AAA
我正在使用get_the_title(),以便我可以在text=get_the_title()中发布推文。文章标题中偶尔会出现 '&,这并不罕见。实际输出的HTML是编码后的get_the_title(),但正如我之前所说,问题在于Twitter在状态中输出了特殊字符。我已经在谷歌上搜索了这个问题,似乎没有人有一个明确的解决方案,因为这是一个已知的问题。 ^ 我刚刚向您展示了实际输出的HTML。 - AAA
get_the_title() 返回的是已经进行 HTML 转义的文本?那么在对其进行 URL 编码之前,您需要对该文本进行 HTML 解码。如果您要 URL 编码的文本包含值 &amp;,那么这个值就会被发送到 Twitter。 - deceze
4
我认为这是其中一个应该获得更多点赞的答案。很棒的回答,并附有出色的解释。帮我省去了一些烦恼。 - Henrik Petterson
非常感谢你的出色回答,我之前一直遇到404错误,现在问题解决了!谢谢你! - undefined
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接