【问题标题】:Encoding get_the_title() for Twitter share URL为 Twitter 分享 URL 编码 get_the_title()
【发布时间】:2012-05-29 09:20:43
【问题描述】:

我在 Twitter 上使用带有弹出式共享按钮的直接链接: <a href="https://twitter.com/intent/tweet?url=<?php echo urlencode(get_permalink());?>&text=<?php echo get_the_title(); ?>&via=username" target="_blank"

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

但是,当标题中有& 时,标题会破坏应该显示的状态文本。我知道您需要 urlencode() 标题,但是当我这样做时,它会在状态消息中显示特殊字符。

由于现在 Twitter 共享中的 [space] 不需要 +,因此我需要将任何 & 替换为 &。但是,它似乎不适用于str_replace()。由于某些原因,它会输出 HTML 特殊字符。像<?php echo str_replace('&', '&', urldecode(get_the_title())); ?> 这样的操作也不起作用。

【问题讨论】:

  • “但是当我这样做时,它会在状态消息中显示特殊字符”是什么意思?您输出的最终 HTML 是什么?它是如何在 Twitter 上显示的?
  • 它将特殊字符输出到实际的状态消息中。因此,您可以在这里查看示例:twitter.com/intent/…

标签: php wordpress twitter


【解决方案1】:

& 在 URL 中具有特殊含义,用于分隔多个参数。如果您的 URL 是 ...a&b...,它不代表文本“a&b”,它代表两个单独的参数。为避免这种情况,您需要 urlencode 文本,这会将 & 转换为 %26

& 编码为& 仅对HTML 中的& 字符是必需的,因为所有&s 都被%26 替换。

我不知道 Wordpress 的复杂性,但我认为 get_the_title() 返回的值已经被 HTML 转义。意思是,它包含& 而不是&,所以如果您像这样发送它,这就是发送到Twitter 的值。您想要的是获取没有 HTML 实体的文本,即您需要对其进行 HTML 解码以将 & 转换回实际值 &。然后需要对 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');

【讨论】:

  • 我明白了,这就是我最初对其进行编码的原因,但问题是当我对整个文本进行编码时,特殊的HTML字符会以实际状态显示。例如,请参见此处:twitter.com/intent/…
  • 为什么在 URL 中以特殊的 HTML 字符开头?同样,输出的实际 HTML 是什么?
  • 我正在使用get_the_title(),这样我就可以使用text=get_the_title() 发布推文。帖子标题中偶尔会有'&,这并不罕见。输出的实际 HTML 是编码的get_the_title(),但正如我之前所说,问题是 Twitter 正在输出状态中的特殊字符。我用谷歌搜索了这个问题,似乎没有人有明确的解决方案,因为它显然是一个已知问题。 ^ 我只是向您展示了实际输出的 HTML。
  • 所以get_the_title() 已经返回 HTML 转义文本?然后,您需要在 URL 编码之前对该文本进行 HTML 解码。如果 URL 编码的文本包含值 &,那么这就是发送到 Twitter 的值。
  • 在我看来,这是应该获得比它已经拥有的更多支持的答案之一。很好的答案,有很好的解释。让我头疼不已。
猜你喜欢
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
相关资源
最近更新 更多