• 解決済 heppoko

    (@heppoko)


    タクソノミー一覧ページとカテゴリー一覧ページにページナビを表示させたいと思い、
    ひとまずプラグインなしでできないか検索したところ、
    下記のソースがやたらと見つかったのでこれを試させていただきました。

    function pagination($pages = '', $range = 2)
    {
    $showitems = ($range * 2)+1;
    global $paged;
    if(empty($paged)) $paged = 1;
    if($pages == '')
    {
        global $wp_query;
        $pages = $wp_query->max_num_pages;
        if(!$pages)
        {
       $pages = 1;
        }
    }
    if(1 != $pages)
    {
        echo "<div class=\"pagination\"><span>Page ".$paged." of ".$pages."</span>";
        if($paged > 2 && $paged > $range+1 && $showitems < $pages) echo "<a href='".get_pagenum_link(1)."'>&laquo; First</a>";
        if($paged > 1 && $showitems < $pages) echo "<a href='".get_pagenum_link($paged - 1)."'>&lsaquo; Previous</a>";
        for ($i=1; $i <= $pages; $i++)
        {
       if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems ))
       {
      echo ($paged == $i)? "<span class=\"current\">".$i."</span>":"<a href='".get_pagenum_link($i)."' class=\"inactive\">".$i."</a>";
       }
        }
        if ($paged < $pages && $showitems < $pages) echo "<a href=\"".get_pagenum_link($paged + 1)."\">Next &rsaquo;</a>";
        if ($paged < $pages-1 &&  $paged+$range-1 < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($pages)."'>Last &raquo;</a>";
        echo "</div>\n";
    }
    }

    上記を「functions.php」に記述。
    そして「category.php」「taxonomy-タクソノミー名.php」には下記ループを記述。

    ▼「category.php」

    <?php
    $cat = get_the_category(); $cat = $cat[0];{
    $catid= "$cat->cat_ID";
    }
    $myposts = get_posts('numberposts=3&order=asc&paged='.$paged. '&category='.$catid);
    foreach($myposts as $post) :?>
    
    	//表示させるコンテンツ内容を記載
    
    <?php endforeach; ?>

    ▼「taxonomy-タクソノミー名.php」

    <?php
    $term = array_shift(get_the_terms($post->ID, 'jisseki_cat'));
    ?>
    <?php $tax_posts = get_posts('post_type=jisseki_post&posts_per_page=3&taxonomy=jisseki_cat&paged='.$paged. '&term='.esc_html($term->slug)); if($tax_posts): ?>
    <?php foreach($tax_posts as $tax_post): ?>
    
    //表示させるコンテンツ内容を記載
    
    <?php endforeach; ?>
    <?php endif; ?>

    各ループの外にナビゲーション表示のためのソース、

    <?php if (function_exists("pagination")) {
    pagination($additional_loop->max_num_pages);
    } ?>

    を記載。

    当初「$paged」を記述していなかったのですが、
    そのために1ページ目と同じ内容のものが次ページ以降も表示されるという症状になりました。
    「$paged」を記述し、表示設定の「1ページに表示する最大投稿数」を1にすることで、
    ページ送りはちゃんとされるようになりました。
    つまり1ページ目には3件、2ページ目には2件が表示されるようになりました。

    しかし今テストで記事は5件しか登録していません。
    それを3件表示にすることで次ページに残りを表示させるようにしたのですが、
    うまく稼働していれば「 [Page 1 of 2] 1 2 」と表示されるはずなのに、
    「 [Page 1 of 5] 1 2 3 4 5 」となってしまうのです。
    3ページ以降もページはあるんですが、ループ内は空白状態。

    「page-カスタム投稿タイプ名.php」では、「 [Page 1 of 2] 1 2 」となってちゃんと動いてくれました。
    ちなみに「page-カスタム投稿タイプ名.php」は「query_posts」で書いてかつ、
    「$paged」を書くことでうまくいきました。

    そもそもまだまだWordpressやPHPが不慣れなのにプラグインなしでやろうとしたのが間違いだったのかも知れない。
    そう思って「WP-PageNavi」というプラグインを入れて試してみたのですが、結果は何と全く同じ。

    「page-カスタム投稿タイプ名.php」では「 [Page 1 of 2] 1 2 」となり、
    「category.php」「taxonomy-タクソノミー名.php」では「 [Page 1 of 5] 1 2 3 4 5 」と…

    今日一日、朝から一つずつ解決していきながらここまでたどり着いたのですが、
    ここから先がどうしても解決できず投稿させていただきました。

    お分かりになる方がいらっしゃいましたら、ご教授いただければ幸いです。
    よろしくお願いいたします。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • gblsm

    (@gblsm)

    get_posts を使わずにループの基本形を書けば、総ページ数が正しくなると思います。その時、1ページあたりの記事(投稿)の数は、表示設定の「1ページに表示する最大投稿数」になります。

    ループの基本形は下記のようなコードです。Twenty Fourteen 等のデフォルトテーマのテンプレートファイルが参考になります。

    <?php
    	if ( have_posts() ) {
    		while ( have_posts() ) {
    			the_post();
    			//
    			// 投稿を表示するテンプレートタグなどをここに置く
    			//
    		} // end while
    	} // end if
    ?>

    トピック投稿者 heppoko

    (@heppoko)

    回答ありがとうございました。
    投稿されている記事の内、同タクソノミーの一覧ページや同カテゴリーの一覧ページというのは、
    仰る「get_posts を使わずにループの基本形」だけで出力表示することが可能なのでしょうか?
    それをしたいと思って調べたら、今回記述させてもらったようなソースを見かけて、
    それを基にしてやってみたのですが。
    ページナビゲーション以外はちゃんと表示されていますが、根本的に間違っていることになるのでしょうか?

    gblsm

    (@gblsm)

    説明不足でしたので追記します。

    category.php も taxonomy-タクソノミー名.php も page-カスタム投稿タイプ名.php も、各テンプレートが表示される前(テンプレートの中に書いたPHPコードが実行される前)に、既にクエリ(query_postsなど)が実行されています。
    そのクエリの結果を受け取る形で投稿や固定ページを表示するのが、while ( have_posts() ) のループです。

    heppoko さんのテンプレートは、上記のクエリの結果を使わないで自前の get_posts を実行しているので、WP-PageNavi プラグインが思ったとおり動作しません。
    いちど、テンプレート内で get_posts や query_posts を実行しない archive.php に対して、自前のページネーションを入れてみてはいかがでしょう。

    gblsm

    (@gblsm)

    例えばデフォルトテーマ Twenty Thirteen の archive.php の中に次のような行があります。

    <?php if ( have_posts() ) : ?>
    	<header class="archive-header">
    /* 中略 */
    	</header><!-- .archive-header -->
    
    	<?php /* The loop */ ?>
    	<?php while ( have_posts() ) : the_post(); ?>
    		<?php get_template_part( 'content', get_post_format() ); ?>
    	<?php endwhile; ?>
    
    	<?php twentythirteen_paging_nav(); ?> /* ここです */
    
    <?php else : ?>
    	<?php get_template_part( 'content', 'none' ); ?>
    <?php endif; ?>

    上記の twentythirteen_paging_nav の行を削除して、代わりに自前ページネーションを実行すると思ってください。

    ご存知と思いますが、テンプレートの編集を失敗するとサイトにログインできなくなる場合があるので、ftpツール等でバックアップ・リストアの準備を済ませてからどうぞ。

    gblsm

    (@gblsm)

    同カテゴリーの一覧ページは次のようなURLで表示できます。
    テンプレートは category.php です。

    http://サイト/wordpress/?cat=カテゴリーID

    同タクソノミーの同タームの一覧ページは次のようなURLで表示できます。
    テンプレートは taxonomy.php です。

    http://サイト/wordpress/?タクソノミー名=ターム名

    なお、どのテンプレートが使われるかについて詳しくは テンプレート階層 を見てください。

    トピック投稿者 heppoko

    (@heppoko)

    お礼が大変遅くなってしまってすみません。
    回答いただいたものをもとにしてソースを書いたり検証したりするのに手間取ってしまいました。
    結果、ページネーションの表示がうまくいきましたです!ありがとうございました!

    //ソートをかけるために追記
    <?php $posts = query_posts( $query_string . '&order=asc' ); ?>
    <?php if ( have_posts() ) : ?>
      <?php while ( have_posts() ) : the_post(); ?>
    	 //表示させるコンテンツ内容を記載
      <?php endwhile; ?>
       //下記にページネーションのソースを記載
      <?php if (function_exists("pagination")) {
       pagination($additional_loop->max_num_pages);
     } ?>
    <?php endif; ?>

    ものすごくシンプルになって驚きました。自分は一体何をしていたのだろうと思うほどに。
    ただ一つ、不思議なことがありまして。
    このソースを書いたのは「category.php」だけです。
    うまく表示された流れでタクソノミーの方も見てみたら、
    当然修正していないからページネーションはおかしいままだと思ったらちゃんと表示されていたのです。
    一瞬「category.php」が使われて表示されているのかと思ったのですがそうではなく。

    何かがブッキングしていたのかどうか検証する術を持ち合わせていないので、
    すっきりしない部分もあるのですがひとまずは結果オーライということにしたいと思います。

    重ね重ね本当にありがとうございました。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「プラグインなしでページナビを表示したいのですが…」には新たに返信することはできません。