挙動としては確かに
'exclude_tree'=>array(9,10)
って編集して渡すと、カテゴリーID 9のカテゴリーツリーと 10のが消えますけど、
'exclude_tree'=>'9,10'
って編集して渡すと、カテゴリーID 9のツリーしか消えないですね。
仮に下記のリファレンスの記事が最新版だとしたら、不具合だということになりますね。配列でもカンマかスペース区切りの文字列でもOK、みたいに書いてあるので。
Home
‘exclude_tree’
(array|string) Array or comma/space-separated string of term IDs to exclude, along with their descendants. See get_terms().
tg29359さん
ご検証いただきありがとうございます。
正確には
4.3では
‘exclude_tree’ => ‘9,10’
4.4では
‘exclude_tree’ => array(
0 => ‘9,10’
);
という形になっています。
ここでの不具合報告だけでは不十分でしょうか。
私は最近ここに来るようになったばかりで、不十分かどうかはいまいちわかりませんが、WordPressの不具合管理は、直接的には、tracというシステムで行われている様で、確実に対応してもらうには、そちらに不具合報告した方がいいかもしれません。
https://core.trac.wordpress.org
また、tracを検索したら、既にこの件の不具合報告(チケットと呼ぶようです)が登録されいるかもしれません。もし登録されていたら、そのチケットに対してwatchという操作をすると、進展があった時にメールで連絡が来たりします。
ここでの報告だけでも、ここを見た他のメンバーの方がチケットを作成してくださることもあります。
私自身は、この件に関してtracは検索しておりませんので、もしお急ぎでしたら、ご自身で検索していただけると、何かわかるかもしれません。
あ、ちょっと待ってください、この挙動、もしかしたら仕様通りかもしれません。以下は4.4でもうまく動くんですよね?。
'exclude_tree' => array(
0 => '9,10'
);
それって、配列の先頭要素が、リファレンスで言ってる「カンマで区切られた文字列」である、ってことだとも言えますよね。で、一方、私が例示した以下も、意図通り動くのは実際に確認しています。
'exclude_tree'=>array(9,10)
で、私が例示したのはカンマ区切り文字列じゃなく単なるidの配列です。つまり、リファレンスに書いてある通り、カンマ区切り文字列でも配列でも両方いけてる、ってことで、ある意味、仕様通りなんじゃないですか?。
ただ、文字列で渡す時は、今までと微妙に渡し方が変わってます、ってだけで。
ご返信いただき感謝いたします。
4.4の場合は以下のようにget_categories()に値が渡されるため、”うまく動いておりません”。
'exclude_tree' => array(
0 => '9,10'
);
おそらくtg29359さんが記述された形となるべきなのでしょうね。
tracは確認させていただきましたが、英語がわからずいくつかのexclude_treeに関するバグ報告が今回のものと同じであるかが区別できません。
ですので、もしこの件を報告してくださる方がいらっしゃればお願いしたいと思います。
あ、失礼しました。以下は動いてないときの例だったのですね。だとすると、リファレンスの言ってる「カンマや空白区切り文字列も可」と合ってなくて不具合っぽい気はしますね。
'exclude_tree' => array(
0 => '9,10'
);
4.4で変更された wp_list_categories() のコードに問題がありますね。
変更内容とテストパターンが下記のリンク先で見られます。
https://core.trac.wordpress.org/changeset/34696
このテストパターンはarray形式の引数だけテストしていますが気づかなかったのでしょう。
# チケットのopen方法はどこを読めばわかるでしょうか。。。
もう少しコードを眺めていくと、exclude_treeを本当に処理するget_terms()の中で、文字列形式をIDの配列へ変換するときに wp_parse_id_list() を使っていました。これを wp_list_categories() のコードでも使えば正しく動きそうです。検証していませんが、、、
wp_list_categories() の中:
if ( $r['exclude_tree'] ) {
// $exclude_tree = array_merge( $exclude_tree, (array) $r['exclude_tree'] );
$exclude_tree = array_merge( $exclude_tree, wp_parse_id_list( $r['exclude_tree'] ) );
}
if ( $r['exclude'] ) {
// $exclude_tree = array_merge( $exclude_tree, (array) $r['exclude'] );
$exclude_tree = array_merge( $exclude_tree, wp_parse_id_list( $r['exclude'] ) );
}
gblsmさんご返信感謝いたします。
ご提示いただいた上記のコードをwp_list_categories()の中で使用してみたところ、
[exclude_tree] => Array
(
[0] => 7
[1] => 8
)
という形で格納されるようになり、きちんと複数のカテゴリが除外されるようになりました。
検証結果のご報告です。
(あっパッチを投げるってそういう意味で一応あってます)
Merged in [36005], [36006] thx!
odmodmさん
そういうわけでバージョン 4.4.1-alpha-36006 に入りましたの。フォーラムへ書き込んでいただいたことが、新しいことに挑戦する良いきっかけになりました。ありがとうございました。
Hinaloeさん、テストコードありがとうございました!