WordPress как на ладони
wordpress jino

add_filter() WP 0.71

Прикрепляет указанную PHP функцию к указанному хуку-фильтру. Так, во время срабатывания фильтра значение будет обработано указанной PHP функцией.

Фильтры это, своего рода, зацепки внутри кода, через которые можно "отфильтровать" какие-либо данные. Например, в период получения и вывода текста на экран из базы данных, можно "на лету" изменить (отфильтровать) этот текст и вывести на экран уже измененный вариант текста. И благодаря фильтру для этого нам не придется редактировать функцию вывода в файлах движка, а можно подключиться к функции вывода через файл шаблона, использовав заранее предусмотренный разработчиками фильтр.

add_filter() не делает никаких проверок: существует ли прикрепляемая функция или передается ли название функции в виде строки и т.д.. Сделано это, чтобы add_filter() работала максимально быстро.

Базовый список фильтров смотрите здесь и тут весь список фильтров

О фильтрах и событиях читайте в этой заметке: как работают хуки в WordPress

Используется в: add_action().
✈ 1 раз = 0.000015с = очень быстро | 50000 раз = 0.05с = скорость света PHP 7.0.8, WP 4.7

Хуков нет.

Возвращает

Всегда true.

Использование

add_filter( $tag, $function_to_add, $priority, $accepted_args );
$tag(строка) (обязательный)
Название фильтра, для которого будет срабатывать функция определенная в параметре $function_to_add.
По умолчанию: нет
$function_to_add(строка) (обязательный)
Название функции, которая будет срабатывать для указанного в предыдущем параметре фильтра. Название функции нужно указывать в виде строки: 'название_функции'. Для функций внутри классов указываем массив: array('название_класса', 'название_функции'), подробнее читаем тут (знания англ. приветствуются).
По умолчанию: нет
$priority(число)
Приоритет выполнения функций для одного и тоже фильтра. Чем больше число, тем позднее будет выполнятся функция: например, сначала 10 потом 20. Функции с одинаковым приоритетом, будут выполнятся в порядке их добавления к массиву фильтров.
По умолчанию: 10
$accepted_args(число)
Количество аргументов передаваемых фильтром функции. Некоторые фильтры могут передавать больше чем 1 аргумент, допустим - 2, для таких случаев нужно указывать 2 в этом параметре.
По умолчанию: 1

Примеры

#1. Обычный пример, показывающий как можно добавить любую надпись в конец каждой статьи, через фильтр the_content:

add_filter('the_content', 'add_text_to_content');
function add_text_to_content($content){
	$out = $content . "<p>При копировании статьи, ставьте обратную ссылку, пожалуйста!</p>";
	return $out;
}

#2. Изменения блока «подпись картинки» (сaption)

Пример изменения подписи у картинок ([сaption]) под стандарты HTML 5. Функция меняющая контент цепляется на фильтр img_caption_shortcode, который отвечает за преобразование шоткода [сaption] в контенте статьи. Чтобы получить все 3 параметра, передаваемые фильтром, укажем аргумент $accepted_args - 3:

add_filter('img_caption_shortcode', 'my_img_caption_shortcode_filter', 10, 3 );
/**
 * Фильтр заменяет шоткод [сaption] под стандарты HTML5
 *
 * @Возвращает HTML текст описывающий тег figure
 **/
function my_img_caption_shortcode_filter( $val, $attr, $content = null ){
	extract(shortcode_atts(array(
		'id'    => '',
		'align' => '',
		'width' => '',
		'caption' => ''
	), $attr));

	if ( 1 > (int) $width || empty($caption) )
		return $val;

	$capid = '';
	if ( $id ) {
		$id = esc_attr($id);
		$capid = 'id="figcaption_'. $id . '" ';
		$id = 'id="' . $id . '" aria-labelledby="figcaption_' . $id . '" ';
	}

	return '<figure ' . $id . 'class="wp-caption ' . esc_attr($align) . '" style="width: '
	. (10 + (int) $width) . 'px">' . do_shortcode( $content ) . '<figcaption ' . $capid 
	. 'class="wp-caption-text">' . $caption . '</figcaption></figure>';
}

Заметки

1. Функцию можно передавать как анонимную:
<?php add_filter('the_title', function($title){ return '<b>'. $title. '</b>';}) ?>

Имейте ввиду, что анонимные функции были введены в PHP 5.3.0.

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

2. Внутри классов фильтры нужно указывать через объект:
<?php add_filter('media_upload_newtab', array(&$this, 'media_upload_mycallback')); ?>

Код add filter: wp-includes/plugin.php WP 4.9

<?php
function add_filter( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) {
	global $wp_filter;
	if ( ! isset( $wp_filter[ $tag ] ) ) {
		$wp_filter[ $tag ] = new WP_Hook();
	}
	$wp_filter[ $tag ]->add_filter( $tag, $function_to_add, $priority, $accepted_args );
	return true;
}

Cвязанные функции

Из метки: Фильтры (хуки)

Еще из раздела: Хуки: события, фильтры

add_filter 48 комментариев
Полезные 4 Вопросы 3 Все
  • Виктор

    Что можно попробовать? Делал так, тоже не идет:
    add_filter('image_send_to_editor', 'true_img', 999);

    • campusboy1946 cайт: www.youtube.com/c/wpplus

      Расскажи, чего хочешь добиться, в какой момент и так далее. Чтобы можно было повторить остальным и разобраться.

      • Виктор

        Шаблон создан в Artisteer и довольно запутанный. При создании поста вставляю картинку кнопкой "Добавить медиафайл". На сайте экспериментирую с https протоколом, но возможно вернусь к http, желательно чтобы ссылка на картинку была указана без протокола т.е. не http://сайт.ru а //сайт.ru . Кроме того меня не устраивает class, поэтому ставлю другой. Приходится после вставки рисунка вносить эти изменения вручную, а хотелось бы чтобы так было сразу по умолчанию.

  • Nexus cайт: example.com @

    Здравствуйте.

    Есть плагин, который добавляет фильтр методом "add_filter".
    В кач-ве аргументов передается строка и анонимная функция.

    Проблема в следующем:
    Функция "_wp_filter_build_unique_id" (вызывается в "add_filter") пытается привести анонимную функцию к массиву, что приводит к утечке памяти.
    "var_dump($function_to_add);" выводит "UNKNOWN::0".

    Версии по:
    PHP: 5.4.7
    WP: 4.7.2

    Подскажите в чем может быть проблема?

  • Здравствуйте. Для правильной работы с REST-API и плагина Yoast пишу такой код(часть):

    add_filter( 'is_protected_meta', function ( $protected, $key, $type ) {
    	if ( $type === 'post' && $key === '_yoast_wpseo_focuskw' ) {
    		return true;
    	}
    	return $protected;
    	if ( $type === 'post' && $key === '_yoast_wpseo_title' ) {
    		return true;
    	}
    	return $protected;
    	if ( $type === 'post' && $key === '_yoast_wpseo_metadesc' ) {
    		return true;
    	}
    	return $protected;
    }, 10, 3 );

    Подскажите, как можно уменьшить данный код (дополнительных полей будет еще несколько для постов). Код не работает:

    $arr_custom_fields = array ("_yoast_wpseo_focuskw", "_yoast_wpseo_title", "_yoast_wpseo_metadesc");
    add_filter( 'is_protected_meta', function ( $protected, $key, $type ) {
    	if ( $type === 'post' && in_array($key,  $arr_custom_fields)) {
    		return true;
    	}
    	return $protected;
    }, 10, 3 );
    • campusboy1946 cайт: www.youtube.com/c/wpplus

      Привет! И не будет, ведь
      $arr_custom_fields объявлена вне анонимной функции. То есть для анонимной функции эта переменная неизвестна. Тут или перенести этот массив внутрь или использовать global $arr_custom_fields;

      3
    • Kama4660

      1) Во-первых у тебя ошибка в коде! Что это за return $protected; после каждой if проверки? Ниже первой такой строки обработка кода вообще не опуститься...

      2) Во-вторых что это за проверка такая?

          if ( $type === 'post' && $key === '_yoast_wpseo_title' ) {
      		return true;
      	}

      Поле начинающееся с _ так и так уже $protected=true, а ты все тот же true возвращаешь.

      3) В третьих как и сказал campusboy $arr_custom_fields не определена в лямбда функции... Тут или global нужен или use для лямбды:

      add_filter( 'is_protected_meta', function ( $protected, $key, $type ) use ($arr_custom_fields) {
      	if ( $type === 'post' && in_array($key,  $arr_custom_fields)) {
      		return true;
      	}
      	return $protected;
      }, 10, 3 );
      2
  • Рустам

    Все привет. Как при помощью плагина поменять title страницы?

    -1
  • Михаил cайт: trapeznaya.ucoz.ru @

    Добрый день! Подскажите как подключить add_filter к отдельному php файлу, а конкретно надо сделать -

    add_filter( 'comment_text', 'wptexturize'            );
    add_filter( 'comment_text', 'convert_chars'          );
    add_filter( 'comment_text', 'force_balance_tags', 25 );
    add_filter( 'comment_text', 'convert_smilies',    20 );
    add_filter( 'comment_text', 'wpautop',            30 );

    только вместо comment_text моя функция в отдельном (этом же php файле).
    Делаю для вывода предпросмотра коммента.

  • Андрей

    Маленькая синтаксическая ошибка в начале статьи "Прикрепляет указанную PHP функцию к указанному хукe-фильтру."

    1
  • Altai-1 @

    Внутри классов фильтры нужно указывать через объект:

    <?php add_filter( 'media_upload_newtab', array(&$this, 'media_upload_mycallback') ); ?>

    А где в этом случае указывать $priority, $accepted_args? Внутри array, или просто как следующие после array параметры?

  • Артур

    Добрый день! Вопрос по 1-му примеру, как добавить текст как там но в начало каждой статьи?

    • campusboy1946 cайт: www.youtube.com/c/wpplus

      Привет. Это же очевидно:

      add_filter('the_content', 'add_text_to_content');
      function add_text_to_content($content){
      	$text = "<p>При копировании статьи, ставьте обратную ссылку, пожалуйста!</p>" ;
      	return $text . $content;
      }
      2
  • Иван

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

    <?php
    /*
    Plugin Name: Закрывает внешние ссылки в комментариях
    Description: Заменяет все внешние ссылки в комментариях на конструкцию http://domen.ru/goto?ОРИГИНАЛНАЯ_ССЫЛКА
    Version: 1.0
    Author: Kama
    Author URI: http://wp-kama.ru
    */
    
    ## редирект
    if( false !== strpos( $_SERVER['REQUEST_URI'], '/goto?') ){
    	header('Location: '. $_SERVER['QUERY_STRING'], true, 302);
    	exit;
    }
    
    ## фильтры
    
    # закрываем все внешние ссылки в комментариях
    add_filter('comment_text', 'hide_external', 99);
    
    # закрываем все внешние ссылки в постах
    add_filter('the_content', 'hide_external', 99);
    
    # заменяет все внешние ссылки в переданном тексте на http://domen.ru/goto?ОРИГИНАЛНАЯ_ССЫЛКА
    # к заменяемым ссылкам добавляется rel="nofollow"
    function hide_external( $text ){
    	static $home_url, $home_patt; 
    	if( ! $home_url ){
    		$home_url = home_url();
    		$home_patt = str_replace('.', '\.', $home_url);
    	}
    
    	return preg_replace('~(]+)(href=[\'"])(?=http)(?!'. $home_patt .')~i', '\\1 rel="nofollow" \\2'. $home_url . '/goto?', $text ); //
    }

    собственно нужно изменить фильтр add_filter(), но пока не могу найти нужно хука тут https://wp-kama.ru/hooks/hooks-db , помогите найти пожалуйста

    Ответить27 дней назад #

Здравствуйте, !

Ваш комментарий