对 Twitter 共享 URL 进行编码 get_the_title()


Encoding get_the_title() for Twitter share URL

我在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共享中[space] +,因此我需要将任何&替换为&amp;。但是,它似乎不适用于str_replace()。由于某些原因,它输出 HTML 特殊字符。做<?php echo str_replace('&', '&amp;', urldecode(get_the_title())); ?>这样的事情也行不通。

&

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实体的原始标题,而无需进行复杂的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');