J'utilise wp_dropdown_categories()
avec multiple="multiple"
de cette manière , en contournant le noyau WordPress. Jusqu'à maintenant (WP 4.4.1) ne supporte pas multiple
sur ce champ sélectionné. ( Ticket principal )
J'ai du mal avec le paramètre selected
. Comment puis-je transmettre plusieurs valeurs afin que le paramètre selected
puisse comprendre quelles options multiples doivent être sélectionnées?
Je pense que c'est possible uniquement en écrivant sa propre fonction supportant les valeurs de tableau pour la sélection.
Un moyen facile?
Merci @markkaplun. Je l'ai résolu en écrivant le mien:
<?php
/**
* Dropdown for 'my_tax'
* @since 1.0.0 Using wp_dropdown_categories().
* @since 2.0.3 Custom code, as wp_dropdown_categories() doesn't provide
* 'selected' field for multiple="multiple"
*/
$my_tax_terms = get_terms( 'my_tax', array('hide_empty'=>false) );
echo '<select required multiple="multiple" name="my_tax[]" id="my-tax" class="postform">';
foreach ($my_tax_terms as $tax_term) {
$selected = !empty($_POST['my_tax']) && in_array( $tax_term->term_id, $_POST['my_tax'] ) ? ' selected="selected" ' : '';
echo '<option value="'. $tax_term->term_id .'" '. $selected .'>'. $tax_term->name .'</option>';
}
echo '</select>';
Comme l'indiquent les tickets principaux (par exemple https://core.trac.wordpress.org/ticket/16734 ), le but de l'API est de fournir une liste déroulante et non un multisélection. IIRC dans l'édition rapide des publications, aucune API n'est utilisée pour la catégorie et les balises multiselct.
En d'autres termes, ignorez simplement l'API et écrivez la vôtre.
Vous devriez pouvoir faire une chose semblable à celle décrite dans cette réponse et filtrer la sortie de wp_category_dropdown
en utilisant wp_dropdown_cats
, mais pour les options au lieu de sélectionner par exemple.
add_filter('wp_dropdown_cats', 'wp_dropdown_categories_multiselect');
function wp_dropdown_categories_multiselect($output) {
$valuekey = 'valuekey'; // set to 'name' argument passed
// check this is the correct dropdown
if (strstr($output,'name="'.$valuekey.'"')) {
// add multiple to select (you may already have this)
$output = str_replace('<select ','<select multiple ',$output);
// add square brackets to the name key
$output = str_replace('name="'.$valuekey.'"','name="'.$valuekey.'[]"',$output);
$selectedvalues = get_option($valuekey);
// make sure there is a selected value
if (count($selectedvalues) > 0) {
// loop through the selected values
foreach ($selectedvalues as $value) {
// add the selected to each selected value
$output = str_replace(
'<option value="'.$value.'"',
'<option value="'.$value.'" selected="selected"',
$output
);
}
}
}
return $output;
}
Remarque: supposons que vous enregistrez la valeur sous forme de tableau de valeurs sélectionnées dans la table des options. par exemple.
$valuekey = 'valuekey';
if (isset($_REQUEST[$valuekey])) {
$selectedvalues = $_REQUEST[$valuekey];
if (!add_option('valuekey',$selectedvalues)) {
update_option('valuekey',$selectedvalues);
}
}
Bien sûr, avec l'utilisation de str_replace
, la première valeur de chaque occurrence devrait correspondre exactement à la sortie, il pourrait donc y avoir un débogage nécessaire pour que cela fonctionne.