以下是一些解决方法:
方法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手册工作。