Каков надлежащий фильтр для добавления html в заголовок страницы / страницы?

Я хочу использовать текст Юникода Мьянмы в своем блоге. К сожалению, псевдо-Юникодские шрифты Мьянмы распространены. Итак, я пишу плагин, который объединит все фразы Мьянмы с тегами HTML span и с помощью css, чтобы выбрать правильный шрифт.

Все работает отлично для контента, комментариев и т. Д. Однако после добавления HTML с помощью hook_title, этот HTML-код экранируется, а затем включается в атрибут title тега ссылки в последнем разделе сообщений. Кроме того, я вижу необработанные HTML-теги в имени сообщения на моем почтовом ящике администратора.

Как мне решить эту проблему? Я предпочитаю делать все из своего плагина, а не изменять файлы темы или что-то в этом роде.

Вот мой код:

add_filter( 'the_title', 'addThemSpans'); function addThemSpans($theTitle) { // functionality to add span tags to $theTitle so that a title that looks like this... // LatinTextHere ကကကကက​ MoreLatinText // becomes this... // LatinTextHere <span class="myText">ကကကကက</span> MoreLatinText // in the final output. return $theModifiedTitle; } 

Как и сейчас, атрибут title для ссылки в последнем виджете боковой панели сообщений установлен в:

 LatinTextHere &lt;span class='myText'&gt;ကကကကက&lt;/span&gt;<span class='myText'>ကကကကက</span> MoreLatinText 

Что не так.

Solutions Collecting From Web of "Каков надлежащий фильтр для добавления html в заголовок страницы / страницы?"

the_title – правильный крючок. Вы можете подтвердить это, проверив источник .

То, что вы делаете, немного странно, но имеет смысл. Умное решение, но я не думаю, что это ожидалось. Проблема, с которой вы сталкиваетесь, выглядит следующим образом:

http://core.trac.wordpress.org/browser/tags/3.5/wp-includes/default-widgets.php#L574

 <a href="<?php the_permalink() ?>" title="<?php echo esc_attr( get_the_title() ? get_the_title() : get_the_ID() ); ?>"><?php if> (get_the_title() ) the_title(); else the_ID(); ?></a> 

И нет крюка, который поможет вам. Виджет захватывает заголовок с помощью get_the_title и не передает его через все, что вы можете манипулировать.

Думаю, вам, возможно, придется пересмотреть свой подход.

  1. Если это ситуация, когда вы можете редактировать тему, вы можете удалить фильтр до того, как боковые панели будут работать, и затем добавьте их обратно. Я думаю, что это самый простой способ сделать это, но может быть невозможен в вашем случае.

  2. Вы также можете написать свой собственный виджет последних сообщений.

  3. Вы можете манипулировать вашими шрифтами с помощью Javascript – не уверен, что это будет достаточно для вас.

Возможно, вы сможете проверить переменную $instance в вашей филе и разобраться, имеете ли вы дело с виджетами или нет.

 add_filter( 'the_title', 'addThemSpans'); function addThemSpans($theTitle) { global $instance; var_dump($instance); // see if this works. // functionality to add span tags to $theTitle so that a title that looks like this... // LatinTextHere ကကကကက​ MoreLatinText // becomes this... // LatinTextHere <span class="myText">ကကကကက</span> MoreLatinText // in the final output. return $theModifiedTitle; } 

Я не знаю, будет ли это работать или нет, но если это даст вам возможность включить, и вам не придется редактировать тему. Изменить: проверено. К сожалению, не работает.

Итак, происходит то, что the_title_attribute() , который выводит атрибут title в ссылках виджетов последних сообщений, вызывает get_the_title() ; таким образом, ваш фильтр the_title применяется к строке, возвращаемой параметром__ the_title_attribute() .

Одна из идей заключалась бы в том, чтобы get_the_title вызывается из основного цикла запроса (оставьте: если вы используете WP_Query() , этот подход не будет работать для них).

Возможно, что-то вроде этого (непроверено).

редактировать

Это не будет работать как написано. Если бы вы могли найти способ захватить текущий объект $query из get_the_title() , вы могли бы сделать что-то вроде этого:

 function wpse82297_filter_the_title( $title ) { // Need some way to identify the current query object $query = ''; // If this isn't the main query, return if ( ! $query->is_main_query() ) { return $title; } else { // Your $title filtering goes here return $modified_title; } } add_filter( 'the_title', 'wpse82297_filter_the_title' ); 

Таким образом, это предотвратит применение фильтра к элементам Nav Menu, виджетам последних записей и т. Д. – ничего, кроме основного цикла запросов.

Я оставлю это здесь как ответ, если кто-нибудь может подумать о способе идентифицировать текущий объект $query .

Хорошо, мне показалось, что я выложу свое окончательное решение здесь, если у кого-то другая проблема. В принципе, я должен добавить новые привязки к моим файлам тем, а затем отправить измененный заголовок сообщения этим крючкам.

Мой код плагина теперь выглядит так:

 add_filter( 'the_html_safe_title', 'addThemSpansToPostTitles' ); function addThemSpansToPostTitles() { global $post; echo addThemSpans($post->post_title); // This is the same function I listed in the question. } 

Затем в файлах шаблонов тем, где раньше это было:

 <?php the_title(); ?> 

Я меняю его на:

 <?php do_action( 'the_html_safe_title' ); ?> 

Это меньше, чем идеально для по крайней мере двух причин:

  1. Заголовки в таких местах, как виджет «Последние сообщения», не содержат вставленных пролетов, а это означает, что в зависимости от браузера браузера, настроек шрифта и установленных шрифтов зритель по-прежнему будет видеть искаженный текст в этих местах.

  2. Это затрудняет обмен плагином с другими блоггерами из Мьянмы, которые могут не обладать техническими навыками для изменения своих тем и, возможно, не захотят использовать мою тему.

Внимание разработчиков WordPress: я видел значительное количество людей в Интернете, желающих, чтобы они могли включать HTML в свои публикации и названия страниц. Позволение нам сделать это имеет большой смысл не только для особых ситуаций, таких как мои, но и для пользователей, которые хотят изменить свои названия другими способами. Пожалуйста, подумайте об изменении будущих текстовых сообщений, чтобы HTML в заголовках.

Вы можете преобразовать их обратно, просто используя htmlspecialchars() , который является родной функцией PHP.

Из руководства:

Выполненные переводы:

  • '&' (амперсанд) становится '&amp;'
  • '"' (двойная кавычка) становится '&quot;' когда ENT_NOQUOTES не установлен.
  • "'" (одинарная кавычка) становится '&#039;' (или &apos; ) только при установке ENT_QUOTES .
  • '<' (меньше) становится '&lt;'
  • '>' (больше) становится '&gt;'

Во всяком случае, я бы этого не сделал, если вы не знаете каждого пользователя лично (и знаете, что они заботятся о безопасности в Интернете и не используют повторно пароли), или это для вас самих. Когда вы конвертируете обратно эти символы, вы не сохраняете, если кто-то избегает вашей строки и делает фанки в вашей установке.