web-dev-qa-db-fra.com

Comment donner de la valeur à 'selected' sur wp_dropdown_categories () pour les options 'multiples'

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?

1
Mayeenul Islam

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>';
0
Mayeenul Islam

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.

1
Mark Kaplun

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.

1
majick