Problemas para entender apply_filters()
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
?
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.

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 Nada sucede automáticamente. Tienes que cambiar el valor en tu callback. También puedes devolverlo sin cambios si lo deseas, dependiendo del contexto.

¿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:

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

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.
