¿Cómo sé qué variables se pasan en un filtro / acción y cuál es su significado?

2

Algo que ya he visto varias veces y no entiendo es lo siguiente: en functions.php de un tema, se define una función y luego se adjunta a un gancho, por ejemplo (ejemplo simplificado):

function do_stuff($a, $b) {
    // Do stuff with $a and $b
}
add_filter( 'bloginfo_url', 'do_stuff', 10, 2 );

Básicamente, creo que entiendo qué está pasando allí, pero ¿cómo puedo saber qué son $a y $b ? En una forma PHP "tradicional", se podría llamar a la función así:

do_stuff("var a content", $var_b_content);

Entonces está claro lo que contienen $a y $b , pero ¿cómo puedo saberlo con Wordpress?

Ejemplo de la vida real, tome la siguiente función (crédito para Frank Bültge ):

if ( ! function_exists( 'fb_css_cache_buster' ) ) {
        function fb_css_cache_buster( $info, $show ) {
                if ( ! isset($pieces[1]) )
                        $pieces[1] = '';
                if ( 'stylesheet_url' == $show ) {

                        // Is there already a querystring? If so, add to the end of that.
                        if ( strpos($pieces[1], '?' ) === FALSE ) {
                                return $info . "?" . filemtime( WP_CONTENT_DIR . $pieces[1] );
                        } else {
                                $morsels = explode( "?", $pieces[1] );
                                return $info . "&" . filemtime( WP_CONTENT_DIR . $morsles[1] );
                        }
                } else {
                        return $info;
                }
        }

        add_filter( 'bloginfo_url', 'fb_css_cache_buster', 9999, 2 );
}

La función se puede usar para el control de versiones de CSS adjuntando la fecha del último cambio (usando filemtime ) como una cadena de consulta a la llamada de CSS.

Puedes ver, los usos $info y $show como variables que se pasan a esa función. Pero, ¿cómo puedo saber qué contienen estas variables? Incluso utiliza estas variables en la lógica condicional ( 'stylesheet_url' == $show ), ¿por lo que de alguna manera se debe pasar algo automáticamente?

    
pregunta Sven 02.11.2013 - 12:17

1 respuesta

5

Básicamente, todos los filtros deben registrarse en el código de función original (ya que un filtro es solo una forma en que puede sobrescribir lo que está sucediendo en la función predeterminada). Entonces, antes de poder adjuntar su función personalizada a un filtro usando add_filter() , el filtro debe registrarse antes con apply_filters() (hay otras funciones que hacen lo mismo, pero esta es la más importante).

Entonces, en el ejemplo que has dado en función original hay una llamada a apply_filters() (línea 533):

$output = apply_filters('bloginfo_url', $output, $show);

Como puede ver, los dos parámetros en el contexto de la función original son $output y $show .

Para resumir, la mejor manera de averiguar cuáles son los parámetros de un filtro es:

  • Busque la documentación de los parámetros en el códice (aunque no todos los filtros están completamente documentados allí).
  • Mire el código fuente de la función original para ver qué parámetros se pasan al filtro.

Editar para responder a tu comentario

  

¿Porque $ info es solo otro nombre para $ output?

Tienes razón. Los nombres de las variables pueden cambiar cuando se pasan a través de un filtro. Esto se debe simplemente a cómo funciona la declaración de una función en PHP:

my_function($output);

function my_function($info) {
    // in the context of this function the content of $output is now inside the variable $info.
}
  

¿También qué sucede exactamente en el filtro llamado 'bloginfo_url'? Lo intenté   para encontrarlo en el núcleo, pero no está allí.

Por defecto, nada sucede con bloginfo_url . WordPress Core no adjunta ninguna función a este filtro. Solo proporciona este filtro para usted, por lo que puede cambiar el comportamiento nativo de WordPress sin necesidad de modificar ninguno de los archivos principales. (Este es solo el caso de este filtro, algunos de los otros filtros son utilizados por WordPress).

Una cosa que siempre debe tener en cuenta al trabajar con esos filtros es que otros (los complementos o el propio WordPress) pueden adjuntar funciones que entran en conflicto con las cosas que desea lograr con su función. Puede controlar cuándo se ejecutará su función con respecto a las otras funciones asociadas al mismo filtro con el parámetro $priority param.

    
respondido por el s1lv3r 02.11.2013 - 12:30

Lea otras preguntas en las etiquetas