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

19

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

Estoy preguntando por algo avanzado. ¿Cómo se implementa en PHP? Por ejemplo, cómo recopila todos los enlaces de los diferentes complementos y "adjúntalos" a los enlaces principales, etc.

    
pregunta Aaron Lee 13.08.2013 - 10:53

2 respuestas

32

Descripción general

Básicamente, la " API de complemento ," que reúne filtros y enlaces, consta de las siguientes funciones:

  1. apply_filters() - execute
  2. do_action - execute
  3. apply_filters_ref_array() - execute
  4. do_action_ref_array() - execute
  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_filter es un Array global que contiene todos los nombres de filtro como subgrupos. Cada una de esas subarrays contiene incluso más subarrays que son devoluciones de llamada convocadas bajo una matriz de prioridad.

Resumen en profundidad

Entonces, cuando se llama a una función execute , WordPress busca en las matrices globales las claves con ese nombre. Luego, las devoluciones de llamada adjuntas se ejecutan prioridad tras prioridad. Lo único que sucede al principio son las devoluciones de llamada adjuntas al filtro all .

Cuando agrega una devolución de llamada utilizando add_action o add_filter , WordPress primero calcula una ID "ú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 pila global $wp_filter :

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

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

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

foreach ( (array) current( $wp_filter[ $tag ] ) as $the_ )
{
    call_user_func_array(
        $the_['function'], 
        array_slice(
            $args, 
            0, 
            (int) $the_['accepted_args']
        )
    );
}
    
respondido por el kaiser 13.08.2013 - 15:22
4

Enganches se incluyen tanto en los archivos principales de WordPress como en algunos archivos de temas principales. Le permiten conectar 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 emiten su contenido en el marco temático de 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 abres el archivo header.php en el marco del tema de Genesis:

do_action( 'genesis_header' );

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

Filtros le permite 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 utilizar con el Marco de diseño de Genesis

Aquí hay una lista de los filtros incluidos en WordPress

Este es un ejemplo de cómo puedes usar un filtro en un marco de tema como Genesis:

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 que dice el texto en tus comentarios. Funciona en cualquier tema.

Aquí hay otro ejemplo que personaliza la longitud de los 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 Archivo wp includes / post-template.php.

Esto es lo que parece:

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

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

Básicamente, los enlaces 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 principales.

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

    
respondido por el Brad Dalton 14.08.2013 - 11:05

Lea otras preguntas en las etiquetas