¿Cuál es la Diferencia Entre los Hooks de Filtro y Acción?

29 ago 2010, 15:27:31
Vistas: 38.6K
Votos: 63

He estado analizando la API de plugins con más profundidad recientemente y me preguntaba cuáles son las diferencias reales entre los hooks de acción y los de filtro. Ambos son eventos que reciben datos como parámetros y parece que ambos pueden hacer las mismas cosas.

Obviamente, veo que las acciones se llaman cuando ocurren acciones y los filtros se llaman cuando se manipulan datos, pero parece ser solo una diferencia semántica en su nomenclatura.

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

0
Todas las respuestas a la pregunta 4
3
68

Hola @Sruly:

Básicamente has respondido tu propia pregunta, pero voy a elaborar un poco más.

Action Hooks (Ganchos de Acción)

Los Action Hooks están diseñados para usarse cuando WordPress core, algún plugin o tema te da la oportunidad de insertar tu código en un punto específico y hacer una o más de las siguientes acciones:

  1. Usar echo para inyectar algún HTML u otro contenido en el búfer de respuesta,
  2. Modificar el estado de variables globales para una o más variables, y/o
  3. Modificar los parámetros pasados a tu función hook (asumiendo que el hook fue llamado con do_action_ref_array() en lugar de do_action(), ya que este último no soporta pasar variables por referencia).

Filter Hooks (Ganchos de Filtro)

Los Filter Hooks se comportan de manera muy similar a los Action Hooks, pero su propósito principal es recibir un valor y potencialmente devolver una versión modificada del mismo. Un filtro también podría usarse como un Action Hook, es decir, para modificar una variable global o generar algún HTML, asumiendo que eso es lo que necesitas hacer cuando se llama al hook. Algo muy importante de los Filter Hooks, que no necesitas preocuparte en los Action Hooks, es que la persona que usa un Filter Hook debe devolver (una versión modificada de) el primer parámetro que se le pasó. ¡Un error común de principiantes es olvidarse de devolver ese valor!

Usar Parámetros Adicionales para Proporcionar Contexto en Filter Hooks

Como nota al margen, sentía que los Filter Hooks estaban limitados en versiones anteriores de WordPress porque solo recibían un parámetro; es decir, obtenían un valor para modificar pero ningún 2do o 3er parámetro para dar contexto. Sin embargo, últimamente (y afortunadamente), parece que el equipo de WordPress core ha estado agregando parámetros extra a los Filter Hooks para que puedas obtener más contexto. Un buen ejemplo es el hook posts_where; creo que hace algunas versiones solo aceptaba un parámetro (la cláusula SQL "where" de la consulta actual), pero ahora acepta tanto la cláusula where como una referencia a la instancia actual de la clase WP_Query que está invocando el hook.

¿Cuál es la Diferencia Real?

En realidad, los Filter Hooks son prácticamente un superconjunto de los Action Hooks. Los primeros pueden hacer todo lo que hacen los segundos y un poco más, aunque el desarrollador no tiene la responsabilidad de devolver un valor con un Action Hook como sí la tiene con un Filter Hook.

Dar Orientación y Comunicar Intención

Pero probablemente eso no sea lo importante. Creo que lo relevante es que, al elegir usar un Action Hook en lugar de un Filter Hook o viceversa, el desarrollador está comunicando su intención y, por lo tanto, dando orientación al creador de temas o plugins que podría usar el hook. Básicamente, están diciendo: "Voy a llamarte, haz lo que necesites hacer" O "Te voy a pasar este valor para que lo modifiques, pero asegúrate de devolverlo".

Así que, en última instancia, creo que la orientación proporcionada por la elección del tipo de hook es el verdadero valor detrás de la distinción. En mi opinión, al menos.

¡Espero que esto ayude!

29 ago 2010 16:57:19
Comentarios

Me parece que podrías 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 veo la necesidad de ello...

TheStoryCoder TheStoryCoder
10 jun 2015 10:27:23

@TheStoryCoder "¿Es puramente por razones semánticas?" Parece que eso es exactamente lo que explicó mi respuesta, hace cinco (5) años...?

MikeSchinkel MikeSchinkel
14 jun 2015 02:13:39

Estoy realmente contento de haber encontrado tanto esta pregunta como esta respuesta. Estoy seguro de que la mayoría de los que votaron positivamente reflexionan como yo sobre la idea de que son esencialmente lo mismo y encontraron en esta respuesta una explicación satisfactoriamente clara de las sutilezas.

ecv ecv
18 mar 2024 00:46:03
0
14

Si miras el código fuente de la función principal add_action(), verás que es simplemente un envoltorio para la función add_filter()...

Y si examinas la función principal do_action(), es muy similar a la función principal apply_filters(), con una diferencia clave: no devuelve ningún valor.

¿Qué significa esto? Las acciones son como filtros, excepto que una acción no devuelve un valor, por lo que no puedes modificar datos. Esto demuestra que fue sencillo crear el mecanismo de acciones de WordPress simplemente copiando el mecanismo de filtros y omitiendo el retorno de valores. Básicamente, todo lo que puedes hacer con una acción es ejecutar una función sin modificar ningún valor.

29 jun 2013 21:41:50
7

En palabras simples.

Acciones son aquellas funciones PHP que ejecutan la salida.

Filtros son aquellas funciones PHP que retornan la salida.

Actualizado: Podemos extender cualquier plugin que use acciones y filtros sin modificar su código. Añadiendo filtros y acciones en nuestro propio tema o plugin.


¿Cómo usarlos?

Acciones:

Revisa los siguientes ejemplos simples en el archivo functions.php de tu tema.

  1. Ejemplo Uno: (Ejemplo simple de PHP)
function test() {
     echo "Salida";
}

test();

El programa anterior imprime la salida:

Salida

[NOTA: Aquí test() simplemente llama a la función. Y ejecuta la función callback 'test'.]


  1. Ejemplo Dos: (Uso simple de Acción)
function test1() {
     echo "Salida";
}
add_action( 'test', 'test1' );

do_action( 'test' );

El programa anterior imprime la salida:

Salida

[NOTA: Aquí do_action('test') funciona como llamar a una función. Y ejecuta la función callback 'test1'.]


  1. Ejemplo Tres: (Otro uso de Acciones)
function test2() {
     echo "Test 2";
}
add_action( 'test', 'test2', 1 );

function test1() {
     echo "Test 1";
}
add_action( 'test', 'test1', 2 );

do_action( 'test' );

El programa anterior imprime la salida:

Test 2Test 1

[NOTA: Aquí do_action('test') funciona como llamar a una función. Y ejecuta las funciones callback según sus prioridades.

La función callback 'test1' tiene prioridad 2 y 'test2' tiene prioridad 1. ]

Si las prioridades se cambian, 'test1' con prioridad 1 y 'test2' con prioridad 2, la salida será:

Test 1Test 2

  1. Ejemplo Cuatro: (Soporte para terceros) Añade el siguiente código en functions.php
function test1() {
     do_action( 'test_before' );
     echo "Test 1";
     do_action( 'test_after' );
}
add_action( 'test', 'test1' );

do_action( 'test' );

El programa anterior imprime la salida:

Test 1

Ahora, crea un plugin de ejemplo para ver cómo funciona para desarrolladores externos.

  1. Crea la carpeta 'simple' en el directorio /wp-content/plugins/.
  2. Crea un archivo llamado 'simple.php' y añade el siguiente código.
/*
* Plugin Name: Plugin Simple
*/
function test_callback_function() {
     echo "Desde el plugin";
}
add_action( 'test', 'test_callback_function' );

Ahora, activa nuestro Plugin Simple desde el panel de administración de WordPress.

Ve al menú de plugins y actívalo.

Después de activar el plugin, el programa imprime la salida:

Test 1Desde el plugin

[NOTA: Si añadimos una prioridad para la acción de nuestro plugin de 1 a 9, imprimirá la salida así:

Desde el pluginTest 1

Porque WordPress considera la prioridad 10 por defecto para todas las acciones añadidas.]

Filtros

Revisa los siguientes ejemplos:

Ejemplo simple de PHP:

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

El programa anterior imprime la salida:

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

add_filter( 'my_filter_name', function( $old_data ) {
     return array( 'tres', 'cuatro' );
});

El programa anterior imprime la salida:

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

Aquí, hemos añadido el filtro my_filter_name y cambiado la salida existente array( 'uno', 'dos' ) por array( 'tres', 'cuatro' ) sin modificar los archivos del tema/plugin.


3 feb 2017 17:37:31
Comentarios

Gracias @maheshwaghmare por un truco tan sencillo. Por favor, escribe también sobre 'Filtros'

Adi Adi
22 feb 2017 12:59:19

¿Qué quieres decir exactamente con "pronto"?

Rapti Rapti
4 abr 2017 16:15:39

@Rapti Disculpa la demora. Esta noche agregaré la respuesta relacionada con los filtros. En el futuro crearé un artículo descriptivo sobre Hooks (Acciones y Filtros).

maheshwaghmare maheshwaghmare
4 abr 2017 17:02:42

@maheshwaghmare ¿mucho procrastinando? :P

User User
4 may 2017 04:37:09

Buena explicación, ahora lo entiendo mejor

Budianto IP Budianto IP
11 feb 2018 20:01:39

¿Por qué no llamar los métodos directamente y por qué no filtrar los datos directamente donde se necesiten? ¿Cuál es el verdadero propósito de los métodos do_action, add_action y apply_filters?

f_i f_i
18 mar 2018 16:55:01

La razón es extender la funcionalidad del tema o plugin sin modificar su código.

maheshwaghmare maheshwaghmare
18 mar 2018 16:56:46
Mostrar los 2 comentarios restantes
0

La principal diferencia entre una acción y un filtro puede resumirse así:

  • una acción toma la información que recibe, hace algo con ella y no devuelve nada. En otras palabras: actúa sobre algo y luego termina, sin devolver nada al hook que la llamó.
  • un filtro toma la información que recibe, la modifica de alguna manera y la devuelve. Es decir: filtra algo y lo pasa de vuelta al hook para su uso posterior.

Dicho de otra forma:

  • una acción interrumpe el flujo del código para hacer algo y luego retorna al flujo normal sin modificar nada;
  • un filtro se usa para modificar algo de manera específica, de modo que dicha modificación sea utilizada más adelante por el código.

El "algo" mencionado se refiere a la lista de parámetros enviados mediante la definición del hook.

Según la documentación oficial de WordPress

16 nov 2020 12:36:52