Ось кілька вирішень:
Підхід №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.