サポート » 使い方全般 » get_terms関数で件数をキーに入れたらSQL文がおかしい

  • 解決済 qzx02361

    (@qzx02361)


    たくさんの記事とTaxonomyがpost_tagがあるとします。
    ここで、post_tagの上位ランキングを表示するコーディングを作ったら、SQL文生成が間違えていると思うのですが。
    ●php実行文

    $taxs = get_terms('post_tag', array(
    'get' => 'all',
    'orderby' => 'count',
    'order' => 'DESC',
    'number' => 30,
    ) );

    ●間違いのSQL文を出力したところ
    /wp-include/taxonomy.php 1640行目にSQL文の$queryを表示させたら、以下のSQL文だった
    <SQL文1>

    SELECT t.*, tt.* FROM wp_terms AS t
        INNER JOIN wp_term_taxonomy AS tt
        ON t.term_id = tt.term_id
        WHERE tt.taxonomy IN ('post_tag')
        ORDER BY t.term_order DESC LIMIT 30

    ●問題箇所
    ORDER BYのところに件数の’count’が入っていない。
    t,term_orderがソートキーに入っているが、現状テーブルは0埋めになっているので、実質t.term_idでソートとなっている。
    ●正しいと思われるSQL文
    <SQL文2>

    SELECT t.*, tt.* FROM wp_terms AS t
        INNER JOIN wp_term_taxonomy AS tt
        ON t.term_id = tt.term_id
        WHERE tt.taxonomy IN ('post_tag')
        ORDER BY t.term_order, tt.count DESC LIMIT 30

    ●SQL文の実行結果を画像ファイルにして添付します。
    縮尺が統一されておらず、すみません。
    SQL文1.jpg:
    https://scontent.xx.fbcdn.net/t31.0-8/13522742_1873307189563453_6562267822709971625_o.jpg
    SQL文2.jpg:
    https://scontent.xx.fbcdn.net/t31.0-8/13495506_1873307296230109_4147628386160982437_o.jpg
    よろしくお願いいたします。
    <追記>
    解決後に画像ファイルは消去します。ご了承ください。

    [モデレーター編集: フォーラムカテゴリーを『バグ報告と提案』から『使い方全般』へ移動させました。『バグ報告と提案』はWordPressそのものに関する不具合報告のためのものですが、本件は個別の環境が原因と想定されるため。]

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

    (@extendwings)

    https://developer.wordpress.org/reference/functions/get_terms/ に説明がありますが、テーマやプラグインがget_terms_orderbyフィルターで何かしてたりしませんか?

    また、可能性は低いですが、4.5以前とそれ以降では推奨されている引数の渡し方が変わっていますので、そのあたりのバグの可能性はあります。

    [4.5以前]

    $terms = get_terms( 'post_tag', array(
        'hide_empty' => false,
    ) );

    [4.5以降]

    $terms = get_terms( array(
        'taxonomy' => 'post_tag',
        'hide_empty' => false,
    ) );

    検証すると再現しませんでした。次のようなクエリが実行されていました(プラグイン Query Monitor を利用)。テーマは Twenty Sixteen でプラグインはほとんど入れていません。

    SELECT t.*, tt.*
    FROM wp_terms AS t
    INNER JOIN wp_term_taxonomy AS tt
    ON t.term_id = tt.term_id
    WHERE tt.taxonomy IN ('post_tag')
    ORDER BY tt.count DESC
    LIMIT 30

    すでに Daisuke Takahashi さんがご指摘のフィルター経由で何か行われているのではないかと思います。

    トピック投稿者 qzx02361

    (@qzx02361)

    Daisuke Takahashi様、gblsm様。
    お世話になります。

    各種プラグインが入っていたので、関係するものだけを外してみたら、
    おっしゃるとおり、フィルタにて変更されているのがわかりました。

    今回の犯人は「Category Order and Taxonomy Terms Order」でした。

    ありがとうございました。
    これにて解決といたします。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「get_terms関数で件数をキーに入れたらSQL文がおかしい」には新たに返信することはできません。