如何在wp_Dropdown_Categories()上为“”MULTICE“”选项提供“”SELECTED“”的值

时间:2016-01-14 作者:Mayeenul Islam

我正在使用wp_dropdown_categories() 具有multiple="multiple" in this way, 绕过WordPress核心。到目前为止(WP 4.4.1)不支持multiple 在该选择字段上(Core Ticket)

我正在和selected 参数如何传递多个值,以便selected 参数可以理解要选择的多个选项?

我认为只有编写自己的函数来支持数组值以供选择,这才有可能。

有什么简单的方法吗?

3 个回复
最合适的回答,由SO网友:Mayeenul Islam 整理而成

谢谢@MarkKaplen。我用自己的方式解决了这个问题:

<?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>\';

SO网友:Mark Kaplun

作为核心票据(例如https://core.trac.wordpress.org/ticket/16734) 假设api的目的是提供下拉列表,而不是多选。IIRC在帖子的快速编辑中,没有API用于类别和标签MultiHelp。

换句话说,只需忽略API,编写自己的API即可。

SO网友:majick

您应该能够执行该答案中描述的类似操作,并从wp_category_dropdown 使用wp_dropdown_cats, 但对于选项,而不是选择eg。

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 每次出现的第一个值必须与输出完全匹配,因此可能需要进行一些调试才能使其工作。