¿Diferencia entre el filtro y los ganchos de acción?

48

Recientemente he estado analizando un poco más la API del plugin y me preguntaba qué diferencias reales había entre la acción y los ganchos de filtro . Ambos son eventos que reciben datos como un parámetro y parece que ambos pueden hacer lo mismo.

Obviamente, veo que las acciones se llaman cuando se llevan a cabo las acciones y cuando se manipulan los datos cuando se manipulan los datos, pero parece ser solo una diferencia de nombre semántica.

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

    
pregunta Sruly 29.08.2010 - 14:27

3 respuestas

55

Hola @Sruly :

Usted prácticamente ha respondido su propia pregunta, pero lo explicaré un poco.

Ganchos de acción

Los ganchos de acciones están diseñados para ser utilizados cuando el núcleo de WordPress o algún complemento o tema le da la oportunidad de insertar su código en un determinado punto y hacer una o más de las siguientes acciones:

  1. Use echo para 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 (asumiendo que el enlace fue llamado por do_action_ref_array() en lugar de do_action() , ya que este último no admite el paso de variables por referencia .)

Enganches de filtro

Filter Hooks se comportan de manera muy similar a Action Hooks pero su uso previsto es recibir un valor y, posiblemente, 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, asumiendo que eso es lo que debe hacer cuando se llama el gancho. Una cosa que es muy importante acerca de los ganchos de filtro de los que no tiene que preocuparse con los ganchos de acción es que la persona que usa un gancho de filtro must devuelve (una versión modificada de ) El primer parámetro fue pasado. ¡Un error común de un novato es olvidar devolver ese valor!

Uso de parámetros adicionales para proporcionar contexto en los enlaces de filtro

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

Entonces, ¿cuál es la diferencia real?

En realidad, los ganchos de filtro son prácticamente un superconjunto de ganchos de acción. Lo primero puede hacer todo lo que puede hacer y un poco más, aunque el desarrollador no tiene la responsabilidad de devolver un valor con el gancho de acción que él o ella hacen con el gancho de filtro.

Dar orientación y intención de telegrafiar

Pero eso probablemente no es lo importante. Creo que lo importante es que al elegir un Gancho de Acción frente a un Gancho de Filtro o viceversa, están telegrafiando sus intenciones y, por lo tanto, brindan orientación al participante o desarrollador de plugin que podría estar usando el gancho. En esencia, están diciendo: "Te voy a llamar, haz lo que necesites hacer" OR "I ' Le pasaré este valor para modificarlo, pero asegúrese de que lo devuelva . "

Finalmente, 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!

    
respondido por el MikeSchinkel 29.08.2010 - 15:57
11

Si miras la fuente de la función add_action() core, es solo un contenedor para la función add_filter() ...

Y si nos fijamos en la función de núcleo do_action() , es muy similar a la función de núcleo apply_filters() , con una diferencia muy importante: no devuelve un valor.

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

    
respondido por el trusktr 29.06.2013 - 20:41
3

En palabras simples.

  

Acciones son las funciones de PHP que ejecutan la salida.

     

Filtros son las funciones de PHP que devuelven el resultado.

Actualizado: Podemos extender cualquier complemento que use las acciones y los filtros sin modificar el código. Agregando filtros y acciones en nuestro propio tema o complemento.

¿Cómo usarlo?

Acción:

Revise los ejemplos simples a continuación en su archivo de tema functions.php .

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

test();

El programa anterior imprime la salida:

Output

[NOTA: Aquí la prueba () 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)
function test1() {
     echo "Output";
}
add_action( 'test', 'test1' );

do_action( 'test' );

El programa anterior imprime la salida:

Output

[NOTA: Aquí do_action('test') funciona como una función de llamada. Y ejecute la función de devolución de llamada '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 una función de llamada. Y ejecutar funciones de devolución de llamada en sus prioridades.

La función de devolución de llamada 'test1' tiene prioridad 2 Y 'test2' tiene prioridad 1.]

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

Test 1Test 2
  1. Ejemplo Cuatro: (soporte de terceros) Agregue 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 complemento de ejemplo para ver cómo funciona para un desarrollador externo.

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

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

Ir al complemento del menú y activarlo.

Después de activar el complemento anterior, el programa imprime el resultado:

Test 1From plugin

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

From pluginTest 1

Porque, WordPress considera el 10 priority by default para todas las acciones agregadas.]

Filtros

Revise los siguientes ejemplos:

Ejemplo de PHP simple:

$data = array( 'one', 'two' );
print_r( $data );

El programa anterior imprime la salida:

Array ( [0] => one [1] => two )
  1. Ejemplo uno: (uso simple del filtro)
$data = apply_filters( 'my_filter_name', array( 'one', 'two' ) );
print_r( $data );

add_filter( 'my_filter_name', function( $old_data ) {
     return array( 'three', 'four' );
});

El programa anterior imprime la salida:

Array ( [0] => three [1] => four )

Aquí, hemos agregado el filtro my_filter_name y cambiamos la salida existente array( 'one', 'two' ) con array( 'three', 'four' ) sin cambiar los archivos de tema / complemento.

respondido por el maheshwaghmare 03.02.2017 - 16:37

Lea otras preguntas en las etiquetas