web-dev-qa-db-ja.com

JavaScriptを使わずにwp_dropdown_categories()にHTML5の 'required'属性を追加するにはどうすればいいですか?

<select>フィールドにカスタムの分類用語を入力するためにwp_dropdown_categories()を使用しています。

コードが以下のようなものであれば:

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

それはうまく働いています。 jQueryを使ってフィールドを必須にすることができます。

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

それも働いています。しかし、JavaScriptを使わずにフィールドを必須にしたいと思います。私は'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;

なぜうまく動かないのかも理解できます。しかし、私はJavaScriptなしでそれを達成することができる方法はありますか?どんなフィルタ?ただ言わないでください。

コアからコピーしてそのオプションであなたの新しいものを作ってください。

そして私の2番目の質問は、none_optionの値が-1なのはなぜですか?なぜ''(null)じゃないの?

1
Mayeenul Islam

wp_categories_dropdownを使用するたびにrequired属性を適用したい場合は、他の回答で示唆されているようにwp_dropdown_catsフィルターを使用してください。

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

特定の状況でのみrequired属性を適用する場合は、echo引数をfalseに設定してwp_dropdown_categoriesを使用し、返される文字列にrequired属性を導入してから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;

あるいは、より良い方法として、カスタムの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;

}

そしてwp_dropdown_categoriesを次のように使います。

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

wp_dropdown_categories( $args );

2番目の質問については、「スレッドごとに1つの質問」という規則があることを知っておく必要があります。今後の質問のためにそれを覚えておいてください。言われるより、-1option_none_value引数のデフォルト値です。この引数は文書化されていません(今では、 codex に追加しました)。次のように上書きすることができます。

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

PD:NULLoption要素内のselectに対して有効な値であるかどうかわかりません。また、''(空の文字列)はNULLと同じではありません。空の文字列は長さゼロの文字列データ型です。 NULLは日付型ではなく、データプロパティもありません。何もありません。

7
cybmeta

更新日:ワードプレス4.6

WordPress 4.6から、 wp_dropdown_categories() に直接 'required'属性を追加することができます。

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

出典:コアトラクトチケット

3
Mayeenul Islam

フィルタがあります - wp_dropdown_cats(私の知る限り、どこにも文書化されていません。)

HTML文字列とwp_dropdown_categoriesに与えられた引数の配列の2つのパラメータを与えます、そしてあなたは新しいHTMLを返す必要があります。

1
William Turrell

wp-includes/category-template.phpの関数を見てみるとわかるように、 'required'を組み込むためのオプションはありません。 $args['required']が機能しないので別の方法 - あなたが知っているように。

フィルタ'wp_dropdown_cats'が見つかります。これは、関数がこの出力を返す直前に出力を提供します。そのため、このフィルタを操作して"<select ""<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 
    );
}

あなたの2番目の質問に関して:

None_optionの値が-1なのはなぜですか?なぜそれが ''(null)ではないのですか?

これは標準値で、この関数は "none"オプションに追加します。この値は$ args ['option_none_value']で変更できます。だから、例えば:

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

参照: https://codex.wordpress.org/Function_Reference/wp_dropdown_categories

特定の選択フィールドだけに「required」属性を追加したい場合は、自分で「required」属性を追加して、フィルタにチェックインすることができます。

    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 
        );
    }

ではごきげんよう。

1
websupporter