是的,有一个内置的WordPress函数,您可以使用它来呈现复选框列表(或者简单地说是清单),然后允许用户选择多个术语,该函数是wp_terms_checklist()
.
但是,该功能仅适用于有能力/权限为帖子分配条款的用户,因此您需要创建自己的功能供公众(即前端或非管理端)使用。
您可以尝试下面的自定义函数,该函数使用Walker_Category_Checklist
类,该类与wp_terms_checklist()
建立术语清单。但一定要注意这些条件:
您需要自己设置检查表的样式,例如删除每个复选框旁边的项目符号。(因为复选框位于li
元素。)
复选框name
形式为tax_input[<taxonomy>][]
, e、 g。<input type="checkbox" name="tax_input[salary_level][]"
. 所以你不能简单地使用get_query_var()
获取所选术语(每个术语都是术语ID)。
你需要pre_get_posts
确保所选术语包含在搜索查询中(即其SQL语句)。
主题中的代码functions.php
文件中,添加我上面提到的自定义函数:
/*
* Based on wp_terms_checklist(), but this is simpler and without the very first parameter
* (i.e. $post_id).
*
* @param array $args An array of arguments. See the second parameter for wp_terms_checklist()
* for the list of arguments, but \'descendants_and_self\' and \'walker\' are
* not included in this function.
*
* @return string|false $output HTML list of checkbox elements. false on get_terms() error.
*/
function wpse_384435_checklist( array $args ) {
require_once ABSPATH . \'wp-admin/includes/class-walker-category-checklist.php\';
$terms = get_terms( array(
\'taxonomy\' => isset( $args[\'taxonomy\'] ) ? $args[\'taxonomy\'] : \'category\',
\'get\' => \'all\',
) );
if ( is_wp_error( $terms ) || empty( $terms ) ) {
return false;
}
$walker = new Walker_Category_Checklist;
$output = $walker->walk( $terms, 0, $args );
if ( ! isset( $args[\'echo\'] ) || $args[\'echo\'] ) { // this means echo is default
echo $output;
}
return $output;
}
在函数文件中,添加此项,以完成上述第3点:add_action( \'pre_get_posts\', \'my_search_pre_get_posts\' );
function my_search_pre_get_posts( $query ) {
// We\'re altering the MAIN query args only on search result pages.
if ( is_admin() || ! is_search() || ! $query->is_main_query() ) {
return;
}
// For other taxonomies, just add the slug to the $taxonomies array below.
$taxonomies = array( \'salary_level\', \'jobs_categories\' );
$tax_input = isset( $_GET[\'tax_input\'] ) ? (array) $_GET[\'tax_input\'] : array();
$tax_query = (array) $query->get( \'tax_query\' );
$set_tax_query = false;
foreach ( $taxonomies as $taxonomy ) {
$selected_cats = ( ! empty( $tax_input[ $taxonomy ] ) ) ?
wp_parse_id_list( $tax_input[ $taxonomy ] ) : array();
if ( ! empty( $selected_cats ) ) {
$tax_query[] = array(
\'taxonomy\' => $taxonomy,
\'terms\' => $selected_cats,
);
$set_tax_query = true;
}
}
if ( $set_tax_query ) {
$query->set( \'tax_query\', $tax_query );
}
}
然后在form
, 更换wp_dropdown_categories()
部分:(对于其他分类法,您可以复制粘贴编辑下面的相同代码)$taxonomy = \'salary_level\';
$tax_input = isset( $_GET[\'tax_input\'] ) ? (array) $_GET[\'tax_input\'] : array();
$selected_cats = ( ! empty( $tax_input[ $taxonomy ] ) ) ?
wp_parse_id_list( $tax_input[ $taxonomy ] ) : array();
echo \'<div><label>Filter by Salary Bands:</label>\';
wpse_384435_checklist( array(
\'taxonomy\' => $taxonomy,
\'selected_cats\' => $selected_cats,
\'checked_ontop\' => false,
) );
echo \'</div>\';
PS:确保使用正确的分类slug(!:)