Cum să faci wp_dropdown_categories cu selectare multiplă în WordPress
În caseta de căutare, aș dori ca vizitatorii să poată căuta mai multe locații (case). Codul actual este:
<div class="col-md-3 col-sm-6 col-xs-12">
<label for="property_location"><?php _ex( 'Locație', '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>
Cum pot să modific acest cod pentru a permite selectarea multiplă?
Vă mulțumesc foarte mult pentru răspuns. Carlijn

wp_dropdown_categories
are un filtru aplicat asupra rezultatului care este apelat chiar înainte ca funcția să returneze sau să afișeze rezultatul.
Cu aceasta poți adăuga un filtru în fișierul functions.php care manipulează câmpul select și adaugă un atribut multiple acestuia.
Filtrul de mai jos va căuta eticheta de deschidere select și va adăuga atributul multiple. De asemenea, poți adăuga atributul size pentru a controla numărul de elemente afișate simultan.
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;
}

Doar adaugă acest cod în fișierul tău 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;
}
Și adaugă argumentul multiple ca mai jos:
<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'] : '', // ex. 86,110,786
'multiple' => true
) );
?>
</div>

Acesta este un adaos la răspunsul lui @MahdiY. Acel răspuns presupune că datele pentru selecția multiplă vor fi în format delimitare prin virgulă. Eu am descoperit că selecția mea multiplă este de fapt un array, caz în care funcția wp_dropdown_cats_multiple
nu funcționează. Am adăugat o linie și am modificat bucla 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;
}
Nu am putut adăuga acest lucru ca un comentariu deoarece reputația mea este prea mică.

Puteți verifica:
wp_category_checklist Puteți defini un walker personalizat și a schimba casetele de bifat în meniuri drop-down cu selecție multiplă.
wp_category_checklist
afișează o listă neordonată de elemente <input>
de tip checkbox etichetate cu numele categoriilor.
