Вот несколько обходных путей:
Подход № 1
Вы можете обернуть определение шорткода и posts_where
обратный вызов фильтра в класс, чтобы иметь возможность передавать определенное значение между методами класса, например, как частную переменную.
Подход № 2
Другой подход заключается в передаче значения в качестве входного сигнала WP_Query
в обратный вызов вашего шорткода:
$query = new WP_Query ( [ 'wpse_value' => 5, ... ] );
и затем в вашем фильтре posts_where вы можете получить к нему доступ:
add_filter( 'posts_where', function( $where, \WP_Query $query )
{
if( $value = $query->get( 'wpse_value' ) )
{
// can use $value here
}
return $where;
}, 10, 2 );
Подход № 3
... или вы также можете настроить пример с помощью @the_dramatist, чтобы впоследствии иметь возможность удалить обратный вызов, назначив анонимную функцию переменной:
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' );
Посмотрите, например, документы PHP о том, как назначить анонимную функцию с ключевым словом use переменной.
ps: я думаю, что впервые узнал об этой уловке назначения переменных @gmazzap, чтобы упростить удаление обратного вызова анонимного фильтра.
Надеюсь, поможет!
$GLOBALS['value'] = some value
а затем вызываю,$GLOBALS['value']
оно работает, но если я устанавливаю значение напрямую как,$value = some value
а затем вызываю его с помощью,$GLOBALS['value']
оно не работает, в то время как оно должно работать в соответствии с руководством по PHP.