soraiさん、こんにちは。
とりあえず一番コードの記述料が少なくて済む説明欄を利用する方法ですが、
1.下記をテーマのfunctions.phpに追加
function taxonomy_orderby_description( $orderby, $args ) {
$args = wp_parse_args( $args );
if ( $args['orderby'] == 'description' ) {
$orderby = 'tt.description';
}
return $orderby;
}
add_filter( 'get_terms_orderby', 'taxonomy_orderby_description' );
2.タクソノミーを取り出す場合の指定例
get_terms( 'news_type', 'orderby=description&order=ASC' );
こんな感じでいけるかと思います。
注意点としては、descriptionの指定だと文字列での比較となるため、2よりも10が昇順指定で上位にくることになります。この場合は、02などと入力してASCIIコード順と数字の順列が同一となるよう工夫してください。
また、descriptionはデータベースのインデックスが存在していない文字列での比較となるため、パフォーマンス的にはあまり理想的ではありません。(タクソノミーが大量に存在するとは思えないので、それほど深刻にはならないと思いますが)
get_terms() は order と orderby の設定ができるので、soraiさんの記事内にあるパラメータで出力順を調整できます。
$terms = get_terms($taxonomy_name, array( 'orderby' => $terms->count, 'order=DESC'));
それ以外の何かで並べ替えしたい、ということでしょうか?
うわっ、jim912さんとかぶってしまった・・・
トピック投稿者
Kazu
(@sorai)
> jim912 さん
そのまま貼りつけたところダッシュボードにて $arg に値を設定しろとエラーが発生しましたので以下のようにデフォルト値を設定させて頂き解決しました。
function taxonomy_orderby_description( $orderby, $args = '' ) {
$args = wp_parse_args( $args );
if ( $args['orderby'] == 'description' ) {
$orderby = 'tt.description';
}
return $orderby;
}
add_filter( 'get_terms_orderby', 'taxonomy_orderby_description' );
ここでひとつ質問があるのですが、私がよく分かりもせずにデフォルト値を設定した $args は本来何を入れるべきだったのでしょうか。こうしなければダッシュボードでエラーが出てしまうということは本来何かを自分で入力するべきだったと思っているのですが、それが分かりません。よろしければお教え頂くことは可能でしょうか。
また、ご提示頂いたコードはは私が推測するに description を orderby に設定する機能がないためそれを可能にするためのコードだと解釈しておりますが、もし違った場合はご指摘頂けると幸いです。
トピック投稿者
Kazu
(@sorai)
> LVP8 さん
ご返信頂きありがとうございます。私が質問させて頂いた「タクソノミーを取り出す時に自由な順番に並び替えたい」というのは、例えば以下のようにタクソノミーが3つあった場合に。
以下のように名前順でソートして出力することはとても容易なことだとは思いますが。
以下のように自由な並び順で出力するには基本の機能だけでは実現できないと考えています。
以上になります。私の質問させて頂いた「自由な順番」というのはつまりこういうことを表しています。とても分かりにくい質問内容で大変申し訳御座いません。
soraiさん、すみません。私のコードがちょっと間違ってました。。
function taxonomy_orderby_description( $orderby, $args ) {
if ( $args['orderby'] == 'description' ) {
$orderby = 'tt.description';
}
return $orderby;
}
add_filter( 'get_terms_orderby', 'taxonomy_orderby_description', 10, 2 );
修正点は2カ所。$argsは、配列で渡されてくるので、
$args = wp_parse_args( $args );
を削除しています。
また、$argsに値が渡されてくるように、add_filterの引数を追加してあります。
add_filter( 'get_terms_orderby', 'taxonomy_orderby_description', 10, 2 );
get_terms_orderbyというフックは、wp-includes/taxonomy.phpの1193行目にあり(ver3.1)
$orderby = apply_filters( 'get_terms_orderby', $orderby, $args );
となっています。この$argsをフックする関数のtaxonomy_orderby_descriptionで受け取るようにするには、add_filter, add_actionの第4引数を指定する必要があり(デフォルトは1)、この引数指定が無かったために、$argsが渡されずエラーになっていたのですね。
前回のコードでも、テーブル名指定の正規化部分をすりぬけて動いていたと思われますが、あまりよい方法ではないので、修正いただけると助かります。
解釈については、おっしゃる通りです。
トピック投稿者
Kazu
(@sorai)
jim912 さん、とても分かりやすい解説とコードをありがとうございます。
新しく修正して頂いたコードを使ったところ期待通りの結果を得ることができました。現在説明分には 001 や 003 というように桁を揃えて数値を入れています。
私はフックがとても苦手なのですが、jim912 さんの説明によって少しフックについての理解が深まりました。特に add_filter の第四引数についてはまったく知らなかったので感謝します。
どうもありがとうございました!