¿Diferencia entre ganchos de filtro y acción?

51

He estado mirando la API de complementos un poco más en profundidad recientemente y me preguntaba qué diferencias reales había entre la acción y los ganchos de filtro . Ambos son eventos que reciben datos como parámetro y parecen ser capaces de hacer lo mismo.

Obviamente, veo que las acciones se llaman cuando las acciones tienen lugar y los filtros se llaman cuando se manipulan los datos, pero parece ser una diferencia de nombres semántica.

Además de la semántica y para qué se utilizan, ¿qué diferencias reales hay entre ellos?

Sruly
fuente

Respuestas:

58

Hola @Sruly :

Casi has respondido tu propia pregunta, pero daré más detalles.

Ganchos de acción

Los ganchos de acciones están destinados a su uso cuando el núcleo de WordPress o algún complemento o tema le brinda la oportunidad de insertar su código en un punto determinado y hacer una o más de las siguientes acciones :

  1. Úselo echopara inyectar algo de HTML u otro contenido en el búfer de respuesta,
  2. Modificar el estado de la variable global para una o más variables, y / o
  3. Modifique los parámetros pasados ​​a su función de enlace (suponiendo que se llamó al do_action_ref_array()enlace en lugar de do_action()porque este último no admite el paso de variables por referencia ).

Ganchos de filtro

Los ganchos de filtro se comportan de manera muy similar a los ganchos de acción, pero su uso previsto es recibir un valor y potencialmente devolver una versión modificada del valor. Un gancho de filtro también podría usarse como un gancho de acción, es decir, para modificar una variable global o generar algo de HTML, suponiendo que eso es lo que necesita hacer cuando se llama al gancho. Una cosa que es muy importante acerca de Filter Hooks de la que no debe preocuparse con Action Hooks es que la persona que usa un Filter Hook debe devolver (una versión modificada de) el primer parámetro que se pasó. ¡Un error común de los novatos es olvidarse de devolver ese valor!

Uso de parámetros adicionales para proporcionar contexto en ganchos de filtro

Como comentario aparte , sentí que los ganchos de filtro se vieron obstaculizados en versiones anteriores de WordPress porque recibirían solo un parámetro; es decir, obtendrían un valor para modificar pero no un segundo o tercer parámetro para proporcionar ningún contexto. Últimamente, y positivamente, sin embargo, parece que el equipo central de WordPress ha estado agregando (para mí) con alegría parámetros adicionales a los ganchos de filtro para que pueda descubrir más contexto. Un buen ejemplo es el posts_wheregancho; Creo que algunas versiones anteriores solo aceptaban un parámetro que era la clase SQL "where" de la consulta actual, pero ahora acepta tanto la cláusula where como una referencia a la instancia actual de la WP_Queryclase que invoca el gancho.

Entonces, ¿cuál es la diferencia real?

En realidad, los Filter Hooks son un superconjunto de Action Hooks. El primero puede hacer cualquier cosa que el segundo pueda hacer y un poco más, aunque el desarrollador no tiene la responsabilidad de devolver un valor con el gancho de acción que hace con el gancho de filtro.

Orientación y intención telegráfica

Pero eso probablemente no sea lo importante. Creo que lo importante es que si un desarrollador elige usar un gancho de acción frente a un gancho de filtro o viceversa, está telegrafiando su intención y, por lo tanto, brinda orientación al desarrollador temático o desarrollador de complementos que podría estar usando el gancho. En esencia, dicen "Voy a llamarte, haz lo que sea que tengas que hacer" O "Te voy a pasar este valor para modificarlo, pero asegúrate de que lo devuelvas ".

Así que, en última instancia , creo que la orientación proporcionada por la elección del tipo de gancho es el valor real detrás de la distinción . OMI, de todos modos.

¡Espero que esto ayude!

MikeSchinkel
fuente
Para mí, parece que podría haber usado filtros para todo, ya que devolver una variable es opcional en PHP. ¿Alguien sabe por qué los desarrolladores de WordPress eligieron tener dos términos separados? ¿Es puramente por razones semánticas? Técnicamente no puedo ver la necesidad de ello ...
TheStoryCoder
2
@TheStoryCoder "¿Es puramente por razones semánticas?" Parece que eso es exactamente lo que explicó mi respuesta, hace cinco (5) años ...?
MikeSchinkel
11

Si nos fijamos en la fuente de la add_action()función principal, es solo un contenedor para la add_filter()función ...

Y si observa la do_action()función central, es muy similar a la apply_filters()función central, con una diferencia muy clave: no devuelve un valor.

Entonces, ¿qué significa esto? Las acciones son como filtros, excepto que una acción no devuelve un valor, por lo que no puede modificar los datos. Muestra que fue simple crear el mecanismo de acción de WordPress simplemente copiando el mecanismo de filtro y no devolviendo un valor. Básicamente, todo lo que puede hacer con una acción es simplemente ejecutar una función sin modificar algún valor.

trusktr
fuente
5

En palabras simples.

Las acciones son aquellas funciones PHP que ejecutan la salida.

Los filtros son aquellas funciones PHP que devuelven la salida.

Actualizado: podemos ampliar cualquier complemento que use las acciones y los filtros sin modificar su código. Al agregar filtros y acciones en nuestro propio tema o complemento.


¿Cómo utilizar?

Acción:

Consulte a continuación ejemplos simples en su functions.phparchivo de tema .

  1. Ejemplo uno: ( Ejemplo simple de PHP)
prueba de funcionamiento() {
     echo "Salida";
}

prueba();

El programa anterior imprime la salida:

Salida

[NOTA: Aquí test () simplemente llama a la función. Y ejecute la función de devolución de llamada 'prueba'.]


  1. Ejemplo dos: (Uso simple de la acción)
función test1 () {
     echo "Salida";
}
add_action ('prueba', 'prueba1');

do_action ('prueba');

El programa anterior imprime la salida:

Salida

[NOTA: Aquí do_action('test')funciona como una función de llamada. Y ejecute la función de devolución de llamada 'prueba1'.]


  1. Ejemplo tres: (Otro uso de acciones)
función test2 () {
     echo "Prueba 2";
}
add_action ('prueba', 'prueba2', 1);

función test1 () {
     echo "Prueba 1";
}
add_action ('prueba', 'prueba1', 2);

do_action ('prueba');

El programa anterior imprime la salida:

Prueba 2 Prueba 1

[NOTA: Aquí do_action('test')funciona como una función de llamada. Y ejecute funciones de devolución de llamada en sus prioridades.

La función de devolución de llamada 'prueba1' tiene prioridad 2 y 'prueba2' tiene prioridad 1.]

Si las prioridades cambian como 'prueba1' con prioridad 1 y 'prueba2' con prioridad 2, la salida será:

Prueba 1 Prueba 2

  1. Ejemplo cuatro: (soporte de terceros) Agregue el siguiente código enfunctions.php
función test1 () {
     do_action ('test_before');
     echo "Prueba 1";
     do_action ('test_after');
}
add_action ('prueba', 'prueba1');

do_action ('prueba');

El programa anterior imprime la salida:

Prueba 1

Ahora, cree un complemento de muestra para verificar cómo funciona para un desarrollador de terceros.

  1. Crear carpeta 'simple' en el /wp-content/plugins/directorio.
  2. Cree un archivo llamado 'simple.php' y agregue el siguiente código.
/ *
* Nombre del complemento: complemento simple
* /
function test_callback_function () {
     echo "Desde el complemento";
}
add_action ('test', 'test_callback_function');

Ahora, active nuestro complemento simple desde el panel de administración de WordPress.

Vaya al complemento de menú y actívelo.

Después de activar el complemento del programa anterior, imprima la salida:

Prueba 1 del complemento

[NOTA: Si agregamos la prioridad para nuestra acción de complemento del 1 al 9, imprime la salida como:

De pluginTest 1

Porque, WordPress considera el 10 priority by defaultpara todas las acciones añadidas.]

Filtros

Verifique los siguientes ejemplos:

Ejemplo simple de PHP:

$ data = array ('uno', 'dos');
print_r ($ datos);

El programa anterior imprime la salida:

Matriz ([0] => uno [1] => dos)
  1. Ejemplo uno: (Uso simple de filtro)
$ data = apply_filters ('my_filter_name', array ('uno', 'dos'));
print_r ($ datos);

add_filter ('my_filter_name', function ($ old_data) {
     matriz de retorno ('tres', 'cuatro');
});

El programa anterior imprime la salida:

Matriz ([0] => tres [1] => cuatro)

Aquí, hemos añadido filtro my_filter_namey cambiar la salida existente array( 'one', 'two' )con array( 'three', 'four' )sin cambiar el tema / plugin archivos.


maheshwaghmare
fuente
Gracias @maheshwaghmare por un truco tan simple. por favor escriba sobre 'Filtros' también
Adi
¿Qué quieres decir exactamente con "pronto"?
Rapti
@Rapti Perdón por la demora. Esta noche agregaré la respuesta relacionada con los filtros. En el futuro, crearé un artículo descriptivo sobre ganchos (acciones y filtros).
maheshwaghmare
@maheshwaghmare postergando mucho? : P
Buena explicación, ahora tengo una mejor comprensión
budiantoip