首先,您需要您的代码将排除值存储在某处。
由于您不想使用全局(这样做是正确的),因此剩下的选项很少:
一个类,您已经拥有的类,一个闭包,一个标准API,选项1,一个新的对象/类,这里我们创建一个对象,它包含您要排除的类别,以及一些排除它的逻辑。
class wpse140557_exclude {
$exclude = 0;
public __construct( $exclude ) {
$this->exclude = $exclude;
add_filter( \'posts_where\', array( $this, \'exclude_filter\' ) );
}
public function exclude_filter( ... ) {
// etc... using $this->exclude
}
public function remove_filter() {
remove_filter( \'posts_where\', array( $this, \'exclude_filter\' ) );
}
}
$exclude = new wpse140557_exclude( 12 ); // excluding category 12
// do some stuff/loops
$exclude->remove_filter(); // remove our filter
选项2闭包这里我们使用闭包,这些闭包需要使用PHP 5.3+
$exclude_closure = function (.. args...) use ( $exclude ) {
// exclusion code $exclude
}
add_filter( \'posts_where\', $exclude_closure );
// do stuff
remove_filter(\'posts_where\', $exclude_closure );
选项3,您已经拥有的类将函数移到您的小部件类中,然后使用:
add_filter( "posts_where", array( $this, "excludeTheID" ) );
// do stuff
remove_filter( "posts_where", array( $this, "excludeTheID" ) );
然后使用$this->exclude访问/设置要排除的类别。这是选项1的一个不太通用的版本。
选项4,WP\\U查询
如果您查看了官方文档,您会发现有一个标题为“排除属于类别的帖子”的部分
这显示了两种无需额外功能即可完成所需操作的方法:
$query = new WP_Query( \'cat=-12,-34,-56\' );
以及
$query = new WP_Query( array( \'category__not_in\' => array( 2, 6 ) ) );
标签和其他分类法也有类似的参数
家庭作业我建议你仔细阅读以下内容:
函数和函数对象闭包和匿名函数什么是PHP可调用的,什么不是The WP_Query
official codex page