Фильтрация 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