¿Cómo funcionan realmente los filtros y los ganchos en PHP?

21

¿Cómo funcionan realmente los filtros y los ganchos en WordPress?

Estoy preguntando sobre algo avanzado. ¿Cómo se implementa en PHP? Por ejemplo, ¿cómo recopila todos los ganchos de los diferentes complementos y los "conecta" a los ganchos centrales, etc.

Aaron Lee
fuente
2
Hasta donde sé, no hay 'ganchos' o 'filtros' en php, hay funciones. Wordpress tiene funciones especiales que antes de sus ejecuciones utilizan una devolución de llamada de otras funciones.
Ofir Baruch
3
@OfirBaruch, estoy bastante seguro de que el OP se refería a su implementación en WordPress, y no estaba sugiriendo que hubiera alguna implementación nativa de PHP.
Tom Auger

Respuestas:

33

Visión general

Básicamente, la " API de complementos " , que convoca filtros y ganchos, consta de las siguientes funciones:

  1. apply_filters()- ejecutar
  2. do_action- ejecutar
  3. apply_filters_ref_array()- ejecutar
  4. do_action_ref_array()- ejecutar
  5. add_filter()- agregar a la pila
  6. add_action()- agregar a la pila

Internos básicos

En general, hay un par de globales (qué más en el mundo de WordPress) involucrados:

global $wp_filter, $wp_actions, $wp_current_filter, $merged_filters;

El primero $wp_filteres un global Arrayque contiene todos los nombres de filtro como submatrices. Cada una de esas submatrices contiene aún más submatrices que son devoluciones de llamada convocadas bajo una matriz de prioridad.

Breve en profundidad

Entonces, cuando se llama a una función de ejecución , WordPress busca en esas matrices globales las claves con ese nombre. Luego, las devoluciones de llamada adjuntas se ejecutan prioridad tras prioridad. Lo único que sucede por adelantado son las devoluciones de llamada conectadas al allfiltro.

Cuando agrega una devolución de llamada usando add_actiono add_filter, WordPress primero calcula una identificación "única" para no sobrescribir las devoluciones de llamada ya adjuntas.

$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);

Luego agrega su devolución de llamada a la global $wp_filterpila:

$wp_filter[ $tag ][ $priority ][ $idx ] = array(
    'function'      => $function_to_add,
    'accepted_args' => $accepted_args
);

Como puede ver, la matriz secundaria principal es $tag(o nombre de acción / filtro), luego todo se convoca bajo una prioridad específica, y luego la cadena de devolución de llamada / ID "única" se utiliza como clave.

Más tarde, cuando se llama a un filtro, que ocurre con el $tag/ action- / filter-name, se busca la matriz y se llaman las devoluciones de llamada. Como lo está utilizando call_user_func_array, realmente no importa cuántos argumentos se adjunten. WordPress lo resuelve por sí solo.

foreach ( (array) current( $wp_filter[ $tag ] ) as $the_ )
{
    call_user_func_array(
        $the_['function'], 
        array_slice(
            $args, 
            0, 
            (int) $the_['accepted_args']
        )
    );
}
emperador
fuente
3
no olvide que a medida que pasa por las devoluciones de llamada, ordena la ejecución de varias devoluciones de llamada en el mismo gancho utilizando su "prioridad", que se establece (opcionalmente) con add_action () y apply_filters () y el valor predeterminado es 10.
Tom Taladro
1
@TomAuger Por favor, siéntase libre de agregar notas y ediciones adicionales a la respuesta.
Kaiser
5

Los ganchos se incluyen en los archivos principales de WordPress y en algunos archivos de temas principales. Le permiten enganchar contenido en una ubicación específica del archivo.

Un ejemplo es el gancho wp_head en WordPress. Puede usar este gancho en el tema de su hijo para agregar contenido en esa ubicación '

Ejemplo:

add_action('wp_head', 'add_content_to_head');
function add_content_to_head() {
echo 'Your Content';
}

Algunos temas premium también incluyen ganchos de acción que puede usar en un tema secundario para hacer lo mismo. Aquí hay un mapa visual que incluye todos los ganchos de acción y la posición en la que generan su contenido en el marco del tema Genesis.

Ejemplo:

add_action('genesis_header', 'add_content_to_header');
function add_content_to_header() {
echo 'Your Content';
}

Así es como se ve el gancho si abre el archivo header.php en el marco del tema Genesis:

do_action( 'genesis_header' );

Aquí hay una lista de ganchos de WordPress que puede usar de muchas maneras.

Los filtros le permiten modificar la salida de una función existente y se incluye tanto en los archivos principales de WordPress como en algunos marcos de temas principales como Genesis.

Aquí hay una lista de los filtros que puede usar con Genesis Design Framework

Aquí hay una lista de los filtros incluidos en WordPress

Aquí hay un ejemplo de cómo puede usar un filtro en un marco temático como Génesis:

add_filter( 'comment_author_says_text', 'custom_comment_author_says_text' );
function custom_comment_author_says_text() {
return 'author says';
}

El código anterior se puede usar en un tema secundario para modificar el autor dice el texto en sus comentarios. Funciona en cualquier tema.

Aquí hay otro ejemplo que personaliza la longitud de extractos a 50 palabras:

add_filter( 'excerpt_length', 'change_excerpt_length' );
function change_excerpt_length($length) {
return 50; 
}

Encontrará la función the_excerpt () en el archivo wp-includes / post-template.php.

Así es como se ve:

  function the_excerpt() {
        echo apply_filters('the_excerpt', get_the_excerpt());
}

También puede usar ganchos y filtros en complementos para hacer exactamente lo mismo y el código no se perderá cuando actualice el tema principal o WordPress.

Básicamente, los ganchos y filtros le permiten personalizar y modificar tanto WordPress como su tema principal sin editar los archivos principales de WordPress o sus archivos de tema principal.

Es significativamente más fácil personalizar un tema secundario cuando el marco del tema principal incluye ganchos y filtros porque nunca necesita editar los archivos de plantilla de temas principales. De esta manera, también puede cambiar de forma segura los temas.

Brad Dalton
fuente
2
Esta es una excelente descripción general de los ganchos y filtros, pero me temo que omito por completo la pregunta del OP, que trata sobre el funcionamiento interno de los ganchos y cómo WordPress los crea, almacena y procesa. Gran respuesta; Probablemente debería vincular a su tutorial en los sitios de WP.
Tom Auger
Ok, lo borraré. Lo malo es que debería haber leído mejor la pregunta, pero pensé que las respuestas ya dadas serían más fáciles de entender para los principiantes si supieran primero lo básico.
Brad Dalton el
2
Brad, lo eliminé porque creo que podría ser útil tener esa información aquí también. Si no está de acuerdo, solo mencione / haga ping aquí y lo eliminaré nuevamente.
kaiser