因此,代码有一些问题:
您没有使用传递给pre\\u get\\u posts挂钩的查询对象,因此您没有修改实际的查询字段设置为id
而不是term_id
.如果您使用IN
作为运算符,将数组传递给术语
您没有清理$\\u POST[\'networks]的价值。如果没有它,您可能会没事,因为WordPress不应该让任何太糟糕的事情发生,但至少应该确保值的类型是正确的此版本的函数解决了以下问题:
function my_query_by_selected_networks( $query ) {
if ( is_admin() ) {
return;
}
if ( $query->is_main_query() && $query->is_post_type_archive( \'profiles\' ) ) {
if ( isset( $_POST[\'networks\'] ) ) {
if ( is_array( $_POST[\'networks\'] ) ) {
$networks = array_map( \'intval\', $_POST[\'networks\'])
} else {
$networks = array( intval( $_POST[\'networks\'] ) );
}
$tax_query = $query->get( \'tax_query\' ) ?: array();
$tax_query[] = array(
\'taxonomy\' => \'networks\',
\'field\' => \'term_id\',
\'terms\' => $networks,
\'operator\' => \'IN\',
);
$query->set( \'tax_query\', $tax_query );
}
}
}
add_action( \'pre_get_posts\', \'my_query_by_selected_networks\' );
注:
函数接受$query
变量,并使用该变量更新查询它使用term_id
作为的值field
.
$networks
, 传递给税务查询的值保留为数组,如果$_POST[\'networks\']
不是数组它净化了$_POST[\'networks\']
具有intval
, 确保$networks
是一个整数数组,这是税务查询所期望的此外,我修改了tax\\u查询代码,以便它不会完全取代其他插件可能进行的任何tax查询。它通过检查是否已经有税务查询来实现这一点,如果已经有,则添加到税务查询中。这可能没有必要,但这是我的习惯。
EDIT: 根据汤姆的建议,我加入了$query->is_main_query()
, 为了确保我们只修改主循环,所以这不会影响小部件和菜单等。如果我们在管理中,我还在顶部添加了一点,因为我们不想修改后端查询。
而且custom_archive
是一个非常通用的函数名,可以很容易地被其他插件或WordPress本身共享。最好更具描述性,但最重要的是,您应该在函数前面加上主题或插件特有的前缀,以避免冲突。在我的例子中my_
. 我建议更换,因为my_
是常见的示例前缀。