WordPress: как вернуть значение при использовании add_filter?

Я много раз читал кодекс WordPress, но до сих пор не понимаю, как вернуть значение, если задействовано более одного аргумента. Например:

function bbp_get_topic_title( $topic_id = 0 ) {
    $topic_id = bbp_get_topic_id( $topic_id );
    $title    = get_the_title( $topic_id );

    return apply_filters( 'bbp_get_topic_title', $title, $topic_id );
}

В приведенном выше фильтре есть 2 аргумента. Когда я add_filter, должен ли я вернуть 2 значения или просто вернуть то, что мне нужно? Верен ли следующий пример, если нужен заголовок?

add_filter( 'bbp_get_topic_title', 'my_topic_title', 10, 2 );

function my_topic_title( $title, $topic_id ){
  $title = 'my_example_title';
  return $title;
}

person Jenny    schedule 10.12.2012    source источник


Ответы (2)


Это абсолютно правильно.

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

Любые дополнительные аргументы, которые вы передаете функции, будут переданы функциям фильтрации, но только, если они запросили дополнительные аргументы. Вот пример:

// Minimal usage for add_filter()
add_filter( 'my_filter', 'my_filtering_function1' );
// We added a priority for our filter - the default priority is 10
add_filter( 'my_filter', 'my_filtering_function2', 11 );
// Full usage of add_filter() - we set a priority for our function and add a number of accepted arguments.
add_filter( 'my_filter', 'my_filtering_function3', 12, 2 );

// Apply our custom filter
apply_filters( 'my_filter', 'content to be filtered', 'argument 2', 'argument 3' );

Учитывая приведенный выше код, content to be filtered будет сначала передано my_filtering_function1. Эта функция будет получать только content to be filtered, а не дополнительные аргументы.

Затем содержимое будет передано (после обработки my_filtering_function1) в my_filtering_function2. Снова функция получит только первый аргумент.

Наконец, содержимое будет передано функции my_filtering_function3 (так как оно было изменено двумя предыдущими функциями). На этот раз функции вместо этого будут переданы 2 аргумента (поскольку мы указали это), но она не получит аргумент argument 3.


См. apply_filters() в исходном коде.

person Nikola Ivanov Nikolov    schedule 10.12.2012
comment
что произойдет, если я верну настроенный $topic_id? - person Jenny; 10.12.2012
comment
Вы не можете :) Я имею в виду, что вы можете сделать return $topic_id; вместо return $title;, но это изменит только значение, которое изначально фильтруется, и не повлияет на переменную $topic_id. Вы можете попробовать определить свою функцию следующим образом: function my_filtering_function ( $title, &$topic_id ) - чтобы $topic_id было передано как ссылка, но я не уверен на 100%, что это сработает. - person Nikola Ivanov Nikolov; 10.12.2012
comment
Хорошее объяснение! Я добавил его в документы WordPress; codex.wordpress.org/Function_Reference/add_filter#See_Also - person numediaweb; 07.04.2014

Практика add_filter и apply_filters

Первое, что нужно знать, это то, что apply_filters возвращает свой второй аргумент, попробуйте это в functions.php:

echo apply_filters('cat_story', 'A cat'); // echoes "A cat"

Второе, что нужно знать, это то, что перед тем, как apply_filters вернет кота, он применяет фильтры, в которых можно изменить кота, добавьте фильтры с add_filter:

function add_chasing_mice($cat) {
    return $cat . ' is chasing a mice';
}
add_filter('cat_story', 'add_chasing_mice');

echo apply_filters('cat_story', 'A cat'); // echoes "A cat is chasing a mice"

Третье, что нужно знать, это то, что мы можем добавить несколько фильтров:

// #1
function add_chasing_mice($cat) {
    return $cat . ' is chasing a mice';
}
add_filter('cat_story', 'add_chasing_mice');

// #2
function add_something_else($cat) {
    return $cat . ', but it\'s not gonna catch it';
}
add_filter('cat_story', 'add_something_else');

echo apply_filters('cat_story', 'A cat'); // echoes "A cat is chasing a mice but it\'s not gonna catch it"

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

// #1
function add_chasing_mice($cat) {
    return $cat . ' is chasing a mice';
}
add_filter('cat_story', 'add_chasing_mice', 10); // 10 - is priority

// #2
function add_something_else($cat) {
    return $cat . ', but it\'s not gonna catch it';
}
add_filter('cat_story', 'add_something_else'); // 10 as well, if omitted 

// The filter will be applied before `add_chasing_mice` and `add_something_else`
function replace_the_cat($cat) {
    return 'A dog';
}
add_filter('cat_story', 'replace_the_cat', 9); // 9 < 10, so the filter will be applied first

echo apply_filters('cat_story', 'A cat'); // echoes "A dog is chasing a mice but it's not gonna catch it";

Пятое, что нужно знать, это то, что вы можете передавать своим фильтрам дополнительные аргументы:

function add_chasing_mice($cat) {
    return $cat . ' is chasing mice';
}
add_filter('cat_story', 'add_chasing_mice', 10); // 10 - is priority

function add_something_else($cat, $exclam, $wft) {
    return $cat . ', but it\'s not gonna catch it' . $exclam . $wft;
}
add_filter('cat_story', 'add_something_else', 10, 3); // 3 arguments

function replace_the_cat($cat) {
    return 'A dog';
}
add_filter('cat_story', 'replace_the_cat', 9); // 9 < 10, so the filter will be applied first

echo apply_filters('cat_story', 'A cat', '!!!', '!1wTf!?'); 
// 3 arguments are: 'A cat', '!!!', '!1wTf!?'.
// echoes "A dog is chasing a mice but it's not gonna catch it!!!!1wTf!?";
person Denis Fedorov    schedule 12.10.2020