Uso de apply_filters con múltiples argumentos y múltiples add_filter

24 jul 2016, 17:36:22
Vistas: 15.2K
Votos: 1

Estoy usando apply_filters para conectar plugins pero tengo problemas con los argumentos. Hay un argumento, un array, y varias implementaciones de add_filter que coinciden con apply_filters, cada una pasa el array original y lo modifica.

Parece que puedes pasar varios argumentos desde apply_filter pero add_filter solo puede devolver un argumento, ¿es correcto o cómo manejas múltiples argumentos entre llamadas add_filter?

Necesito pasar un segundo argumento con un ID de cuenta, pero parece que por prioridad solo el primer add_filter puede trabajar con ese argumento. Planeo combinar ambos argumentos en un solo array para pasarlo, un array con otro array como primer valor y un ID de usuario como segundo argumento.

Editado para agregar ejemplo

$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, 'Error de usuario en Plugin 1', true);
    return $error;
}

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

// $userid aquí es en realidad $error devuelto desde error_check_1
function error_check_2($userid, $error){
    $error[] = get_user_meta($userid, 'Error de usuario en Plugin 2', true);
    return $error;
}

El código anterior no funciona como espero o necesito. Los filtros parecen encadenarse, donde el argumento devuelto por el primero se pasa como argumento al siguiente.

Quiero que ambos obtengan la variable $id y que la variable $error sea modificada como en el ejemplo.

8
Comentarios

¿Podrías publicar tu código para aclarar un poco tu pregunta?

Andy Macaulay-Brook Andy Macaulay-Brook
24 jul 2016 17:38:17

Editado para agregar un ejemplo.

Peter Bushnell Peter Bushnell
24 jul 2016 21:11:47

Los filtros se encadenan como dices. Están diseñados para funcionar así.

Andy Macaulay-Brook Andy Macaulay-Brook
24 jul 2016 21:18:34

El primer argumento debe ser el valor a filtrar: $error = apply_filters('check_for_more_errors', $error, $userid);, así que también corrige el orden de los parámetros en error_check_*.

Ismail Ismail
24 jul 2016 23:33:32

Tienes que devolver la primera variable, no la segunda.

fuxia fuxia
24 jul 2016 23:35:44

como dice @toscho... así que intercambiando los dos argumentos en todas partes debería solucionarlo.

majick majick
25 jul 2016 08:28:28

Los argumentos se intercambiaron y ahora el código funciona. Mi modelo mental ahora está actualizado y puedo usar otra excelente característica de WP. Estoy reduciendo el acoplamiento entre los plugins en los que trabajo, es interesante ver las soluciones que emplea WP. Gracias a todos por tomarse el tiempo de ayudar.

Peter Bushnell Peter Bushnell
25 jul 2016 09:25:17

@SamuelElh ¿Podrías convertir tu comentario en una respuesta para organizar? Gracias.

Andy Macaulay-Brook Andy Macaulay-Brook
25 jul 2016 16:21:56
Mostrar los 3 comentarios restantes
Todas las respuestas a la pregunta 1
2

apply_filters requiere que pases el valor a filtrar en el segundo parámetro de esta función (después del nombre de la etiqueta del hook)

$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 jul 2016 16:40:44
Comentarios

Creo que has escrito mal el nombre de la primera función ya que está enlazada a la función error_check_1.

tpaksu tpaksu
20 sept 2021 14:28:17

Gracias, ya está corregido.

Ismail Ismail
21 sept 2021 01:48:11