Aquí hay algunas soluciones:
Enfoque n. ° 1
Puede ajustar la definición del shortcode y la posts_where
devolución de llamada del filtro en una clase para poder pasar un valor dado entre los métodos de la clase, por ejemplo, como una variable privada .
Enfoque n. ° 2
Otro enfoque sería pasar el valor como entrada WP_Query
dentro de la devolución de llamada de su shortcode:
$query = new WP_Query ( [ 'wpse_value' => 5, ... ] );
y luego dentro del filtro posts_where puedes acceder a él:
add_filter( 'posts_where', function( $where, \WP_Query $query )
{
if( $value = $query->get( 'wpse_value' ) )
{
// can use $value here
}
return $where;
}, 10, 2 );
Enfoque n. ° 3
... o también puede ajustar el ejemplo de @the_dramatist para poder eliminar la devolución de llamada luego asignando la función anónima a una variable:
function my_shortcode_function( $atts, $content )
{
// shortcode_atts stuff here
$value = 5; // just an example
// Add a filter's callback
add_filter( 'posts_where', $callback = function( $where ) use ( $value ) {
// $value accessible here
return $where;
} );
// WP_Query stuff here and setup $out
// Remove the filter's callback
remove_filter( 'posts_where', $callback );
return $out;
}
add_shortcode( 'my-shortcode', 'my_shortcode_function' );
Compruebe, por ejemplo, los documentos PHP sobre cómo asignar una función anónima, con la palabra clave use, a una variable.
ps: creo que aprendí por primera vez sobre este truco de asignación de variables de @gmazzap, para que sea más fácil eliminar la devolución de llamada de un filtro anónimo.
¡Espero eso ayude!
$GLOBALS['value'] = some value
y luego lo llamo$GLOBALS['value']
, funciona, pero si configuro el valor directamente como$value = some value
y luego lo llamo usando$GLOBALS['value']
, no funciona, aunque debería funcionar de acuerdo con el manual de PHP.