WordPress Code Snippets

¿Quieres patrocinar?

¿Quieres aparecer aquí? Si quieres patrocinar este blog, ponte en contacto conmigo a través de este formulario

Cómo pasar un parámetro a un filtro de WordPress

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.

¿Te ha resultado útil esta información?

Si este post te ha resuelto un problema, invítame a un café o a una cerveza. Con este pequeño gesto me animas a seguir escribiendo.