50 фильтров WordPress: фильтры с 11 по 20

В предыдущей статье этой серии мы рассмотрели первые десять фильтров WordPress, сопровождая их примерами. В этом уроке мы продолжим обзор 50 выбранных нами для изучения фильтров, сопровождая их пояснениями и примерами работы каждого фильтра.

Продолжим!

Эксперимент с переводом данных в WordPress

Одна из самых привлекательных особенностей WordPress — каждый бит текста готов для перевода. Если язык вашего сайта английский, по всей видимости, вам не нужна эта функция — или все — таки потребуется?

Фильтр gettext может оказаться полезным в нескольких случаях. Давайте рассмотрим интересный пример.

Пример: поправим грамматические ошибки предыдущего разработчика!

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

Смотрим как именно:

<?php

add_filter( 'gettext', 'gettext_example', 20, 3 );

function gettext_example( $translated_text, $text, $domain ) {
    switch ( $translated_text ) {
        case 'E-meil Adress' :
            $translated_text = __( 'Email Address', 'plugin_text_domain' );
            break;
    }
    return $translated_text
}

// Источник примера http://speakinginbytes.com/2013/10/gettext-filter-wordpress/

?>

Подчищаем текст

WordPress использует функцию с именем sanitize_title() чтобы подчищать заголовки, она заменяет пробелы дефисом и делает их готовыми для использования в качестве названия поста. С помощью фильтра sanitize_title (да, имя такое же) вы можете расширить функцию.

Пример: убираем артикль «The» из меток

Хотите избавиться от артикля «The» метках? Смотрите код ниже:

<?php

add_filter( 'sanitize_title', 'sanitize_title_example' );

function sanitize_title_example( $title ) {
    $title = str_replace( '-the-', '-', $title );
    $title = preg_replace( '/^the-/', '', $title );
    return $title;
}

?>

Простое и элегантное решение.

Устанавливаем исключения форматирования для шорткодов

Этот полезный фильтр позволяет указать, какие шорткоды не будут подвержены форматированию функцией wptexturize()». Выдержка из Кодекса WordPress.

Пример: исключаем ваш шорткод из списка для форматирования

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

<?php

add_filter( 'no_texturize_shortcodes', 'no_texturize_shortcodes_example' );

function no_texturize_shortcodes_example( $shortcodes ) {
    $shortcodes[] = 'myshortcode';
    return $shortcodes;
}

// Источник перевода: http://codex.wordpress.org/Plugin_API/Filter_Reference/no_texturize_shortcodes

?>

Легко? Проще простого!

Встроенный фильтр проверки комментариев

WordPress имеет свою собственную систему проверки комментариев (к примеру, для защиты от спама). Прежде, чем комментарий будет допущен к публикации, он должен пройти модерацию, и, если это не спам, быть утвержденным.

Фильтр pre_comment_approve может несколько облегчить предварительную модерацию.

Пример: помечаем комментарии с длинными именами авторов как спам

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

С помощью фрагмента кода, приведенного ниже, вы сможете добиться автоматического исключения спамеров, которые используют такие имена, как «доставка внутри страны и заграницу по очень низким ценам (Нажмите для получения дополнительной информации)»:

<?php

add_filter( 'pre_comment_approved', 'pre_comment_approved_example', 99, 2 );

function pre_comment_approved_example( $approved, $commentdata ) {
    return ( strlen( $commentdata['comment_author'] ) > 75 ) ? 'spam' : $approved;
}

// Источник примера: https://gist.github.com/norcross/5468979

?>

Подсказка бонусом: Если вы хотите избавиться от спама, проверяя длину URL – адреса автора комментария, используйте ‘comment_author_url‘ вместо ‘comment_author’.

Настраиваем возможность «Публикация с помощью email»

Знаете ли вы, что вы можете публиковать записи в блоге WordPress с помощью электронной почты? Функция используется довольно редко и фильтр enable_post_by_email_configuration позволяет включить или выключить ее.

Пример: включаем и выключаем возможность «Публикация через Email»

По какой-то причине (безопасность сайта, как пример) вы можете отключить эту функцию. И можете сделать это с помощью всего одной строки кода:

<?php

add_filter( 'enable_post_by_email_configuration', '__return_false', 100 );

?>

Или же если у вас WordPress работает в режиме Multisite и вам нужно включить эту возможность (потому как в режиме Multisite по умолчанию она отключена), вы можете использовать функцию __return_true():

<?php

add_filter( 'enable_post_by_email_configuration', '__return_true', 100 );

?>

Фильтр заголовков страниц

Функция wp_title() выводит заголовки страниц, те, которые мы видим во вкладках браузера. И она же позволяет нам поработать с этими названиями.

Пример: переписываем заголовки страниц верным методом

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

<?php

add_filter( 'wp_title', 'wp_title_example', 10, 2 );

function wp_title_example( $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 = sprintf( __( 'Page %s', 'tuts_filter_example' ), max( $paged, $page ) ) . " $sep $title";

    return $title;
}

// Источник примера: http://tommcfarlin.com/filter-wp-title/

?>

Обработка комментариев перед сохранением в базе данных

Если вам требуется изменить какие-либо данные комментария (ID публикации, имя автора, адрес электронной почты автора, веб-сайт автора, тип комментария, идентификатор пользователя, если комментатор является пользователем, тип комментария или же содержание комментария) – используйте фильтр preprocess_comment.

Пример: приводим в порядок комментарии

У ВАС В БЛОГЕ МНОГО КОММЕНТАРИЕВ ОСТАВЛЕНО ЗАГЛАВНЫМИ БУКВАМИ? Если так и есть, вы можете быстро сделать их строчными:

<?php

add_filter( 'preprocess_comment', 'preprocess_comment_example' );

function preprocess_comment_example( $commentdata ) {
    if( $commentdata['comment_content'] == strtoupper( $commentdata['comment_content'] ))
        $commentdata['comment_content'] = strtolower( $commentdata['comment_content'] );
    return $commentdata;
}

// Источник примера: http://codex.wordpress.org/Plugin_API/Filter_Reference/preprocess_comment

?>

Великолепно, верно?

Настраиваем переадресацию после входа

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

Пример: переадресация пользователей на домашнюю страницу

Если вы не хотите, чтобы авторизовавшиеся пользователи (в нашем случае с ролью «Subscriber») видели панель администрирования после входа, вы можете перебросить их на главную страницу сайта:

<?php

add_filter( 'login_redirect', 'login_redirect_example', 10, 3 );

function login_redirect_example( $redirect_to, $request, $user ) {
    global $user;
    if ( isset( $user->roles ) && is_array( $user->roles ) ) {
        if ( in_array( 'subscriber', $user->roles ) ) {
            return home_url();
        } else {
            return $redirect_to;
            }
    }
    return;
}

?>

В Кодексе WordPress есть предупреждение об одной вещи: «Убедитесь, что вы используете add_filter, а не is_admin(), так как эта функция не доступна, когда используется фильтр«.

Создание ссылок в настройках плагинов

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

Пример: добавляем ссылку «Настройки» для отображения на странице «Плагины»

Чтобы добавить пользовательскую ссылку под названием плагина в списке на странице «Плагины» используйте функцию, подключенную к фильтру:

<?php

add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ),
 'plugin_action_links_example' );

function plugin_action_links_example( $links ) {
    $links[] = '<a href="' . get_admin_url( null, 
'options-general.php?page=my_plugin_settings' ) . '">' . 
__( 'Settings' ) . '</a>';
    return $links;
}

// Источник примера: 
https://codex.wordpress.org/Plugin_API/Filter_Reference/plugin_action_links_
(plugin_file_name)

?>

Заметьте, что мы используем константу __FILE__ для привязки функции к фильтру. Клево?

Используйте это решение осторожно: множество ссылок в настройках плагина не увеличат его функциональности.

Фильтрация контента внутри редактора сообщений

Вам когда-нибудь приходила идея предзаполненных постов в редакторе? Чтобы начинать публикацию с готового шаблона? Или оставлять заметки вашим авторам? Это можно сделать с помощью фильтра the_editor_content.

Пример: оставляем «напоминалки» авторам

Давайте попробуем сделать «заметки авторам«: если у вас есть много напоминаний авторам вашего блога, вы можете заполнить начальное поле записи в HTML — редакторе используя код, приведенный ниже:

<?php

add_filter( 'the_editor_content', 'the_editor_content_example' );

function the_editor_content_example( $content ) {
    //Возвращает фильтрованное содержимое, если пусто
    if ( empty( $content ) ) {
        $template  = Не забудь ...' . "nn";
        $template .= '<ul><li> Проставить нужные теги,</li>
<li> Время публикации установи на 8:00 завтрашнего утра</li>
<li> Метки сделай подходящими для СЕО-</li>
<li> И не забудь удалить этот текст.</li></ul>' . "nn";
        $template .= 'Пока!';
        return $template;
    } else
        return $content;
}

// Источник примера: http://wpfilte.rs/the_editor_content/

?>

Переменную $template меняйте под свои нужды и применяйте на своем ресурсе!

Конец второй части

Статья подошла к концу, и, я полагаю, вы нашли что-то полезное для себя, а примеры были интересны. Увидимся на следующем уроке!

Мне интересны ваши отзывы! Не стесняйтесь оставлять комментарии ниже и, если вам понравилась статья, не забудьте ей поделиться!

Перевод статьи “50 Filters of WordPress: Filters 11-20” был подготовлен дружной командой проекта Сайтостроение от А до Я.