以下是一些解决方法:
Approach #1
您可以包装短代码的定义和
posts_where
筛选器在中的回调
class 能够在类方法之间传递给定值,例如作为私有变量。
Approach #2
另一种方法是将值作为输入传递给
WP_Query
在短代码的回调中:
$query = new WP_Query ( [ \'wpse_value\' => 5, ... ] );
然后在您的posts\\u中,您可以访问过滤器:
add_filter( \'posts_where\', function( $where, \\WP_Query $query )
{
if( $value = $query->get( \'wpse_value\' ) )
{
// can use $value here
}
return $where;
}, 10, 2 );
Approach #3
...或者您也可以调整
example 通过@the_剧作家,可以通过将匿名函数分配给变量来移除回调:
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 docs 介绍如何使用use关键字将匿名函数分配给变量。
ps:我想我第一次了解这个变量分配技巧是通过@gmazzap,它可以更容易地删除匿名过滤器的回调。
希望有帮助!