50 фильтров WordPress: фильтры с 21 по 30

В предыдущих частях этой серии мы изучили 20 WordPress фильтров. В этом уроке мы рассмотрим следующие десять и приведем примеры.

Приступим!

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

Функция поиска – одна из самых важных функций WordPress (но, по какой-то причине, выглядит довольно примитивно). С помощью фильтра posts_search можно поиграть с поиском через SQL — запросы.

Пример: включаем защищенные паролем публикации в результат поиска

Допустим, вы используете публикации для раскрытия какой-либо информации вашим клиентам, ставите пароли для каждой роли и отправляете их непосредственно клиентам.

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

<?php

add_filter( 'posts_search', 'posts_search_example' );

function posts_search_example( $search ) {
    global $wpdb;
    if( !is_user_logged_in() ) {
        $pattern = " AND ({$wpdb->prefix}posts.post_password = ' ')";
        $search = str_replace( $pattern, ' ', $search );
    }
    return $search;
}

// Источник примера: http://wpsnipp.com/index.php/functions-php/include-password-protected-posts-in-search-results/

?>

Если посетители вашего блога — зарегистрированные пользователи, то вы можете не использовать этот код: они смогут найти публикации, защищенные паролем сразу после того, как войдут в систему.

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

По умолчанию WordPress пытается сжать ваши изображения при изменении до определенных размеров. Фильтр wp_editor_set_quality позволяет настроить уровень сжатия либо совсем его отключить.

Пример: предупреждаем сжатие и искажение ваших изображений

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

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

<?php

add_filter( 'wp_editor_set_quality', 'wp_editor_set_quality_example' );

function wp_editor_set_quality_example( $quality ) {
    return 100;
}

?>

Фильтры текстового виджета

Виджеты WordPress по умолчанию имеют встроенные фильтры. Фильтр widget_text, как вы, возможно, уже догадались, фильтр виджета Text.

Пример: включаем шорткоды для виджета Text

Зачастую раздражает то, что WordPress по умолчанию не позволяет использовать шорткоды в текстовом виджете. Благодаря этому фильтру мы можем их включить:

<?php

add_filter( 'widget_text', 'do_shortcode' );

?>

…постойте, а разве здесь нет функции для хука? На самом деле есть: это функция ядра, которая называется do_shortcode(), и, возможно вы слышали о ней ранее. Поскольку функция для подключения к фильтру уже есть, нам не нужно писать еще одну.

Фильтр контента RSS ленты

Так же, как к публикациям можно применить фильтр the_content, также и к RSS ленте можно применить фильтр the_content_feed.

Пример: добавление эскизов публикаций к экземплярам RSS ленты

Этот пример является одним из моих любимых среди всех примеров, приведенных в этой серии статей: добавляем столь необходимую миниатюру для элементов RSS:

<?php

add_filter( 'the_content_feed', 'the_content_feed_example' );

function the_content_feed_example( $content ) {
    $featured_image = ' ';
    $featured_image = get_the_post_thumbnail( get_the_ID(), 
'thumbnail', 
array( 'style' => 'float:left;margin-right:.75em;' ) );
    $content = get_the_excerpt() . ' <a href="'. get_permalink() .'">' . __( 
'Read More' ) . '</a>';
    if( '' != $featured_image )
        $content = '<div>' . $featured_image . $content . 
'<br style="clear:both;" /></div>';
    return $content;
}

?>

Если вы хотите, чтобы эскизы отображались в правой части, просто измените ‘float:left;margin-right:.75em;’ на ‘float:right;margin-left:.75em;’.

Изменение кнопок в визуальном редакторе

WordPress поставляется совместно с TinyMCE, продвинутым WYSIWYG – редактором, который мы используем для написания постов. С помощью фильтра mce_buttons мы можем менять первую линию кнопок в редакторе.

Пример: убираем ненужные кнопки из редактора

Если блог запущен в режиме multi-author, и вам нужно запретить авторам использование некоторых кнопок в редакторе, вы можете убрать некоторые из них (а можно и все разом) с помощью кода, приведенного ниже:

<?php

add_filter( 'mce_buttons', 'mce_buttons_example' );

function mce_buttons_example( $buttons ) {
    $remove_array = array( 'strikethrough', 'blockquote', 'hr', 'alignleft', 'aligncenter', 'alignright', 'wp_more', 'wp_adv' );
    // Полный лист для WP version 3.9
    // 'bold', 'italic', 'strikethrough', 'bullist', 'numlist', 'blockquote', 'hr', 'alignleft', 'aligncenter', 'alignright', 'link', 'unlink', 'wp_more', 'spellchecker', 'fullscreen', 'wp_adv'
    foreach( $remove_array as $remove ) {
        if ( ( $key = array_search( $remove, $buttons ) ) !== false )
            unset( $buttons[ $key ] );
    }
    return $buttons;
}

?>

Обратите внимание, что фильтр не отключает функционал — он просто удаляет кнопки.

Как я упомянул, этот фильтр работает с первой линейкой кнопок визуального редактора. Для второй линейки («расширенный набор«) существует другой фильтр mce_buttons_2 и еще два для пустых наборов кнопок: mce_buttons_3 и mce_buttons_4.

Исключаем термин из списков

Представьте, что вам нужно исключить термин из всех списков определений на вашем сайте. Этот маленький фильтр позволит сделать нам именно то, что предполагает его название.

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

Представьте, что вы пишите плагин, который создает две категории, названные «Лучшие плагины» и «Худшие плагины«. Будет выглядеть некрасиво, если эти теги будут отображены в списке категорий, так что вам нужно их скрыть. Вот как вы можете это сделать:

<?php

add_filter( 'list_terms_exclusions', 'list_terms_exclusions_example', 10, 2 );

function list_terms_exclusions_example( $exclusions, $args ) {
    // ID категорий, которые нужно скрыть
    $exclude = "42,132";
    $exterms = wp_parse_id_list( $exclude );
    foreach ( $exterms as $exterm ) {
        if ( empty( $exclusions ) )
            $exclusions  = ' AND ( t.term_id <> ' . intval( $exterm ) . ' ';
        else
            $exclusions .= ' AND t.term_id <> ' . intval( $exterm ) . ' ';
    }
    if ( !empty( $exclusions ) )
        $exclusions .= ')';
    return $exclusions;
}

// Источник примера http://shailan.com/2598/how-to-exclude-categories-and-tags-from-your-widgets/

?>

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

Изменение списка размеров изображений

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

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

Предположим, вы создали пользовательскую картинку с именем «golden-ratio-thumb» и хотите позволить авторам добавлять изображения с таким размером в свои посты, когда им это необходимо.

Вот код, в котором это сделано:

<?php

add_filter( 'image_size_names_choose', 'image_size_names_choose_example' );

function image_size_names_choose_example( $sizes ) {
    return array_merge( $sizes, array(
        'golden-ratio-thumb' => __( 'Golden Ratio Thumbnail' )
    ) );
}

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

?>

Слишком легко, не кажется?

Меняем фразу «Далее» в строке «Выдержки»

WordPress вырезает первые 55 слов публикации, убирает форматирование называет их «выдержка«, в которой подведен краткий итог поста. В конце выдержки мы видим[…] – строка, которая меня ужасно раздражает. К счастью, фильтр excerpt_more позволяет менять ее.

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

Допустим, вы хотите изменить этот текст и превратить его в ссылку на пост. Вот как это делается:

<?php

add_filter( 'excerpt_more', 'excerpt_more_example' );

function excerpt_more_example( $text ) {
    global $post;
    return '... <a class="read-more-link" href="' . get_permalink( $post->ID ) . '">Read more</a>';
}

?>

Так что мы нашли хорошее применение немного раздражающему тексту.

Настраиваем столбцы в списке публикаций

В панели администрирования на странице записей вы можете видеть все ваши записи в виде таблицы с дополнительной информацией, такой как автор, категория, теги и роли.

Фильтр manage_posts_columns позволяет скрывать или добавлять новые категории (используя действия или функции).

Пример: убираем столбец «Автор»

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

<?php

add_filter( 'manage_posts_columns', 'manage_posts_columns_example' );

function manage_posts_columns_example( $columns ) {
    unset( $columns['author'] );
    return $columns;
}

?>

Можем продолжить! По умолчанию, есть семь столбцов, которые вы можете спрятать:

  • cb (чекбоксы);
  • title (заголовок);
  • author (автор);
  • categories (категории);
  • Tags (метки);
  • Comments (комментарии).

На страницах пользовательского типа используйте фильтр manage_$post_type_posts_columns где $post_type — ID имени типа пользовательской публикации.

Редактируем контакты пользователей

Вы знаете, что можете добавить или удалить поля в профиле пользователя? Да, именно с помощью фильтра user_contactmethods.

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

Это очень популярный сниппет для WordPress, потому как стандартно в профиле есть поля типа «Jabber» и «AIM«. Многие хотят избавиться от них и добавить новые. В нашем примере мы удалим некоторые поля контакта с пользователем и добавим новые:

<?php

add_filter( 'user_contactmethods', 'user_contactmethods_example' );

function user_contactmethods_example( $contactmethods ) {
    unset( $contactmethods['yim'] );
    unset( $contactmethods['aim'] );
    unset( $contactmethods['jabber'] );
    $contactmethods['facebook']     = 'Facebook'; 
    $contactmethods['twitter']      = 'Twitter';
    $contactmethods['gplus']        = 'Google+';
    $contactmethods['linkedin']     = 'LinkedIn';
    $contactmethods['instagram']    = 'Instagram';
    return $contactmethods;
}

?>

Теперь профиль больше похож на соответствие реальности, верно?

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

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

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

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