Hace unos días publiqué una entrada sobre qué son, cómo crear y cómo utilizar los filtros de WordPress. En esta entrada vamos a ver cómo pasar un parámetro a un filtro de WordPress.
Un filtro nos permite actuar sobre un contenido antes de mostrarlo en pantalla. Es una característica muy utilizada en WordPress y que nos da una flexibilidad muy grande a la hora de desarrollar plugins y/o temas.
Recordemos que para aplicar un filtro utilizamos la función apply_filters() que admite los siguientes parámetros:
$value = apply_filters( 'my_filter_hook', $value, $arg1, $arg2... );
Donde el primer parámetro es el nombre de nuestro filtro y el segundo es el valor que pasaremos a la función que aplicará el filtro. A continuación podemos pasar una serie de valores adicionales, tantos como queramos.
Después, a través de la función add_filter() podremos invocar a nuestra función de callback donde podremos intervenir y modificar el contenido y/o los valores de $value, $arg1, $arg2…
add_filter( string $tag, callable $function_to_add, int $priority = 10, int $accepted_args = 1 );
Pero, ¿qué pasa si queremos pasar uno o varios valores más a la función de callback? Es muy habitual tener una función donde hacemos un cálculo u obtenemos unos datos en función de unas premisas, y para cada casuística querer obtener un resultado distinto. Si al final de esta función llamamos a un filtro de WordPress o de un plugin de terceros, vamos a necesitar enviar un parámetro a nuestra función de callback para actuar en el filtro de una manera u otra.
Para esto haremos uso de las funciones anónimas (Clousure) de PHP. En el callback, en lugar de llamar a la función, crearemos una función anónima donde haremos uso de nuestro parámetro.
Utilizaré un ejemplo de pippin plugins donde a través de un filtro añadimos una serie de frutas a un array:
<?php
function pippin_show_fruits() {
$fruits = array(
'apples',
'oranges',
'kumkwats',
'dragon fruit',
'peaches',
'durians'
);
$list = '<ul>';
if ( has_filter('pippin_add_fruits') ) {
$fruits = apply_filters( 'pippin_add_fruits', $fruits );
}
foreach( $fruits as $fruit ) :
$list .= '<li>' . $fruit . '</li>';
endforeach;
$list .= '</ul>';
return $list;
}
function pippin_add_extra_fruits($fruits) {
$extra_fruits = array(
'plums',
'kiwis',
'tangerines',
'pepino melons',
);
// combine the two arrays
$fruits = array_merge( $extra_fruits, $fruits );
return $fruits;
}
add_filter( 'pippin_add_fruits', 'pippin_add_extra_fruits' );
echo pippin_show_fruits();
La función de callback pippin_add_extra_fruits() obtiene el valor de $fruits que aplicamos en el filtro y lo modifica. Si quisiéramos enviar un parámetro calculado adicional no podríamos. Para esto vamos a hacer uso de las funciones anónimas, para nuestro ejemplo quedaría del siguiente modo:
//Parámetro calculado
$my_param = array('bananas', 'pears');
add_filter('pippin_add_fruits', function( $fruits ) use($my_param) {
$fruits = array_merge($my_param, $fruits);
return $fruits;
});
De este modo enviamos la variable $my_param al fitro.