apply_filters с несколькими аргументами и множественными add_filter

24 июл. 2016 г., 17:36:22
Просмотры: 15.2K
Голосов: 1

Я использую apply_filters для связи между плагинами, но столкнулся с проблемой передачи аргументов. Есть один аргумент - массив, и несколько реализаций add_filter, соответствующих apply_filters, каждая из которых передает исходный массив и добавляет в него данные.

Кажется, что из apply_filter можно передать несколько аргументов, но add_filter может возвращать только один аргумент. Так ли это, или как правильно работать с несколькими аргументами между вызовами add_filter?

Мне нужно передать второй аргумент - ID аккаунта, но похоже, что только первый add_filter получает возможность работать с этим аргументом. Я планирую объединить оба аргумента в один массив и передать его - массив с массивом в качестве первого значения и ID пользователя в качестве второго аргумента.

Дополнено примером

$error = apply_filters('check_for_more_errors', $userid, $error);

add_filter('check_for_more_errors', 'error_check_1', 1, 2);

function error_check($userid, $error){
    $error[] = get_user_meta($userid, 'Plugin 1 user error', true);
    return $error;
}

add_filter('check_for_more_errors', 'error_check_2', 2, 2);

// $userid ниже фактически является $error, возвращенным из error_check_1 
function error_check_2($userid, $error){
    $error[] = get_user_meta($userid, 'Plugin 2 user error', true);
    return $error;
}

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

Мне нужно, чтобы обе функции получали переменную $id, а переменная $error дополнялась, как в примере.

8
Комментарии

Не могли бы вы опубликовать ваш код, чтобы немного прояснить ваш вопрос?

Andy Macaulay-Brook Andy Macaulay-Brook
24 июл. 2016 г. 17:38:17

Отредактировано, чтобы добавить пример.

Peter Bushnell Peter Bushnell
24 июл. 2016 г. 21:11:47

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

Andy Macaulay-Brook Andy Macaulay-Brook
24 июл. 2016 г. 21:18:34

Первый аргумент должен быть значением для фильтрации: $error = apply_filters('check_for_more_errors', $error, $userid);, поэтому также исправьте порядок параметров в error_check_*.

Ismail Ismail
24 июл. 2016 г. 23:33:32

Вы должны возвращать первую переменную, а не вторую.

fuxia fuxia
24 июл. 2016 г. 23:35:44

как сказал @toscho... так что везде нужно поменять местами два аргумента, чтобы исправить это.

majick majick
25 июл. 2016 г. 08:28:28

Аргументы были переставлены местами, и теперь код работает. Моя ментальная модель обновлена, и я могу использовать еще одну замечательную функцию WordPress. Я уменьшаю связность между плагинами, над которыми работаю, интересно увидеть решения, которые использует WP. Спасибо всем, кто нашел время помочь.

Peter Bushnell Peter Bushnell
25 июл. 2016 г. 09:25:17

@SamuelElh Не мог бы ты преобразовать свой комментарий в ответ, чтобы привести все в порядок? Спасибо.

Andy Macaulay-Brook Andy Macaulay-Brook
25 июл. 2016 г. 16:21:56
Показать остальные 3 комментариев
Все ответы на вопрос 1
2

apply_filters требует передачи значения для фильтрации во втором параметре функции (после имени хука)

$error = apply_filters('check_for_more_errors', $error, $userid);

add_filter('check_for_more_errors', 'error_check_1', 1, 2);

function error_check_1($error, $userid){
    $error[] = get_user_meta($userid, 'Plugin 1 user error', true);
    return $error;
}

add_filter('check_for_more_errors', 'error_check_2', 2, 2);

function error_check_2($error, $userid){
    $error[] = get_user_meta($userid, 'Plugin 2 user error', true);
    return $error;
}
25 июл. 2016 г. 16:40:44
Комментарии

Думаю, вы допустили опечатку в названии первой функции, так как она привязана к функции error_check_1.

tpaksu tpaksu
20 сент. 2021 г. 14:28:17

Спасибо, исправил.

Ismail Ismail
21 сент. 2021 г. 01:48:11