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

Дата публикации:Январь 19, 2014

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

Поделиться

13 комментариев

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

    • Architect Of Ruin says:

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

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

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

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

    • Architect Of Ruin says:

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

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

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

  3. ANT Ufa says:

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

    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. Дмитрий says:

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

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

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

  5. Олег says:

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

    • Дмитрий says:

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

  6. Олег says:

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

    • Дмитрий says:

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

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

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

  7. Олег says:

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

  8. Алёна says:

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

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

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