50 фильтров WordPress: первые 10 фильтров из серии

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

Итак, без лишних церемоний, приступим к первой партии из этих 50 фильтров!

Меняем сообщение об ошибке в форме входа

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

Пример: исправляем текст системного сообщения

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

<?php

add_filter( 'login_errors', 'login_errors_example' );

function login_errors_example( $error ) {
    $error = ' ';
    return $error;
}

?>

Уже намного лучше.

Перенаправление комментирующего на другую страницу

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

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

Многие посетители вашего ресурса заходят к вам и нередко подписываются на ваш блог, верно? И потому, если после того, как пользователь оставляет комментарий, мы выведем сообщение "Спасибо за ваш комментарий! Хотите подписаться на мой блог?", то сможем «превратить» комментаторов в подписчиков! И это также легко сделать, опять же, с помощью фильтра comment_post_redirect:

<?php

add_filter( 'comment_post_redirect', 'comment_post_redirect_example' );

function comment_post_redirect_example( $location ) {
    return '/thanks-for-your-comment/';
}

?>

Заметьте, что WordPress использует функцию wp_safe_redirect(), которая означает, что вы должны использовать либо локальную страницу, либо страницу из списка разрешенных URL-адресов (смотрите allowed_redirect_hosts ниже).

Разрешаем внешний редирект для функции wp_safe_redirect()

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

Пример: разрешаем редиректы в субдомене

Так как функция wp_safe_redirect() позволяет делать редиректы только внутри инсталляции WordPress, субдомен или домен остается вне зоны доступа.

Позволим WordPress делать редиректы в эти зоны:

<?php

add_filter( 'allowed_redirect_hosts', 'allowed_redirect_hosts_example' );

function allowed_redirect_hosts_example( $content ) {
    $content[] = 'forum.mywebsite.com';
    $content[] = 'welcome.mywebsite.com';
    $content[] = 'help.mywebsite.com';
    return $content;
}

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

?>

Добавляем классы в теге <body>

Функция body_class() – великолепна по своей сути. Она предоставляет возможность использовать разные классы в теге <body> на разных страницах, чтобы вы могли использовать CSS – файлы более эффективно. И с помощью одноименного фильтра body_class вы можете добавлять или удалять классы.

Пример: добавляем класс категорий в тег <body> или на страницы публикаций

Если вам нужен различный стиль для каждой из имеющихся категорий, вам поможет фильтр body_class, который добавит класс категорий в тег <body> или на любую страницу с публикацией.

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

<?php

add_filter( 'body_class', 'body_class_example' );

function body_class_example( $classes ) {
    if( is_single() ) {
        foreach( get_the_category( get_the_ID() ) as $category )
            $classes[] = 'cat-' . $category->category_nicename;
    }
    return $classes;
}

// Источник примера: https://codex.wordpress.org/Function_Reference/body_class#Add_Classes_By_Filters

?>

Если у вас есть категория с именем "World", вы можете использовать класс .cat-world для стилизации всей категории "World".

Меняем язык

WordPress - система управления контентом №1 в мире, потому что позволяет перевести весь контент и саму систему в нужном языковом направлении. Фильтр locale устанавливает язык сайта на WordPress.

Пример: меняем язык сайта с помощью параметра URL - запроса

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

<?php

add_filter( 'locale', 'locale_example' );

function locale_example( $lang ) {
    if ( 'tr' == $_GET['language'] ) {
        return 'tr_TR';
    } else {
        return $lang;
    }
}

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

?>

Когда вы устанавливаете URL - параметр mywebsite.com/?language=tr, язык сайта меняется на турецкий. Конечно же, с помощью этого решения вы не сможете перевести сам контент, если не сделали этого заранее.

Фильтр для корректировки имен пользователей

WordPress может устанавливать условия ввода имен пользователей с помощью функции sanitize_user(). А с помощью одноименного фильтра вы сможете настроить функцию.

Пример: убираем возможность ввода заглавных символов в имени пользователя

Если вы не хотите, чтобы система принимала имена пользователей с заглавными буквами (будь то "SHOUTINGBOY88" или "CrazyGirl92"), можете использовать PHP - функцию strtolower и сделать хук для фильтра sanitize_user, как показано в примере ниже:

<?php

add_filter( 'sanitize_user', 'strtolower' );

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

?>

Вполне вероятно, это пример - один из самых простых в этой статье.

Настраиваем фильтрацию контента в публикациях

Эта часть не нуждается в долгом представлении: фильтр the_content позволяет сжимать содержимое поста.

Пример: убираем тег <p>, обрамляющий изображения

WordPress не позволяет отображать картинки вне параграфа. Система автоматически проставляет тег <p>, который, лично меня, сильно раздражает. Если вы солидарны со мной, можете убрать его с помощью этого сниппета:

<?php

add_filter( 'the_content', 'the_content_example' );

function the_content_example( $content ) {
    return preg_replace('/<p>s*(<a .*>)?s*(<img .* />)s*(</a>)?s*</p>/iU', '123', $content);
}

// Источник примера: http://wpsnipp.com/index.php/functions-php/remove-p-tag-from-around-images-in-the_content/

?>

Создаем фильтр для форм к публикациям, защищенных паролем

Для защищенных паролем постов WordPress автоматически проводит замену содержимого публикации на форму для ввода авторизационных данных. С помощью фильтра the_password_form вы можете эту форму отредактировать.

Пример: упрощаем форму для ввода пароля

Если защищенные паролем посты – обычное явление на вашем WordPress - сайте и вам не нужно выводить сообщение «Этот контент защищен паролем. Чтобы увидеть защищенную область - введите пароль» - вы можете очистить и упростить форму ввода пароля с помощью этого фрагмента кода:

<?php

add_filter( 'the_password_form', 'the_password_form_example' );

function the_password_form_example() {
    $output  = '<form action="' . esc_url( site_url( 'wp-login.php?action=postpass', 'login_post' ) ) . '" method="post">';
    $output .= '<span>' . __( "Enter the password:" ) . ' </span>';
    $output .= '<input name="post_password" type="password" size="20" />';
    $output .= '<input type="submit" name="Submit" value="' . esc_attr__( "Go" ) . '" />';
    $output .= '</form>';
    return $output;
}

// Источник примера: 
http://codex.wordpress.org/Using_Password_Protection#Password_Form_Text

?>

Итак. Теперь мы видим только три слова, поле для ввода пароля и кнопку «Отправить». Все в одну строку.

Функция фильтра the_terms()

Если вас не устроил формат вывода данных функцией the_terms() вы можете использовать одноименный фильтр: the_terms.

Пример: удаление HTML – тегов с помощью фильтр аthe_terms()

Несколько лет назад передо мной возникла задача. Мне понадобилось отобразить HTML - теги в публикациях в виде простого текста. Потратив огромное количество времени на поиск решения, я нашел его в совершенно неожиданном месте:

<?php

add_filter( 'the_terms', 'strip_tags' );

?>

Можете представить выражение моего лица, когда я обнаружил PHP - функцию strip_tags()в ядре.

Меняем адрес электронной почты

Когда WordPress рассылает почту пользователям вашего сайта, он использует в поле «От кого» адрес наподобие wordpress@yourwebsite.com. С помощью фильтра, описанного ниже, можем менять его.

Пример: устанавливаем свой адрес в поле "Адрес отправителя"

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

<?php

add_filter( 'wp_mail_from', 'wp_mail_from_example' );

function wp_mail_from_example( $email ) {
    return 'my.email.address@mywebsite.com';
}

?>

Можете использовать ее параллельно с фильтром wp_mail_from_name. Логика та же, просто пишите функцию, которая возвращает строку с именем, и цепляете ее к фильтру wp_mail_from_name.

Итог на сегодня

В этой статье мы рассмотрели 10 из 50 фильтров. Надеюсь, вам понравилось, и вы узнали что-то новое. Увидимся в следующем уроке!

Мне интересны ваши мысли по поводу того, что вы почерпнули из статьи. Что вы думаете об этих фильтрах? Оставляйте ваши комментарии ниже, и, если вам действительно понравилась статья, не забудьте ей поделиться!

РедакцияПеревод статьи «50 Filters of WordPress: The First 10 Filters»