サポート » 使い方全般 » get_next_postで同一タグを対象にしたい。

  • 解決済 yunosuke

    (@yunosuke)


    初めまして。
    single.phpにて、「同一タグの次の記事を表示する」ことにトライしています。

    <?php $tags = get_tags(); ?>
    <?php if ($tags): foreach($tags as $tag): ?>
    <h4><?php echo $tag->name; ?>タグの記事</h4>
    <ul>
    <?php if(get_next_post(true)): ?>
    <li><?php next_post_link('%link','%title',TRUE,''); ?></li>
    <?php endif; ?>
    <?php if(get_previous_post(true)): ?>
    <li><?php  previous_post_link('%link','%title',TRUE,''); ?></li>
    <?php endif; ?>
    </ul>
    <?php endforeach; endif; ?>

    というコードを書いたのですが、同じタグではなく同じカテゴリの記事になってしまいました。next_post_link、previous_post_linkで、同一のタグを対象に処理する方法はありますでしょうか?

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

    (@gatespace)

    next_post_link
    http://codex.wordpress.org/Template_Tags/next_post_link
    previous_post_link
    http://codex.wordpress.org/Function_Reference/previous_post_link

    第5引数でタクソノミー(多分post_tag)を指定すれば可能。

    ただし get_next_post(), get_previous_post() もタクソノミーを指定しないと正しい条件分岐にはなりません。

    get_next_post
    https://developer.wordpress.org/reference/functions/get_next_post/
    get_previous_post

    get_previous_post()

    gatespace様

    ご回答いただきありがとうございます!
    お書きいただいたアドバイスを元に、下記のように改修したのですがちょっと様子がヘンです…?

    <?php $tags = get_the_tags(); ?>
    <?php if ($tags): foreach($tags as $tag): ?>
    <h4><?php echo $tag->name; ?>タグの記事</h4>
    <ul>
    <?php if(get_next_post(true,'','post_tag')): ?>
    <li class="nextpost"><?php next_post_link('%link','%title',TRUE,'','post_tag'); ?> →</li>
    <?php endif; ?>
    <?php if(get_previous_post(true,'','post_tag')): ?>
    <li>← <?php  previous_post_link('%link','%title',TRUE,'','post_tag'); ?></li>
    <?php endif; ?>
    </ul>
    <?php endforeach; endif; ?>

    【テスト環境】
    記事1 タグ「A」
    記事2 タグ「A」「B」
    記事3 タグ「B」

    【表示結果】
    ・記事1のsingle.php
    ———————-
      Aタグの記事
         記事2→
    ———————-

    ・記事2のsingle.php
    ———————-
      Aタグの記事
    ←記事1  記事3→
      Bタグの記事
    ←記事1  記事3→
    ———————-

    ・記事3のsingle.php
    ———————-
      Bタグの記事
    ←記事2
    ———————-

    記事1と3は希望どおりの表示なのですが、記事2は

    ———————-
      Aタグの記事
    ←記事1
      Bタグの記事
         記事3→
    ———————-

    となってほしいのですがなってくれません。
    もう少し調べてみます…!

    モデレーター gatespace

    (@gatespace)

    get_next_postやnext_post_linkでは
    特定のタクソノミー(デフォルトではカテゴリー)に対して同じタームがあればという条件なので、そこまで細かく指定できません。

    提示してもらった例で言うと
    記事2(タグ「A」「B」)からは、「AまたはBを持つタグ」という条件です。

    タグごとに事細かくやるのであれば、next_post_linkやprevious_post_linkを使わないでget_postsでゴリゴリ書くしか無いかも。

    Codexに単純な前後リンクの例文があるのでこれを参考にget_posts 時にタームで絞り込めばできそうな気もしますが・・・
    http://codex.wordpress.org/Template_Tags/get_posts#Posts_with_Previous_Next_Navigation

    gatespace様

    上記、ご回答いただきありがとうございます!
    アドバイスいただいたとおり、get_postsを使い下記のような実装をしたところ、希望していたどおりの挙動になりました! ありがとうございます。

    <?php $tags = get_the_tags(); ?>
    <?php if ($tags): foreach($tags as $tag): ?>
    <h4><?php echo $tag -> name; ?>タグの記事</h4>
    <ul>
    <?php
    $args = array (
    	'post_type' => 'post',
    	'posts_per_page' => -1,
    	'tax_query' => array (
    		array (
    			'taxonomy' => 'post_tag',
    			'field' => 'slug',
    			'terms' => $tag -> slug
    		)
    	)
    );
    $postlist = get_posts( $args );
    $ids = array();
    foreach ($postlist as $thepost) {
    	$ids[] = $thepost->ID;
    }
    
    $thisindex = array_search($post->ID, $ids);
    $previd = $ids[$thisindex+1];
    $nextid = $ids[$thisindex-1];
    if (!empty($nextid)) {
    	echo '<li class="nextpost"><a href="' . get_permalink($nextid). '">'.get_the_title($nextid).'</a></li>';
    }
    if (!empty($previd)) {
    	echo '<li class="prevpost"><a href="'.get_permalink($previd).'">'.get_the_title($previd).'</a></li>';
    }
    ?>
    </ul>
    <?php endforeach; endif; ?>
4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「get_next_postで同一タグを対象にしたい。」には新たに返信することはできません。