web-dev-qa-db-fra.com

Comment ajouter l'attribut "obligatoire" HTML5 à wp_dropdown_categories () sans JavaScripts?

J'utilise wp_dropdown_categories() pour renseigner le champ <select> avec des termes de taxonomie personnalisés.

Si le code est comme ci-dessous:

<?php
$args = array(
    'show_option_none'   => __( 'Select one', 'text-domain' ),
    'taxonomy'           => 'my_tax',
    'id'                 => 'tax-type',
    'echo'               => 1,
);
wp_dropdown_categories( $args );

Cela fonctionne très bien. Je peux rendre le champ obligatoire avec jQuery:

$('#tax-type option:first').val(null);
$('#tax-type').attr('required', true);

Ça marche aussi. Mais, je veux rendre le champ obligatoire sans JavaScripts. J'ai essayé d'ajouter ce qui suit en faisant le 'echo' à 0:

$new = array();
$new['required'] = true;
$mrg = array_merge($args, $new);
var_dump($mrg); //outputs 'required'=>1
$dd = wp_dropdown_categories( $mrg );
echo $dd;

Je peux aussi comprendre pourquoi ça ne marche pas. Mais y a-t-il moyen de réaliser cela sans JavaScripts? Un filtre? S'il vous plaît ne dites pas simplement:

copier du noyau et faire votre nouveau avec cette option.

Et ma deuxième question est la suivante: pourquoi la valeur de none_option est -1? Pourquoi pas c'est un '' (null)?

1
Mayeenul Islam

Si vous souhaitez appliquer l'attribut required chaque fois que vous utilisez wp_categories_dropdown, utilisez le filtre wp_dropdown_cats comme suggéré dans les autres réponses:

add_filter( 'wp_dropdown_cats', 'wp_dropdown_categories_required' );
function wp_dropdown_categories_required( $output ){
    return preg_replace( 
        '^' . preg_quote( '<select ' ) . '^', 
        '<select required ', 
        $output 
    );
}

Si vous souhaitez appliquer l'attribut required uniquement dans des situations spécifiques, vous pouvez utiliser wp_dropdown_categories avec un argument echo défini sur false, introduisez l'attribut required dans la chaîne renvoyée, puis echo:

$args = array(
    'show_option_none'   => __( 'Select one', 'text-domain' ),
    'taxonomy'           => 'my_tax',
    'id'                 => 'tax-type',
    'echo'               => false,
);

$cat_dropdown = wp_dropdown_categories( $args );

$cat_dropdown = preg_replace( 
        '^' . preg_quote( '<select ' ) . '^', 
        '<select required ', 
        $cat_dropdown
    );

echo $cat_dropdown;

Ou mieux, appliquez le filtre associé à un attribut personnalisé required:

add_filter( 'wp_dropdown_cats', 'wp_dropdown_categories_required', 10, 2 );
function wp_dropdown_categories_required( $output, $args ){

    if( isset( $args['required'] ) && $args['required'] ) {

       $output = preg_replace( 
            '^' . preg_quote( '<select ' ) . '^', 
            '<select required ', 
            $output 
       );

    }

    return $output;

}

Et utilisez ensuite wp_dropdown_categories comme ceci:

$args = array(
    'show_option_none'   => __( 'Select one', 'text-domain' ),
    'taxonomy'           => 'my_tax',
    'id'                 => 'tax-type',
    'required'           => true,
);

wp_dropdown_categories( $args );

À propos de la deuxième question, vous devez savoir qu’il existe une règle "une question par fil". Rappelez-vous cela pour les questions futures. -1 est la valeur par défaut pour l'argument option_none_value. Cet argument n'a pas été documenté (maintenant, je l'ai ajouté à codex ). Vous pouvez le remplacer comme suit:

$args = array(
    'show_option_none'   => __( 'Select one', 'text-domain' ),
    'option_none_value'  => NULL,
    'taxonomy'           => 'my_tax',
    'id'                 => 'tax-type',
    'echo'               => false
);

PD: Je ne sais pas si NULL est une valeur valide pour un option dans un élément select. De plus, notez que '' (chaîne vide) n'est pas identique à NULL. Une chaîne vide est un type de données de chaîne de longueur nulle; NULL n'est pas un type de date et n'a pas de propriétés de données, ce n'est rien.

7
cybmeta

Mise à jour: WordPress 4.6

À partir de WordPress 4.6, nous pouvons ajouter un attribut "requis" directement à wp_dropdown_categories() .

<?php
$args = array(
    'show_option_none'   => __( 'Select one', 'text-domain' ),
    'taxonomy'           => 'my_tax',
    'id'                 => 'tax-type',
    'echo'               => 1,
    'required'           => true
);
wp_dropdown_categories( $args );

Source:Billet d’essai

3
Mayeenul Islam

Il y a un filtre - wp_dropdown_cats (non documenté pour autant que je sache.)

Il vous donne deux paramètres, la chaîne HTML et un tableau des arguments fournis à wp_dropdown_categories, et vous devez renvoyer le nouveau code HTML.

1
William Turrell

Si vous regardez la fonction dans wp-includes/category-template.php, vous verrez qu'il n'y a pas d'option pour la construction 'obligatoire'. Nous devons donc choisir un autre moyen, $args['required'] ne fonctionne pas - comme vous le savez.

Nous trouvons le filtre 'wp_dropdown_cats', qui nous fournit la sortie juste avant que la fonction ne renvoie cette sortie. Nous pourrions donc utiliser ce filtre et modifier "<select " en "<select required ":

add_filter( 'wp_dropdown_cats', 'wp_dropdown_categories_required' );
function wp_dropdown_categories_required( $output ){
    return preg_replace( 
        '^' . preg_quote( '<select ' ) . '^', 
        '<select required ', 
        $output 
    );
}

Concernant votre deuxième question:

Pourquoi la valeur de none_option est -1? Pourquoi pas c'est un '' (null)?

C'est la valeur standard que la fonction ajoute à l'option "none". Vous pouvez modifier cette valeur avec $ args ['option_none_value']. Donc par exemple:

$args = array(
    'show_option_none'   => 'test',
    'option_none_value'  => 'x'
);
wp_dropdown_categories( $args );

Référence: https://codex.wordpress.org/Function_Reference/wp_dropdown_categories

Si vous souhaitez ajouter l'attribut "requis" uniquement à un champ de sélection spécifique, vous pouvez ajouter vous-même un attribut "requis", que vous activez dans le filtre:

    function show_pages(){
    $args = array(
        'show_option_none'   => 'test',
        'option_none_value'  => 'x',
        'required'           => true
    );
    wp_dropdown_categories( $args );
    }

    add_filter( 'wp_dropdown_cats', 'wp_dropdown_categories_required', 10, 2 );
    function wp_dropdown_categories_required( $output, $args ){
        if( ! isset( $args['required'] ) || $args['required'] != true )
            return $output;

        return preg_replace( 
            '^' . preg_quote( '<select ' ) . '^', 
            '<select required ', 
            $output 
        );
    }

Bonne chance.

1
websupporter