web-dev-qa-db-ja.com

複数選択のあるwp_dropdown_categories

検索ボックスで、訪問者が複数の場所(家)を検索できるようにしたい現在のコードは次のとおりです。

    <div class="col-md-3 col-sm-6 col-xs-12">
        <label for="property_location"><?php _ex( 'Locatie', 'property search label', 'ci_theme' ); ?></label>

        <div class="ci-select">
            <?php
                wp_dropdown_categories( array(
                    'taxonomy'          => 'property_location',
                    'hierarchical'      => true,
                    'show_option_none'  => esc_html_x( '-', 'any property location', 'ci_theme' ),
                    'option_none_value' => '',
                    'name'              => 's_property_location',
                    'id'                => 'property_location',
                    'selected'          => isset( $_GET['s_property_location'] ) ? $_GET['s_property_location'] : '',
                ) );
            ?>
        </div>
    </div>

これを複数選択に変更する方法

ご回答ありがとうございます。カリイン

2
CarlijnDN

wp_dropdown_categories には、関数が出力を返すかエコーする直前に呼び出される出力に適用されるフィルタがあります。

これであなたはあなたのfuntions.phpファイルにselectフィールドを操作してそれに複数の属性を追加するフィルタを追加することができます。

以下のフィルタは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;
}
3
Tunji

このコードを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;
}

以下のように複数の引数を追加します。

<div class="ci-select">
    <?php
        wp_dropdown_categories( array(
            'taxonomy'          => 'property_location',
            'hierarchical'      => true,
            'show_option_none'  => esc_html_x( '-', 'any property location', 'ci_theme' ),
            'option_none_value' => '',
            'name'              => 's_property_location',
            'id'                => 'property_location',
            'selected'          => isset( $_GET['s_property_location'] ) ? $_GET['s_property_location'] : '', // e.x 86,110,786
            'multiple'          => true
        ) );
    ?>
</div>
1
MahdiY

これは@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;
}

私の評判が低すぎるのでこれをコメントとして追加できませんでした。

1
jer0dh

確認してもいい:

wp_category_checklist カスタムウォーカーを定義し、チェックボックスを複数選択のドロップダウンに変更できます。

wp_category_checklistは、カテゴリ名のラベルが付いたチェックボックス<input>要素の番号なしリストを出力します。