サポート » 使い方全般 » カテゴリとタグに属する記事の一覧表示を10件ずつ表示してページ送りを

  • 解決済 merusi

    (@merusi)


    お世話になります。

    現在下記のようにテンプレートに記載してレシピというカテゴリの中の野菜という
    タグがついたものを一覧表示させているのですが、件数が多くて見にくいです。

    出来れば10~20件くらいずつ表示させてページ送りを付けたいのですが、
    どうすれば実現できるでしょうか。

    フォーラム内の過去の回答も探したのですが、query_postsを使ったものばかりで
    合致しそうな回答を見つけられませんでした。
    何卒、お知恵をお貸しください。宜しくお願いします。

    <ul>
    <?php
    $args = array(
            'post_type' =>'post',
            'tax_query' => array(
                'relation' => 'AND',
                array(
                    'taxonomy' => 'category',
                    'field' => 'slug',
                    'terms' => 'recipe',
                ),
                array(
                    'taxonomy' => 'post_tag',
                    'field' => 'slug',
                    'terms' => '野菜',
                                ),
            ),
    'numberposts' => -1
                );
    $posts = get_posts( $args ); ?>
    
    <?php foreach($posts as $post): ?>
    <?php setup_postdata($post); ?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endforeach; ?>
    <?php wp_reset_postdata(); ?>
    </ul>

    ちなみにページ送りは池田百合子さんのページで拝見した
    下記のコードを使うつもりです。

    <div class="tablenav"><?php global $wp_rewrite;
    $paginate_base = get_pagenum_link(1);
    if (strpos($paginate_base, '?') || ! $wp_rewrite->using_permalinks()) {
    	$paginate_format = '';
    	$paginate_base = add_query_arg('paged', '%#%');
    } else {
    	$paginate_format = (substr($paginate_base, -1 ,1) == '/' ? '' : '/') .
    	user_trailingslashit('page/%#%/', 'paged');;
    	$paginate_base .= '%_%';
    }
    echo paginate_links( array(
    	'base' => $paginate_base,
    	'format' => $paginate_format,
    	'total' => $wp_query->max_num_pages,
    	'mid_size' => 5,
    	'current' => ($paged ? $paged : 1),
    )); ?></div>

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    get_postsではページ情報を持たないので、そのままではできないと思います。
    たとえばこんな感じ↓で、ページの情報を持たせてあげましょう。(すみません英語です)
    http://imperativeideas.com/how-to-configure-pagination-using-the-get_posts-method/

    スレッド開始 merusi

    (@merusi)

    ご提示いただいたURLを参考に20件だけ表示することは出来ました。
    ありがとうございます!

    ただ、ページ送りが全く反応しません。
    どう対処すればいいでしょうか・・・。

    <div class="tablenav"><?php global $wp_rewrite;
    $paginate_base = get_pagenum_link(1);
    if (strpos($paginate_base, '?') || ! $wp_rewrite->using_permalinks()) {
    	$paginate_format = '';
    	$paginate_base = add_query_arg('paged', '%#%');
    } else {
    	$paginate_format = (substr($paginate_base, -1 ,1) == '/' ? '' : '/') .
    	user_trailingslashit('page/%#%/', 'paged');;
    	$paginate_base .= '%_%';
    }
    echo paginate_links( array(
    	'base' => $paginate_base,
    	'format' => $paginate_format,
    	'total' => $wp_query->max_num_pages,
    	'mid_size' => 5,
    	'current' => ($paged ? $paged : 1),
    )); ?></div>
    
    <ul>
    <?php
    	$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $args = array(
            'post_type' =>'post',
            'posts_per_page'    => 20,
            'paged'            => $paged,
            'tax_query' => array(
                'relation' => 'AND',
                array(
                    'taxonomy' => 'category',
                    'field' => 'slug',
                    'terms' => 'recipe',
                ),
                array(
                    'taxonomy' => 'post_tag',
                    'field' => 'slug',
                    'terms' => '野菜',
                                ),
            ),
    'numberposts' => -1
                );
    $posts = get_posts( $args ); ?>
    
    <?php foreach($posts as $post): ?>
    <?php setup_postdata($post); ?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endforeach; ?>
    <?php wp_reset_postdata(); ?>
    </ul>
    モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    すみません、ちょっと私の回答が雑でしたm(_ _)m
    挙げていただいたページネーションコードをもう少し詳しく読んでみたところ、
    グローバル変数 $wp_queryを使っているので、このページネーションはquery_posts用ということになります。
    手元の環境に反映してみたところ、動くは動くんですが最後に空ページが出たり若干アヤシイ挙動でした。

    get_postsとquery_postsは同じように見えてけっこう内部的に違うところがありまして、
    しかもやっかいなことにその理解は非常にムズカシイ、というしろものです。
    (私もまだ完全には理解できてません。。。)
    get_postsでやりたいなら、ページネーション用のコードの方を改造しないといけないと思います。
    (改造コードがすぐ思いつかないので割愛させてください…|自分はそもそもget_postesってページネーションさせるような場面で使うものじゃないと認識してたので、get_postsでもpaged指定できるんだーてかんじでしたf^_^;)

    ※ちなみに'numberposts' => -1の行は多分不要です

    参考:高度な内容ですがブクマしておくと後々役に立つと思います

    ここでの最大のポイントはhijiriworld Webの記事にあるように

    get_posts() は、単にデータを取得するだけで、グローバル変数 $wp_query には影響を与えません。
    query_posts() は、グローバル変数 $wp_query を変更します。

    というところかな~という雰囲気です。

    merusiさんの現状のスキルレベルがわからないのでどのようなアドバイスが最適なのかというのが難しいところなのですが、
    とりあえずquery_postsじゃなくget_postsを選ばれたところのいきさつなんかがあれば教えていただけると次のとっかかりになるかもです。

    (これをどのテンプレに書いてるのか、とか、サイト全体の設計がどうなってるのか、というのもヒントになると思います)

    スレッド開始 merusi

    (@merusi)

    mypacecreator様、ご回答ありがとうございます。
    また、返信が遅れて申し訳ありません。

    参考になるページを沢山教えていただきましたので、拝見しながら
    色々試してみたのですが画面が真っ白になってしまうばかりで、
    どうにも上手に出力できませんでした。

    なぜquery_postsではなくget_postsを選んだかですが、一番初めにやりたかった
    ことが一覧表示させることだけだったので、特に理由もなくget_postsを
    選んで表示させたのですが、記事数が多く見づらいためページ送りを
    付けたいと思ったのです。

    これを記述しているテンプレートは固定ページのテンプレートでサイトの作りは
    トップページ、カテゴリー別記事一覧を表示させた固定ページ、投稿ページの
    3種類です。

    そして親固定ページの下に子固定ページを作り、親固定ページに含まれる記事をカテゴリーとタグで分類してさらに細分化させた一覧を表示させているという状態です。

    今回自分なりに書いてみたコードは下記のとおりです。

    <ul>
    <?php query_posts(
    	$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $args = array(
            'post_type' =>'post',
            'posts_per_page'    => 20,
            'paged'            => $paged,
            'tax_query' => array(
                'relation' => 'AND',
                array(
                    'taxonomy' => 'category',
                    'field' => 'slug',
                    'terms' => 'recipe',
                ),
                array(
                    'taxonomy' => 'post_tag',
                    'field' => 'slug',
                    'terms' => '野菜',
                                ),
            ),
                );
    $query = new WP_Query( $args ); ?>
    
    <?php foreach($posts as $post): ?>
    <?php setup_postdata($post); ?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endforeach; ?>
    <?php wp_reset_postdata(); ?>
    </ul>

    自分でもさらに試すつもりですが、何かアドバイスがありましたら
    宜しくお願いいたします。

    get_posts() でなく query_posts() にすればいいのです。トップページ、カテゴリー別記事一覧(固定ページ)は分かりますが、投稿ページはちょっと疑問です。

    <?php
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $args = array(
            'post_type' =>'post',
            'posts_per_page'    => 20,
            'paged'            => $paged,
            'tax_query' => array(
                'relation' => 'AND',
                array(
                    'taxonomy' => 'category',
                    'field' => 'slug',
                    'terms' => 'recipe',
                ),
                array(
                    'taxonomy' => 'post_tag',
                    'field' => 'slug',
                    'terms' => '野菜',
                )
            )
    );
    query_posts( $args );
    if (have_posts()) :
        echo "<ul>";
        while (have_posts()) : the_post();
    ?>
            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php
        endwhile;
        echo "</ul>";
    ?>
        <!-- ここにページ送りのテンプレートタグやプラグインを設置 -->
    <?php
    else :
        echo '<p>ポストは見つかりません。</p>';
    endif;
    ?>

    追加
    トップページ、カテゴリー別記事一覧(固定ページ)でも、リンク付きタイトルしか表示しないのであれば、それが本当にメインループになるのかという疑問もあります。query_posts() してページ送りをするということは、このループがそのページのメインループになるということです。

    スレッド開始 merusi

    (@merusi)

    pluto1234様

    ご回答ありがとうございます。
    お示しいただいたコードでほぼ希望どうりの表示ができました。

    羅列したリンク付きタイトルの上にトップページの内容を表示したかったのと
    ulにclassを指定したかったので、その部分だけ変更すれば思い通りの
    表示にすることが出来ました。

    本当にありがとうございました!!
    出来上がったコードは下記のとおりです。

    <?php while ( have_posts() ) : the_post(); ?>
    					<?php get_template_part( 'content', 'page' ); ?>
    <?php endwhile; // end of the loop. ?>
    <?php
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $args = array(
            'post_type' =>'post',
            'posts_per_page'    => 20,
            'paged'            => $paged,
            'tax_query' => array(
                'relation' => 'AND',
                array(
                    'taxonomy' => 'category',
                    'field' => 'slug',
                    'terms' => 'recipe',
                ),
                array(
                    'taxonomy' => 'post_tag',
                    'field' => 'slug',
                    'terms' => '野菜',
                )
            )
    );
    query_posts( $args );
    if (have_posts()) :
        echo "<ul class='kobunrui'>\n";
        while (have_posts()) : the_post();
    ?>
            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php
        endwhile;
        echo "</ul>";
    ?>
        <div class="tablenav"><?php global $wp_rewrite;
    $paginate_base = get_pagenum_link(1);
    if (strpos($paginate_base, '?') || ! $wp_rewrite->using_permalinks()) {
    	$paginate_format = '';
    	$paginate_base = add_query_arg('paged', '%#%');
    } else {
    	$paginate_format = (substr($paginate_base, -1 ,1) == '/' ? '' : '/') .
    	user_trailingslashit('page/%#%/', 'paged');;
    	$paginate_base .= '%_%';
    }
    echo paginate_links( array(
    	'base' => $paginate_base,
    	'format' => $paginate_format,
    	'total' => $wp_query->max_num_pages,
    	'mid_size' => 5,
    	'current' => ($paged ? $paged : 1),
    )); ?></div>
    <?php
    else :
        echo '<p>ポストは見つかりません。</p>';
    endif;
    ?>

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「カテゴリとタグに属する記事の一覧表示を10件ずつ表示してページ送りを」には新たに返信することはできません。