我写了一个插件Premium Posts 注册一个名为sms_premium_posts 并在WordPress管理区域的帖子列表表中添加一列。
在该自定义列中,如果已标记帖子Premium, 术语Premium 链接到仅高级帖子的筛选列表。此链接是使用查询字符串生成的:
http://www.example.com/wp-admin/edit.php?sms_premium_posts=premium
如果帖子未标记为
Premium, 我想要这个学期
Standard 筛选列表,使表仅显示未标记为高级的帖子(即没有分类术语的帖子)。
是否有查询字符串?
Example query string:
http://www.example.com/wp-admin/edit.php?sms_premium_posts!=premium
你可能会问,“为什么不加上这个词?”Standard 所有其他帖子?“我不这样做的原因是,当插件被激活时,需要用自定义分类术语标记所有现有的帖子……这似乎效率很低。
提前感谢!
SOLUTION
根据下面@s\\u ha\\u dum的回答,我是如何伪造一个否定查询字符串的:
function standard_term_filter( $query ) {
if ( ! $query->is_admin || ! isset( $_GET[\'sms_premium_posts!\'] ) )
return $query;
if ( \'premium\' == $_GET[\'sms_premium_posts!\'] ) {
$taxquery = array(
array(
\'taxonomy\' => \'sms_premium_posts\',
\'field\' => \'slug\',
\'terms\' => \'premium\',
\'operator\' => \'NOT IN\'
)
);
$query->set( \'tax_query\', $taxquery );
}
return $query;
}
add_action( \'pre_get_posts\', array( $this, \'standard_term_filter\' ) );
请注意,我将此函数添加为插件类的一个方法,这就是为什么我在add\\u action()中为回调使用了一个数组。
还要注意!在我的查询字符串术语末尾:sms_premium_posts!
我做了我的Standard 术语链接如下所示:
http://www.example.com/wp-admin/edit.php?sms_premium_posts!=premium
自从sms_premium_posts! 不同于sms_premium_posts (我的自定义分类法的鼻涕虫),它是有效的。
最合适的回答,由SO网友:s_ha_dum 整理而成
使用tax_query
使用NOT IN
操作人员
$args = array(
\'post_type\' => \'post\',
\'tax_query\' => array(
array(
\'taxonomy\' => \'sms_premium_posts\',
\'field\' => \'slug\',
\'terms\' => \'Premium\',
\'operator\' => \'NOT IN\'
)
)
);
$query = new WP_Query( $args );
现在,通过
$_GET
把你的问题串起来,你可以这样做:
function alter_edit_php_query_wpse_100794($qry) {
if(isset($_GET[\'notin\'])) {
$qry->set(
\'tax_query\',
array(
array(
\'taxonomy\' => \'category\',
\'field\' => \'slug\',
\'terms\' => sanitize_title_with_dashes($_GET[\'notin\']),
\'operator\' => \'NOT IN\'
)
)
);
}
}
add_action(\'pre_get_posts\',\'alter_edit_php_query_wpse_100794\');
这很粗糙。您可能需要更多条件,例如
is_admin
, 防止其在全球范围内发挥作用。
参考文献
http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters