50 фильтров WordPress: фильтры с 31 по 40

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

Приступим!

Фильтр для стиля галереи по умолчанию

WordPress применяет стили к галерее с помощью шорткода на основе неких предопределенных CSS — стилей. Вы можете изменить их вид, используя фильтр use_default_gallery_style.

Пример: отключаем CSS – правила по умолчанию

Допустим, вы уже прописали набор правил для темы в файле style.css и не нуждаетесь в правилах CSS по умолчанию. Используйте код, приведенный ниже, чтобы отключить их:

<?php

add_filter( 'use_default_gallery_style', '__return_false' );

?>

Готово! Теперь WordPress не будет добавлять тег <style> с набором CSS – правил перед шорткодом .

Фильтрация вложенных URL-адресов

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

Пример: как избежать сообщений «Смешанный контент»

В случае использования шифрования на вашем сайте методом SSL, функция wp_get_attachment_url()может вернуть URL с заголовком HTTP вместо HTTPS, и результатом станет сообщение «mixed content«. С помощью кода, приведенного ниже, можно избежать подобной ситуации:

<?php

add_filter( 'wp_get_attachment_url', 'wp_get_attachment_url_example' );

function wp_get_attachment_url_example( $url ) {
    $http  = site_url( false, 'http'  );
    $https = site_url( false, 'https' );

    if ( $_SERVER['HTTPS'] == 'on' )
        return str_replace( $http, $https, $url );
    else
        return $url;
}

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

?>

Установка типа контента для электронной почты по умолчанию

По умолчанию вы можете рассылать только текстовые письма в WordPress, пока функция wp_mail() использует параметр text/plain в качестве типа содержимого. С помощью фильтра wp_mail_content_type можно это изменить.

Пример: рассылаем письма из WordPress в HTML — формате

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

<?php

add_filter( 'wp_mail_content_type', 'wp_mail_content_type_example' );

function wp_mail_content_type_example( $content_type ) {
    return 'text/html';
}

?>

Сохраняем IP — адрес комментатора

WordPress сохраняет IP-адрес каждого комментатора в таблице базы данных. Если вам необходимо использовать эти данные – применяйте фильтр pre_comment_user_ip.

Пример: сохраняем действительный IP – адрес комментатора

В случае, когда пользователь, комментирующий ваш пост, использует прокси, WordPress зафиксирует IP — адрес прокси, но не реальный адрес пользователя. Настоящий IP – адрес содержит в HTTP – заголовке X-Forwarded-For. Код, приведенный ниже, использует функцию, которая берет нужный адрес из заголовка и помещает его в базу данных:

<?php

add_filter( 'pre_comment_user_ip', 'pre_comment_user_ip_example' );

function pre_comment_user_ip_example() {
    $REMOTE_ADDR = $_SERVER['REMOTE_ADDR'];
    if ( !empty( $_SERVER['X_FORWARDED_FOR'] ) ) {
        $X_FORWARDED_FOR = explode( ',', $_SERVER['X_FORWARDED_FOR'] );
        if ( !empty( $X_FORWARDED_FOR ) )
            $REMOTE_ADDR = trim( $X_FORWARDED_FOR[0] );
    } elseif( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
        $HTTP_X_FORWARDED_FOR = explode( ',', $_SERVER['HTTP_X_FORWARDED_FOR'] );
        if ( !empty( $HTTP_X_FORWARDED_FOR ) )
            $REMOTE_ADDR = trim( $HTTP_X_FORWARDED_FOR[0] );
    }
    return preg_replace( '/[^0-9a-f:., ]/si', ' ', $REMOTE_ADDR );
}

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

?>

Если вам интересно изучить HTTP — заголовок X-Forwarded-For, посетите Wikipedia для дополнительной информации.

Изменение количества резервных копий для сохраненных записей

Возможно, вам известно, что WordPress имеет возможность сохранять версии публикаций, а также, быть может, вы знаете, что существует возможность устанавливать количество резервных копий постов путем добавления константы (WP_POST_REVISIONS) в файл wp-config.php.

А знаете ли вы о том, что можно менять число версий не только для различных типов публикаций, но и в том числе для отдельных публикаций? Можно. Для этого предназначен фильтр wp_revisions_to_keep.

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

Можно менять количество возможных поправок с помощью переменной $post, но мы идем красивым и простым путем, потому ограничим число возможных ревизий публикации для пользовательского типа публикаций «event«:

<?php

add_filter( 'wp_revisions_to_keep', 'wp_revisions_to_keep_example', 10, 2 );

function wp_revisions_to_keep_example( $num, $post ) {
    if ( 'event' == $post->post_type ) {
        return 0;
    }
    return $num;
} 

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

?>

В Кодексе WordPress можете найти описание переменной $post и самостоятельно придумать новые способы применения этого фильтра. Не забывайте делиться вашими идеями!

Перезапись шорткода

Шорткод позволяет добавлять текст к выводимой картинке. Если нужно изменить вид, в котором выводится этот шорткод – используйте пример, который мы разберем ниже.

Пример: подписи к изображениям с помощью HTML5 — разметки

В HTML5 появились два новых тега для работы с изображениями: <figure> и <figcaption>. В этом примере мы перепишем разметку шорткодом с помощью этих тегов:

<?php

add_filter( 'img_caption_shortcode', 'img_caption_shortcode_example', 10, 3 );

function img_caption_shortcode_example( $empty, $attr, $content ) {
    $attr = shortcode_atts( array(
        'id'      => ' ',
        'align'   => 'alignnone',
        'width'   => ' ',
        'caption' => ' '
    ), $attr );

    if ( 1 > (int) $attr['width'] || empty( $attr['caption'] ) ) {
        return ' ';
    }

    if ( $attr['id'] ) {
        $attr['id'] = 'id=" ' . esc_attr( $attr['id'] ) . ' " ';
    }

    $figure_atts    = $attr['id']
                    . ' class="caption ' . esc_attr( $attr['align'] )
                    . ' " ' . 'style="max-width: ' . ( 10 + (int) $attr['width'] ) . 'px;" ';

    $output  = '<figure ' . $figure_atts . '>';
    $output .= do_shortcode( $content );
    $output .= '<figcaption>' . $attr['caption'] . '</figcaption>';
    $output .= '</figure>';

    return $output;

}

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

?>

Поэкспериментируйте с этим кодом. Возможно, вы найдете способ не использовать ID для тега <figure>.

Добавляем классы публикаций

Фильтр и одноименная функция body_class популярна среди WordPress разработчиков. А как насчет post_class? Знаете ли вы о том, что есть и фильтр, и функция для добавления css классов к выводимым постам?

Пример: Добавляем css класс для первого поста в цикле

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

<?php

add_filter( 'post_class', 'post_class_example' );

function post_class_example( $classes ) {
    global $wp_query;
    if ( 0 == $wp_query->current_post ) {
        $classes[] = 'first-post';
    }
    return $classes;
}

// Источник примера: http://www.billerickson.net/code/first-post-class/

?>

Отныне вам не нужно использовать псевдокласс :first в CSS и беспокоиться о кроссбраузерной совместимости – просто применяйте класс .first-post!

Добавляем пользовательские поля для вложений

В WordPress вложения по существу очень похожи на пользовательские типы публикаций, которые могут быть расширены так же, как и любые другие типы публикаций – просто немного по-другому. Фильтр attachment_fields_to_edit позволит настроить поля для процесса загрузки или редактирования вложений.

Пример: добавление лицензионной информации к загружаемым изображениям

Допустим, у вас есть блог, ориентированный на публикацию фотографий и вам необходимо устанавливать лицензию на каждую загруженную фотографию. В этот раз мы воспользуемся действием и добавим поле «License» для вложений:

<?php

add_filter( 'attachment_fields_to_edit', 'attachment_fields_to_edit_example', 10, 2 );

function attachment_fields_to_edit_example( $form_fields, $post ) {
    $field_value = get_post_meta( $post->ID, 'license', true );
    $form_fields['license'] = array(
        'value' => $field_value ? $field_value : ' ',
        'label' => __( 'Лицензия' ),
        'helps' => __( 'Определяет тип лицензии для фотографии' )
    );
    return $form_fields;
}

add_action( 'edit_attachment', 'save_new_attachment_field' );

function save_new_attachment_field( $attachment_id ) {
    $license = $_REQUEST['attachments'][$attachment_id]['license'];
    if ( isset( $license ) ) {
        update_post_meta( $attachment_id, 'license', $license );
    }
}

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

?>

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

Меняем длину текста выдержки из публикации

По умолчанию, выдержка состоит из первых 55 слов каждой публикации. Форматирование к ним не применяется. Нечетное число слов. Если возникает желание изменить это число – используйте фильтр excerpt_length.

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

Допустим, я хочу оставить только 15 слов, потому что делаю сайт в стиле Pinterest и у меня есть совсем немного места для резюме публикаций. Все что мне нужно для этого – взять функцию, возвращающую число, и привязать ее к крошечному фильтру:

<?php

add_filter( 'excerpt_length', 'excerpt_length_example' );

function excerpt_length_example( $words ) {
    return 15;
}

?>

Проще простого!

Настраиваем меню в панели администрирования

На страницах панели администрирования WordPress, непосредственно под списком элементов (таких как «Публикации», «Страницы», «Пользователи», «Медиа-файлы» и так далее), есть несколько разделов, где вы можете выбрать элементы и произвести с ними нужные действия. Фильтр, который описан ниже, позволит нам настроить их под себя.

Пример: отключаем корзину

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

<?php

add_filter( 'bulk_actions-edit-post', 'bulk_actions_edit_post_example' );

function bulk_actions_edit_post_example( $actions ) {
    unset( $actions['trash'] );
    return $actions;
}

?>

Переменная $screenid фильтра отвечает за имя раздела в панели администрирования, в который вы собираетесь внести изменения. Список имен находится на странице Справочник панели администрирования @ API Кодекса WordPress.

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

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

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

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