Фильтрация wp_title: почему это важно

filters

Любой, кто имел опыт в создании тем – пусть даже всего лишь одной темы, – работал с дочерними темами или просто редактировал базовую тему, скорее всего, сталкивался с wp_title. Это один из тегов в WordPress, который очень легко использовать и понять. Давайте приведем цитату из Кодекса:

Отображает или возвращает заголовок страницы. Может быть определен разделитель, который выводится либо до, либо после заголовка страницы.

Этот тег может стоять в любом месте в шаблоне за пределами цикла главной страницы, однако обычно он используется в элементе title раздела head страницы.

Ничего сложного, верно?

Однако это один из тех тегов, которыми часто злоупотребляют, что приводит к проблемам, связанным с плагинами.

Вопросы фильтрации wp_title

Во-первых, стандартные ситуации использование wp_title очень просты. Достаточно добавить этот тег, объявить разделитель, а также задать вывод заголовка и разделителя.

К примеру:

<title><?php wp_title( ‘|’, true, ‘right’ ); ?></title>

Достаточно просто – однако на практике все может быть гораздо хуже (что я знаю из личного опыта).

Не повторяем ошибок

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

Вы можете воспользоваться подобной конструкцией:

<title><?php bloginfo('name'); ?> | <?php is_home() ? bloginfo('description') : wp_title( '' ); ?></title>

Что действительно уродливо и действительно некорректно. И я буду первым, кто признается в том, что указанная конструкция была взята из кода, написанного мною раньше (просто чтобы показать, чему можно научиться со временем).

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

Взамен вы получаете мешанину из wp_title, get_bloginfo и конкатенации строк для получения необходимой структуры. Хорошее эмпирическое правило в программировании – по крайней мере, в контексте некоторых фреймворков и приложений – гласит: если ваше решение кажется вам странным, значит существует более простой (и эффективный) способ сделать это.

Идем правильным путем

Поскольку wp_title – фильтруемая функция, мы можем применить произвольный хук, который поможет нам не только более точно, но и более правильно определить структуру для отображения наших заголовков.

Здесь я подразумеваю, что мы не будем использовать комбинацию «blog info»-функций – мы воспользуемся стандартными преимуществами WordPress: событийной парадигмой.

Вдобавок ко всему, это поможет разработчикам плагинов удалить написанный нами код и вставить свой. От этого все только выиграют.

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

<title><?php wp_title( '|', true, 'right' ); ?></title>

Далее нам нужно определить функцию, подцепить ее к wp_title и обеспечить код, который требуется для фильтрации информации:

<?php
 
/**
 * Provides a standard format for the page title depending on the view. This is
 * filtered so that plugins can provide alternative title formats.
 *
 * @param       string    $title    Default title text for current view.
 * @param       string    $sep      Optional separator.
 * @return      string              The filtered title.
 * @package     mayer
 * @subpackage  includes
 * @version     1.0.0
 * @since       1.0.0
 */
function mayer_wp_title( $title, $sep ) {
	global $paged, $page;
 
	if ( is_feed() ) {
		return $title;
	} // end if
 
	// Add the site name.
	$title .= get_bloginfo( 'name' );
 
	// Add the site description for the home/front page.
	$site_description = get_bloginfo( 'description', 'display' );
	if ( $site_description && ( is_home() || is_front_page() ) ) {
		$title = "$title $sep $site_description";
	} // end if
 
	// Add a page number if necessary.
	if ( $paged >= 2 || $page >= 2 ) {
		$title = sprintf( __( 'Page %s', 'mayer' ), max( $paged, $page ) ) . " $sep $title";
	} // end if
 
	return $title;
 
} // end mayer_wp_title
add_filter( 'wp_title', 'mayer_wp_title', 10, 2 );

Мало того, что вы получите все преимущества, упомянутые выше – вы также сделаете это корректно.

И, как и первый пример, этот код взят из моего проекта, над которым я работаю прямо сейчас.

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

Таким образом, код выше не является идеальным – возможно, в нем можно что-либо улучшить. Критика приветствуется!

Источник: tommcfarlin.com

Блог про WordPress
Комментарии: 13
  1. Алексей Ершов

    Смутило в начале статьи, что wp_title вы называли тегом. Почему? В официальном руководстве пишут tag?
    Потом — функцией. Отлегло =)
    Буду черпать опыт по работе с кодом WordPress.

    1. Дмитрий (автор)

      У вас просто ассоциации сразу с HTML. А на практике тегом называют:

      Тег — это символьное или текстовое выражение, предписывающее предпринять какое-либо определённое действие непосредственно по разметке и форматированию экранного представления веб-страницы.

      Поскольку wp_title отвечает за вывод заголовков, то его вполне можно назвать тегом, ибо происходит форматирование представления веб-страницы. Поэтому именование wp_title тегом в принципе вполне корректно, хоть это и функция.

  2. Алексей Ершов

    Тогда sprintf, echo и т.д. тоже теги?
    Мне кажется, что такое именование может запутать, или дать неправильное представление начинающим.
    Но, это, конечно, субъективное дело автора. Так что спорить не буду.
    Поэты ж придумывают новые слова, и знаки пунктуации ставят не всегда по правилам. =)

    1. Дмитрий (автор)

      Это не мое определение, я согласен с вами, что лучше все раскладывать по полочкам и называть функции функциями.

      Но в оригинале было именно tag, поэтому оставлю как есть. Те, кому адресована данная статья, я думаю, не запутаются.

      За зоркий глаз спасибо, не каждый человек так вдумчиво читает статьи =)

  3. ANT Ufa

    А что нужно убрать в этом коде, чтобы на страницах, записях и т.п. не выдавалось имя сайта?

    function frontier_wp_title( $title, $sep ) {
    global $paged, $page;

    if ( is_feed() )
    return $title;

    $title .= get_bloginfo( ‘name’ );

    $site_description = get_bloginfo( ‘description’, ‘display’ );
    if ( $site_description && ( is_home() || is_front_page() ) )
    $title = «$title $sep $site_description»;

    if ( $paged >= 2 || $page >= 2 )
    $title = «$title $sep » . sprintf( __( ‘Page %s’, ‘frontier’ ), max( $paged, $page ) );

    return $title;
    }
    add_filter( ‘wp_title’, ‘frontier_wp_title’, 10, 2 );

  4. Дмитрий (автор)

    Убрать $title .= get_bloginfo( ‘name’ );

    или вот отсюда убрать title в кавычках

    $title = «$title $sep $site_description»;

  5. Олег

    Здравствуйте. Проблема следующая- яндекс и гугл индексируют заголовки записей с наименованием сайта. В выдаче яндекса заголовки записей имеют вид — Имя записи | Имя домена. В Google — Имя записи — Имя домена. Ставил плагины All in One и Yoast SEO. В них обоих в настройках тайтла записей убирал разделитель и указывал только наименование статьи. Как с этим бороться? Есть подозрение, что в этом виновен шаблон, но редактировать самому нет необходимых знаний. Примечание: некоторые статьи в яндекс имеют должный вид без названия домена в конце заголовка. Если для анализа нужны куски кода, то вышлю.

    1. Дмитрий (автор)

      Возможно, поисковые системы просто не успели пока переиндексировать. Этот процесс достаточно долгий, потому подождите, пока поисковики заменят статьи. Думаю, что причина в этом.

  6. Олег

    Были такие мысли, но опубликовав сегодня статью, с правильными настройками в плагине, ее заголовок опять попал в индекс с названием сайта.

    1. Дмитрий (автор)

      Проверьте настройки All in One SEO Pack:

      Там есть такая опция: «Использовать заголовок по умолчанию:» Поставьте «Отключить».

      Это позволит избежать использования заголовка, который прописан в теме.

  7. Олег

    спасибо, попробую

  8. Алёна

    Здравствуйте, подскажите, пожалуйста, что нужно убрать из кода, написанного вами, чтобы не просто скрыть вывод title со страницы, но и убрать из head (для seo-оптимизации). А то у меня сейчас два title. Спасибо

    1. Владимир

      Присоединяюсь к вопросу.

Добавить комментарий для ANT Ufa Отменить ответ

Получать новые комментарии по электронной почте.