Фильтрация wp_title: почему это важно
Любой, кто имел опыт в создании тем – пусть даже всего лишь одной темы, – работал с дочерними темами или просто редактировал базовую тему, скорее всего, сталкивался с 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
