Кодирование get_the_title() для URL-адреса в Twitter

Я использую прямую ссылку со всплывающим окном для кнопки совместного доступа в Twitter: <a href="#" onclick="location.href='https://twitter.com/intent/tweet?url=<?php echo urlencode(get_permalink());?>&amp;text=<?php echo get_the_title(); ?>&amp;via=username'; return false;" target="_blank"

Со всеми сумасшедшими плагинами социальных сетей, это самый простой и самый прямой способ для меня реализовать кнопку совместного доступа.

Однако, когда в заголовке есть &, заголовок будет разбивать текст, который должен отображаться для статуса. Я понимаю, что вам нужно urlencode() заголовок, но когда я это сделаю, он отображает специальные символы в сообщении о состоянии.

Поскольку вам не нужен + для [space] в общем доступе в Twitter, мне нужно заменить любой & на &amp;. Однако он не работает с str_replace(). Он по некоторым причинам выводит специальные символы HTML. Выполнение чего-то вроде <?php echo str_replace('&', '&amp;', urldecode(get_the_title())); ?> тоже не работает.

Ответ 1

& имеет особое значение в 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'));

Могут быть другие способы получить исходный заголовок без HTML-объектов непосредственно из 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');