Problemas para entender apply_filters()

26 abr 2013, 17:40:50
Vistas: 30.2K
Votos: 21

En apply_filters()

apply_filters( $tag, $value, $var ... );

Estoy teniendo problemas para entender el $value y $var. He leído el codex y parece que el $value puede ser modificado, $var no, pero no he encontrado ningún ejemplo de esto en la práctica. Parece ser utilizado como una forma de pasar una variable. En ese caso, ¿cuál es la diferencia entre eso y el $var?

0
Todas las respuestas a la pregunta 2
3
36

Intenta ver la función con nombres más descriptivos:

apply_filters(
    $nombre_filtro,     // usado para add_filter( $nombre_filtro, 'callback' );
    $valor_a_modificar, // la única variable cuyo valor puedes cambiar
    $contexto_1,       // contexto
    $contexto_2        // más contexto
);

Así que cuando esa función se llama como:

// wp-login.php línea 94
apply_filters( 'login_body_class', $classes, $action );

Puedes usar...

add_filter( 'login_body_class', 'funcion_para_cambiar_clases_cuerpo_login', 10, 2 );

... y recibir dos variables pasadas a esa función. Devuelves la primera, la segunda solo proporciona más contexto:

function funcion_para_cambiar_clases_cuerpo_login( $classes, $action )
{
    if ( 'login' === $action )
        $classes[] = 'foo';

    if ( 'postpass' === $action )
        $classes[] = 'bar';

    return $classes;
}

Las variables adicionales están ahí para facilitar tus decisiones, no para cambiarlas también.

26 abr 2013 17:54:24
Comentarios

Si entendí correctamente. ¿No necesito agregar una variable para recolectar el valor devuelto por apply_filters ya que se aplica automáticamente a $value_to_change?

r00tAcc3ss r00tAcc3ss
26 abr 2013 18:21:13

@r00tAcc3ss Nada sucede automáticamente. Tienes que cambiar el valor en tu callback. También puedes devolverlo sin cambios si lo deseas, dependiendo del contexto.

fuxia fuxia
26 abr 2013 18:33:53

Ah, sí. Quise decir que no necesito capturar el valor devuelto en otra variable y asignarlo a $value. Eso se hace "automáticamente" si modifico $value en la función enlazada y lo retorno.

r00tAcc3ss r00tAcc3ss
26 abr 2013 19:17:45
3
14

¿Qué son los Filtros?

Los filtros son funciones a través de las cuales WordPress pasa datos, en ciertos puntos de ejecución, justo antes de realizar alguna acción con los datos (como agregarlos a la base de datos o enviarlos a la pantalla del navegador). Los filtros se sitúan entre la base de datos y el navegador (cuando WordPress está generando páginas), y entre el navegador y la base de datos (cuando WordPress está agregando nuevas entradas y comentarios a la base de datos); la mayoría de las entradas y salidas en WordPress pasan por al menos un filtro. WordPress realiza algunos filtros por defecto, y tu plugin puede agregar sus propios filtros.

Conectando a un Filtro

Para permitir a los usuarios cambiar ciertos datos específicos (un valor, la salida de una función, etc.), se proporcionan ganchos de filtro mediante funciones apply_filters.
Estos ganchos de filtro incluyen el nombre (o etiqueta) del filtro y al menos el nombre de la función que se utilizará para filtrar (es decir, alterar de alguna manera) los datos.

Para alterar el título de una entrada, puedes usar el gancho de filtro the_title, que se define de la siguiente manera:

apply_filters( 'the_title', $title, $id );

Esto significa que el filtro tiene la etiqueta/nombre the_title, el primer parámetro $title son los datos que se van a cambiar (es decir, el título de la entrada) y el segundo parámetro $id es información adicional (en este caso el ID de la entrada).

Para mostrar el título de cada entrada en MAYÚSCULAS, por ejemplo, puedes usar la siguiente línea:

add_filter('the_title', 'strtoupper');

Si observamos la función add_filter, vemos que se define de la siguiente manera:

add_filter( $tag, $function_to_add, $priority, $accepted_args );

Solo especificamos el primer y segundo parámetro (obligatorios), mientras que el tercero y cuarto parámetro se establecen a sus valores predeterminados respectivos (es decir, 10 y 1).

Un Filtro Más Complejo

Si deseas filtrar solo una entrada específica, puedes usar la información adicional (en este caso del filtro: el ID). Para hacer esto, debes especificar el número de parámetros (que es 2 en este caso), y para hacer esto nuevamente, debes especificar el parámetro de prioridad (que viene antes del número de argumentos).

Supongamos que queremos afectar solo el título de la entrada con el ID 42, entonces se vería así:

add_filter('the_title', 'my_strtoupper', 10, 2);
function my_strtoupper($title, $id) {
    if (42 === $id) return strtoupper($title);
    return $title;
} // función my_strtoupper

En este caso, tenemos que especificar los cuatro parámetros disponibles.

¿Qué Parámetros Tengo?

Para identificar el (número de) parámetros disponibles de un filtro en particular, debes buscar dónde se define (en este caso: aquí).


Referencias:

26 abr 2013 18:27:54
Comentarios

+1 por una respuesta exhaustiva y una clase impecable (¡buen formato, brochacho!)

bosco bosco
26 abr 2013 18:41:58

Gracias, es muy detallado, pero realmente no explica lo que estaba preguntando. Por ejemplo, la diferencia entre la variable $value y la variable $var en el filtro.

r00tAcc3ss r00tAcc3ss
26 abr 2013 19:20:54

Hmm, yo diría que sí lo hace, pero claro, eso es mi sensación subjetiva. Aunque añadiré más información sobre el filtro y sus parámetros.

tfrommen tfrommen
26 abr 2013 19:24:36