Oto kilka obejść:
Podejście nr 1
Można zawinąć definicję skrótu i posts_where
wywołanie zwrotne filtra w klasę, aby móc przekazywać określoną wartość między metodami klasowymi, np. Jako zmienną prywatną .
Podejście nr 2
Innym podejściem byłoby przekazanie wartości jako danych wejściowych do WP_Query
wywołania zwrotnego kodu krótkiego:
$query = new WP_Query ( [ 'wpse_value' => 5, ... ] );
a następnie w filtrze post_where możesz uzyskać do niego dostęp:
add_filter( 'posts_where', function( $where, \WP_Query $query )
{
if( $value = $query->get( 'wpse_value' ) )
{
// can use $value here
}
return $where;
}, 10, 2 );
Podejście nr 3
... lub możesz także dostosować przykład przez @tam_dramatist, aby móc później usunąć wywołanie zwrotne, przypisując funkcję anonimową do zmiennej:
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' );
Sprawdź np. Dokumentację PHP, w jaki sposób przypisać anonimową funkcję za pomocą słowa kluczowego use do zmiennej.
ps: Myślę, że po raz pierwszy dowiedziałem się o tej sztuczce przypisywania zmiennych przez @gmazzap, aby ułatwić usunięcie wywołania zwrotnego anonimowego filtra.
Mam nadzieję, że to pomoże!
$GLOBALS['value'] = some value
a następnie wywołam,$GLOBALS['value']
to zadziała, ale jeśli ustawię wartość bezpośrednio jako,$value = some value
a następnie wywołanie przy użyciu$GLOBALS['value']
nie zadziała, podczas gdy powinno działać zgodnie z instrukcją PHP.