web-dev-qa-db-ja.com

カテゴリドロップダウンにmultiple = "multiple"属性を追加

レギュラーセレクトのドロップダウンがあります。 Multiselectでドロップダウンが必要です。 JavaScriptスクリプトファイルをheader.php内に追加しました。今度は文字列multiple="multiple"を追加する必要があります。

Firebugではmultiple = "multiple"を文字列で

enter image description here

今、私はこのブロックに文字列multiple="multiple"を追加する必要があります、しかし、私はこれがどのようにするかについてわかりません:

<?php 
  $terms = wp_get_post_terms( $post->ID,"listing_category" );
  $terms = isset($terms[0]) ? $terms[0]->term_id : "";

  if(get_field("custom_attributes_input_types","options") == "Dropdowns"):
    wp_dropdown_categories( 
      array( 
        'taxonomy' => 'listing_category', 
        'hiera`enter code here`rchical'=>1, 
        'show_option_none'=>__('Choose Category:','um_lang'), 
        'name' => 'listing_category', 
        'hide_empty' => false, 
        'selected' => $terms
      )
    );
  else:
?>
1
mr.j.sparrow

wp_dropdown_categories() のソースを見てください。出力をレンダリングするのに walk_category_dropdown_tree() を使います。その直後に、最後のMarkUpを変更することができる wp_dropdown_catsという名前のフィルタ があります。

$output = apply_filters( 'wp_dropdown_cats', $output );

これで、正規表現とpreg_replaceを使用することも、DOMDocumentなどを使用して解析することもできます。

select elements Name属性も変更する必要があることに注意してください。そうしないと、配列を保存できません。例:

<select multiple name="foo[]" ...>

それでもwalker引数を変更してWalker自体を書き直す必要があります。その理由は in Walker_CategoryDropdown::start_el と読むことができます。

if ( $category->term_id == $args['selected'] )
    $output .= ' selected="selected"';

ご覧のとおり、現在は配列ではなく単一の値のみがチェックされています。だから基本的にあなたの配列に対するチェックが必要になるでしょう。配列をチェックするオーバーライドメソッドの例:

public function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) {
    $pad = str_repeat('&nbsp;', $depth * 3);

    $cat_name = apply_filters('list_cats', $category->name, $category);
    $output .= "<option class=\"level-{$depth}\" value=\"{$category->term_id}\"";

    # >>> HERE WE GO:
    if ( in_array( $category->term_id, $args['selected'] ) )
        $output .= ' selected="selected"';

    $output .= '>';
    $output .= $pad.$cat_name;
    if ( $args['show_count'] )
        $output .= "({$category->count})";
    $output .= "</option>";
}

上記のメソッドをWalker_CategoryDropdownを拡張する新しいクラスに入れ、その新しいWalkerクラスを引数としてwp_dropdown_categories()のargs配列に入れます。

wp_dropdown_categories( array(
    'walker'   => new Custom_Walker_CategoryDropdown
    'selected' => get_option( 'foo' )
    # etc…
) );

ご覧のとおり、上記のname="foo[]"に由来するオプションfooを追加しました。具体的な実装はあなた次第です。この答えはあなたの解決へのガイドとして役立つでしょう。

2
kaiser