サポート » 使い方全般 » taxonomy内で何番目の記事かを取得したい。

  • 解決済 tadashi.

    (@tadashi-1)


    いつも大変お世話になっています。

    qiitaの方にあるこちらの記事がまさにドンピシャなのですが
    http://qiita.com/shuhei/items/66c4a2369efbb61554b8

    これをarchive.phpで行う方法がうまくいかず、悩んでおります。
    archive.phpではカテゴリごとに記事を表示するようにしておりますが
    下記のようにしても動作しません。。
    SQL文もそうですがwordpressの挙動を理解していないこともあり、
    下記質問へ、ご教授いただけますと幸いです。。
    ・archive.phpにおいて、taxonomyごとに記事を表示
     そのtaxonomy内で何番目の記事かを取得/表示したい。
    ・上記が解決した場合、single.phpでも同様の番号を表示できるか?
    ・後学のため、SQL文でどう処理すればどのような結果が返ってくるかを
     学べるようなおすすめのサイトをご教示いただければと。

    archive.php

    <?php
    $categories = get_terms( 'teams_name');
    foreach($categories as $cat):
    
    	$loop = new WP_Query( array( 'orderby' => '', 'post_status' => 'publish', 'post_type' => 'nero_styles', 'tax_query' => array(
    							array(
    								'taxonomy' => $cat->taxonomy,
    								'field' => $cat->term_taxonomy_id,
     								'terms' => $cat->term_id
    	 						)));
    	while ( $loop->have_posts() ) : $loop->the_post();
    ?>
    <?php
    	echo post_number_in_cat( $cat->slug );
    	//qiitaの記事にあるようにカテゴリのスラッグを渡している。
    	//そのカテゴリ(taxonomy)内での番号を表示し、番号順に表示したい
    ?>
    <?php
    	endwhile;
    	endforeach;
    ?>

    functions.php

    <?php
    function post_number_in_cat($cat_slug) {
      global $wpdb, $post;
      print_r($wpdb);
      print_r($post);
      $number = $wpdb->get_var("
        SELECT COUNT(posts.ID)
        FROM $wpdb->posts posts
        INNER JOIN $wpdb->term_relationships rels ON posts.ID = rels.object_id
        INNER JOIN $wpdb->term_taxonomy tax ON rels.term_taxonomy_id = tax.term_taxonomy_id
        INNER JOIN $wpdb->terms terms ON tax.term_id = terms.term_ID
        WHERE terms.slug = '{$cat_slug}'
        AND posts.post_date <= '{$post->post_date}'
        AND posts.post_status = 'publish'
        AND posts.post_type = 'post'
      ;");
      return $number;
    }
    ?>

    これだけじゃわからないなどあればお伝えいただけますと幸いです。
    何卒、よろしくお願いいたします。

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

    (@jim912)

    ・archive.phpにおいて、taxonomyごとに記事を表示
     そのtaxonomy内で何番目の記事かを取得/表示したい。

    functions.php での記述の SQL文で、投稿タイプの指定が post になっておいる部分があります。

    AND posts.post_type = 'post'

    archive.php での投稿タイプの指定は、nero_styles になっていますので、投稿タイプが異なり、結果として 0 が返ってしまっているのではないでしょうか。
    また、厳密性を考えるのであれば、異なるtaxonomy で同一のスラッグがあった場合、functions.php のコードでは間違った結果を返す可能性があります。where句内に taxonomyの種別を指定する条件が必要です。
    その他、テーブルの JOIN による連結は、SQLが遅くなる原因となり得ます。
    望ましくは、termのスラッグからterm_taxonomyのidを取得し、postsテーブルとterm_relationshipsのみを連結して、取得した方が一般的にはパフォーマンスは向上するはずです。

    ・上記が解決した場合、single.phpでも同様の番号を表示できるか?

    できます。

    ・後学のため、SQL文でどう処理すればどのような結果が返ってくるかを
     学べるようなおすすめのサイトをご教示いただければと。

    ここらへんでしょうか。
    http://www.dbonline.jp/mysql/select/

    トピック投稿者 tadashi.

    (@tadashi-1)

    @jim912 さん

    返信ありがとうございます。

    archive.php での投稿タイプの指定は、nero_styles になっていますので、投稿タイプが異なり、結果として 0 が返ってしまっているのではないでしょうか。

    oh…凡ミスに気がつかず質問してしまいました。。
    ご指摘の通り、post_typeはカスタム投稿タイプなのでpost以外のものでした。
    調整したところ、うまく動くようになりました。
    ありがとうございます!

    また、厳密性を考えるのであれば、異なるtaxonomy で同一のスラッグがあった場合、functions.php のコードでは間違った結果を返す可能性があります。where句内に taxonomyの種別を指定する条件が必要です。

    運用改修は自身なので今回はこの対応を見送りましたが
    ご指摘いただいた内容はTODOなどに記述し今後の対応としたいと思います!

    その他、テーブルの JOIN による連結は、SQLが遅くなる原因となり得ます。
    望ましくは、termのスラッグからterm_taxonomyのidを取得し、postsテーブルとterm_relationshipsのみを連結して、取得した方が一般的にはパフォーマンスは向上するはずです。

    qiitaにも書いてあった点ですね。
    速度面はきになるので、いただいた参考URLをもとにブラッシュアップしてみます。
    URLもありがとうございます!

    まずは表題の件が解決しましたので一旦このスレッドは解決済みにします。
    ありがとうございました!

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック「taxonomy内で何番目の記事かを取得したい。」には新たに返信することはできません。