いくつかの回避策は次のとおりです。
アプローチ#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' );
たとえば、useキーワードを使用して無名関数を変数に割り当てる方法については、PHPのドキュメントを確認してください。
PS:匿名フィルターのコールバックを簡単に削除できるように、@ gmazzapによってこの変数割り当てのトリックについて最初に学んだと思います。
それが役に立てば幸い!
$GLOBALS['value'] = some value
して値を設定し、それを呼び出す$GLOBALS['value']
と機能しますが、直接値を設定し、$value = some value
それを使用し$GLOBALS['value']
てそれを呼び出すと機能しませんが、PHPマニュアルに従って機能するはずです。