在WP搜索表单中是否有类似`wp_Dropdown_Categories()`的输入复选框选项?

时间:2021-03-04 作者:The Chewy

我有自定义的帖子类型,当前正在使用wp_dropdown_categories() 在WP搜索表单中的功能,以便人们能够按薪资级别和工作类型进行筛选。

是否有一个等效函数,以便用户可以使用输入复选框元素而不是<select> 元素,以便他们在进行搜索时可以选择多个工作类型或薪资水平?

我似乎在开发者文档中找不到任何东西。

我正在寻找的是允许复选框替换使用下面代码中的select选项的下拉元素的东西。

<form method="get" action="<?php echo esc_url(site_url(\'/\')); ?>">
    <div id="form-wrapper">
        <label id="searchlabel" for="s">Search</label>
        <input id="s" name="s" type="search">
        <input type="hidden" name="post_type" value="jobs" />

            <?php wp_dropdown_categories( array(
                \'taxonomy\'        => \'salary_level\', // taxonomy slug
                \'name\'            => \'salary_level\', // taxonomy slug
                \'class\'           => \'jobsearch-select\',
                \'value_field\'     => \'slug\',
                \'selected\'        => get_query_var( \'salary_level\' ),
                \'hierarchical\'    => true, // place each term under their own parent
                \'show_option_all\' => \'Select Salary Band\',
            ) ); ?>
            
        <input class="td search-jobs-button" type="submit" value="Search Jobs">
    </div>
</form>
提前感谢

艾米丽。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

是的,有一个内置的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(!:)

    相关推荐

    search based on custom field

    我的问题是,有没有办法将wordpress的搜索配置为在自定义帖子类型中搜索自定义字段值。//------------html code--------------------// <input type=\"text\" name=\"keyword\" id=\"keyword\" onkeyup=\"fetch()\"></input> <div id=\"datafetch\"></div> &#x