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

Я использую прямую ссылку со всплывающим окном для кнопки совместного доступа в 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() название, но когда я это сделаю, он отображает специальные символы в сообщении о состоянии.

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

& имеет особое значение в URL-адресах для разделения нескольких параметров. Если ваш URL-адрес ...a&b... , который не представляет текст «a & b», он представляет два отдельных параметра. Чтобы этого избежать, вам нужно urlencode текст, который превращается & в %26 .

Кодирование & &amp; необходимо только для символов & символов в HTML, которые вы не должны иметь в своем тексте, так как все они заменяются на %26 .

Я не знаю сложностей WordPress, но я думаю, что get_the_title() возвращает значение, которое уже 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. Это в основном для академической полноты, хотя urlencode() не должен возвращать ничего, что может нарушить синтаксис HTML. Но только для педантичной полноты, здесь:

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