サポート » テーマ » タクソノミーを一覧にする時に自由に並び替えをしたい

  • 解決済 Kazu

    (@sorai)


    はじめてフォーラムに質問をさせて頂きます。よろしくお願い致します。

    タクソノミーを取り出す時に自由な順番に並び替えたいと思っているのですが、やり方がわかりません。管理画面等から並び替えができませんので、現状はテーマファイルにタクソノミーを直接記述して、それに紐づくポストを一覧にしています。

    以下の記事は私が書いたものですが、これではタクソノミーの並び順が制御できず、例えば Q&A を作った場合、最悪の場合「その他」といった本来下に来るべきタクソノミーが上位に表示されてしまいます。
    WordPress のカスタムタクソノミーの分類毎に記事を出力する方法 | ウェブル

    タクソノミーには説明を入れる欄などもありますが、この欄を増やしたり、または説明に数値を入れて並び順を制御する方法でも構いません。何か良い方法がありましたらご教授頂くことは可能でしょうか。

    お手数をおかけしますが、ご回答頂けると幸いです。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • モデレーター jim912

    (@jim912)

    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さんとかぶってしまった・・・

    > 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 に設定する機能がないためそれを可能にするためのコードだと解釈しておりますが、もし違った場合はご指摘頂けると幸いです。

    > LVP8 さん

    ご返信頂きありがとうございます。私が質問させて頂いた「タクソノミーを取り出す時に自由な順番に並び替えたい」というのは、例えば以下のようにタクソノミーが3つあった場合に。

    • タクソノミーA
    • タクソノミーB
    • タクソノミーC

    以下のように名前順でソートして出力することはとても容易なことだとは思いますが。

    • タクソノミーA
    • タクソノミーB
    • タクソノミーC

    以下のように自由な並び順で出力するには基本の機能だけでは実現できないと考えています。

    • タクソノミーB
    • タクソノミーA
    • タクソノミーC

    以上になります。私の質問させて頂いた「自由な順番」というのはつまりこういうことを表しています。とても分かりにくい質問内容で大変申し訳御座いません。

    モデレーター jim912

    (@jim912)

    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が渡されずエラーになっていたのですね。
    前回のコードでも、テーブル名指定の正規化部分をすりぬけて動いていたと思われますが、あまりよい方法ではないので、修正いただけると助かります。

    解釈については、おっしゃる通りです。

    jim912 さん、とても分かりやすい解説とコードをありがとうございます。
    新しく修正して頂いたコードを使ったところ期待通りの結果を得ることができました。現在説明分には 001 や 003 というように桁を揃えて数値を入れています。

    私はフックがとても苦手なのですが、jim912 さんの説明によって少しフックについての理解が深まりました。特に add_filter の第四引数についてはまったく知らなかったので感謝します。

    どうもありがとうございました!

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「タクソノミーを一覧にする時に自由に並び替えをしたい」には新たに返信することはできません。