web-dev-qa-db-ja.com

'multiple'オプションに対してwp_dropdown_categories()で 'selected'に値を提供する方法

私はWordPressのコアを迂回してwp_dropdown_categories()multiple="multiple"と共にこのように を使っています。今まで(WP 4.4.1)は、その選択フィールドでmultipleをサポートしていません。 コアチケット

私はselectedパラメータに苦労しています。 selectedパラメータがどの複数のオプションが選択されるべきかを理解することができるようにどうすれば複数の値を渡すことができますか?

選択のために配列の値をサポートする独自の関数を書くことによってのみ可能だと思います。

簡単な方法は?

1
Mayeenul Islam

ありがとう@markkaplun。私はそれを自分で書いて解決した:

<?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

コアチケット(例えば https://core.trac.wordpress.org/ticket/16734 )が言うように、apiのポイントはドロップダウンを提供することであり、複数選択を提供することではありません。 IIRCの投稿のクイック編集では、APIはカテゴリとタグに使用されていません。

言い換えれば、単にAPIを無視して、あなた自身のものを書いてください。

1
Mark Kaplun

その答えで説明したのと同じようなことができ、wp_category_dropdownを使用してwp_dropdown_catsからの出力をフィルタリングできますが、selectの代わりにoptionsを使用するなどです。

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

注:値を選択した値の配列としてオプション表に保存していると想定します。例えば。

$valuekey = 'valuekey';
if (isset($_REQUEST[$valuekey])) {
    $selectedvalues = $_REQUEST[$valuekey];
    if (!add_option('valuekey',$selectedvalues)) {
        update_option('valuekey',$selectedvalues);
    }
}

もちろんstr_replaceを使用する場合、各出現の最初の値は出力と完全に一致する必要があるので、これを機能させるにはデバッグが必要になるかもしれません。

1
majick