wp_dropdown_categories с множественным выбором

29 янв. 2016 г., 13:38:54
Просмотры: 14.6K
Голосов: 3

В поисковой форме я хочу, чтобы посетители могли искать дома по нескольким локациям. Сейчас код выглядит так:

    <div class="col-md-3 col-sm-6 col-xs-12">
        <label for="property_location"><?php _ex( 'Локация', 'метка поиска недвижимости', 'ci_theme' ); ?></label>

        <div class="ci-select">
            <?php
                wp_dropdown_categories( array(
                    'taxonomy'          => 'property_location', // Таксономия для локаций
                    'hierarchical'      => true, // Иерархическое отображение
                    'show_option_none'  => esc_html_x( '-', 'любая локация', 'ci_theme' ), // Текст по умолчанию
                    'option_none_value' => '', // Значение по умолчанию
                    'name'              => 's_property_location',
                    'id'                => 'property_location',
                    'selected'          => isset( $_GET['s_property_location'] ) ? $_GET['s_property_location'] : '', // Выбранное значение
                ) );
            ?>
        </div>
    </div>

Как изменить этот код для поддержки множественного выбора?

Большое спасибо за ответ. Карлин

0
Все ответы на вопрос 4
1

wp_dropdown_categories применяет фильтр к выводу, который вызывается непосредственно перед возвратом или выводом результата функцией.

С помощью этого вы можете добавить фильтр в файл functions.php, который изменяет поле select и добавляет к нему атрибут multiple.

Приведенный ниже фильтр будет искать открывающий тег select и добавлять к нему атрибут multiple. Вы также можете добавить атрибут size для управления количеством отображаемых элементов одновременно.

add_filter( 'wp_dropdown_cats', 'dropdown_filter', 10, 2);

function dropdown_filter( $output, $r ) {
    $output = preg_replace( '/<select (.*?) >/', '<select $1 size="5" multiple>', $output);
    return $output;
}
21 янв. 2017 г. 09:25:32
Комментарии

лол, вероятно, далеко от того, что хотел автор вопроса, но точно отвечает на вопрос в том виде, как он сформулирован :)

Mark Kaplun Mark Kaplun
21 янв. 2017 г. 09:44:46
0

Просто добавьте этот код в ваш файл functions.php

add_filter( 'wp_dropdown_cats', 'wp_dropdown_cats_multiple', 10, 2 );

function wp_dropdown_cats_multiple( $output, $r ) {

    if( isset( $r['multiple'] ) && $r['multiple'] ) {

         $output = preg_replace( '/^<select/i', '<select multiple', $output );

        $output = str_replace( "name='{$r['name']}'", "name='{$r['name']}[]'", $output );

        foreach ( array_map( 'trim', explode( ",", $r['selected'] ) ) as $value )
            $output = str_replace( "value=\"{$value}\"", "value=\"{$value}\" selected", $output );

    }

    return $output;
}

И добавьте параметр multiple как показано ниже:

<div class="ci-select">
    <?php
        wp_dropdown_categories( array(
            'taxonomy'          => 'property_location',
            'hierarchical'      => true,
            'show_option_none'  => esc_html_x( '-', 'любое местоположение недвижимости', 'ci_theme' ),
            'option_none_value' => '',
            'name'              => 's_property_location',
            'id'                => 'property_location',
            'selected'          => isset( $_GET['s_property_location'] ) ? $_GET['s_property_location'] : '', // например 86,110,786
            'multiple'          => true
        ) );
    ?>
</div>
23 мар. 2017 г. 14:26:18
0

Это дополнение к ответу @MahdiY. Тот ответ предполагает, что данные мультивыбора будут в виде строки с разделителями-запятыми. Я обнаружил, что в моем случае мультивыбор представляет собой массив, из-за чего функция wp_dropdown_cats_multiple ломается. Я добавил строку и изменил цикл foreach.

function wp_dropdown_cats_multiple( $output, $r ) {

    if( isset( $r['multiple'] ) && $r['multiple'] ) {

        $output = preg_replace( '/^<select/i', '<select multiple data-live-search="true" data-style="btn-info"', $output );

        $output = str_replace( "name='{$r['name']}'", "name='{$r['name']}[]'", $output );

        $selected = is_array($r['selected']) ? $r['selected'] : explode( ",", $r['selected'] );
        foreach ( array_map( 'trim', $selected ) as $value )
            $output = str_replace( "value=\"{$value}\"", "value=\"{$value}\" selected", $output );

    }

    return $output;
}

Не смог добавить это как комментарий из-за недостаточной репутации.

6 сент. 2017 г. 23:10:23
0

Вы можете проверить:

wp_category_checklist Вы можете определить собственный walker и изменить чекбоксы на выпадающий список с множественным выбором.

wp_category_checklist выводит неупорядоченный список элементов чекбоксов <input> с названиями категорий.

29 янв. 2016 г. 15:27:42