質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

Q&A

解決済

2回答

10006閲覧

wordpressで複数のループがある記事一覧でのページネーションについて

8-0_nyan5

総合スコア2352

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

0グッド

0クリップ

投稿2016/09/28 03:18

###前提・実現したいこと
wordpressでカスタム投稿の記事一覧を作っています。
表示したいデザインが3種類あるので、3つのループを作って、
条件を入れて表示させています。

表示自体までは試行錯誤してうまくいったのですが、
ページネーションがちゃんと動作していないようです。

###該当のソースコード(記事一覧/archive-shop.phpに記載)

<!--来月--> <div class="next_month"> <!--記事のタイトルと本文を表示するため「ループ」の設定の中に記述--> <?php $args = array( 'posts_per_page' => -1, 'orderby' => 'meta_value', 'meta_key' => 'publication_date', 'order' => 'ASC', 'post_type' => 'shop', 'post_status' => 'publish' ); ?> <?php $my_query = new WP_Query( $args ); ?><!-- クエリの指定 --> <?php while ( $my_query->have_posts() ) : $my_query->the_post(); ?><!-- 他と違い$my_queryはクラスなので、「->(アロー演算子)」を使って値を取得。ここからループ開始 --> <?php $now0 = post_custom('publication_date'); $now1 = date("Y/m",strtotime("today")); $now2 = date("Y/m",strtotime($now0)); $now3 = date("Y/m",strtotime("today + 2month")); if($now2 > $now1 && $now2 < $now3): ?> //表示する内容1 <?php else: ?> <?php endif; ?> <?php endwhile; ?> </div> <?php wp_reset_postdata(); ?><!-- 忘れずにリセットする必要がある --> <!--今月--> <?php $args = array( 'posts_per_page' => -1, 'orderby' => 'meta_value', 'meta_key' => 'publication_date', 'order' => 'ASC', 'post_type' => 'shop', 'post_status' => 'publish' ); ?> <?php $my_query = new WP_Query( $args ); ?><!-- クエリの指定 --> <?php while ( $my_query->have_posts() ) : $my_query->the_post(); ?><!-- 他と違い$my_queryはクラスなので、「->(アロー演算子)」を使って値を取得。ここからループ開始 --> <?php $now0 = post_custom('publication_date'); $now1 = date("Y/m",strtotime("today")); $now2 = date("Y/m",strtotime($now0)); if($now2 == $now1): ?> //表示する内容2 <?php else: ?> <?php endif; ?> <?php endwhile; ?> <?php wp_reset_postdata(); ?><!-- 忘れずにリセットする必要がある --> <!--先月(メインループ)--> <?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?><!-- ループの開始 --> <?php $now0 = post_custom('publication_date'); $now1 = date("Y/m",strtotime("today")); $now2 = date("Y/m",strtotime($now0)); if($now2 < $now1): ?> //表示する内容メイン <?php else: ?> <?php endif; ?> <?php endwhile; ?> <?php wp_reset_query(); ?><!-- 忘れずにリセットする必要がある --> <!-- pager --> <?php if (function_exists("pagination")) { pagination($additional_loop->max_num_pages); } ?> <!-- /pager -->

###該当のソースコード(ページャー/functions.phpに記載)

//ページネーションを追加 function pagination($pages = '', $range = 3) { $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 clearfix\"><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に記載)

//メインクエリ function query_at_shop( $query ){ // ダッシュボードまたは管理パネルが表示されている、もしくはメインクエリではない場合は処理を中断 if( is_admin() || ! $query->is_main_query() ) return; if( $query->is_post_type_archive( 'shop' ) ){ $query->set( 'posts_per_page', '4' ); return; } } add_action( 'pre_get_posts', 'query_at_shop' );

###試したこと
最初、archive-shop.phpにメインループだけ作って動作確認をしました。
(期待通りに動作)
次に、条件を加えるためにサブループを加えました。
(メイン、サブというのをこの作業しているときに知って、ループ部分を今のように変更)

ページャーがうまく動作してないことに気づく。
例えば、現在カスタム投稿が18件あり、内容1に2件、内容2に3件、メインは残り13件です。内容1、2については全件表示、メインをページあたり4にしてみると、なぜか全部で5ページで1ページ目は4件、2ページ目は2件、3ページ目は3件、4ページ目は4件、5ページ目は表示なしとなってしまいます。
メインを全件表示にすると全件表示されます。ページあたりの件数を変えると同じようにバラバラになってしまいます。

functions.phpに書かないタイプのページャーも試してみましたが、変化なし。
###補足情報(言語/FW/ツール等のバージョンなど)
wordpress4.6.1
XAMPPを使ってローカルで作業中
ネットの情報を元に作業中

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2016/09/28 09:29

「表示する内容1/2」はページングする全ページで表示する必要があるものなのですか?
8-0_nyan5

2016/09/28 11:23

できればそうしたいです。 2ページ目以降メインのみであれば、ページ送りがうまくできるならそれでもかまいません。 (ループを3つ入れる以外に方法がうまい方法があればそれでもかまいません)
guest

回答2

0

機能しない原因はkei334さんの書かれている通りです。
ちなみにページャーのキーになるのは$pagedと$wp_query内のmax_num_pagesです。

$paged:現在のページ番号
mux_num_pages:総ページ数

何か変数をあてなければ$wp_query内のmux_num_pagesを参照するコードになっているので、今回の例だと総ページ数が5ページになってしまっています。

あといっそメインもサブループにするという手もあります。

php

1<?php 2 $paged = get_query_var('paged') ? get_query_var('paged') : 1 ; 3 $args = array( 4 'posts_per_page' => -1, 5 'orderby' => 'meta_value', 6 'meta_key' => 'publication_date', 7 'order' => 'ASC', 8 'post_type' => 'shop', 9 'post_status' => 'publish' 10 ); 11 $my_query = new WP_Query($args); 12 $max_num_pages = $my_query->max_num_pages; 13?> 14<?php 15 if( $my_query -> have_posts() ) : 16 while($my_query -> have_posts()) : $my_query -> the_post(); 17?> 18 19 -----ループ処理----- 20<?php 21 endwhile; 22 endif; 23?> 24<?php 25 if (function_exists('pagination')) { 26 pagination($max_num_pages); 27 } 28?>

ただそのページャーのコードですと幻の5ページ目のリンクも生成されてしまうので、ページャーを表示する箇所(function paginationの下から3行目)を変更する必要があります。

php

1if( $paged != $pages){ //現在のページが$max_num_pagesから参照した最後のページではない場合、現在ページ+1ページ目のリンクを張る 2 echo '<li class="next"><a href="'.get_pagenum_link($paged + 1).'"><span>Next</span></a></li>'; 3}else{ //そうでなければ(最後のページなら)現在のページのリンクを張る 4 echo '<li class="next"><a href="'.get_pagenum_link($paged).'"><span>Next</span></a></li>'; 5}

おそらくこれで機能するんじゃないかな、と思います。

投稿2016/09/28 14:27

編集2016/09/28 14:29
kchiku

総合スコア146

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

8-0_nyan5

2016/09/29 05:12

ありがとうございます。
guest

0

ベストアンサー

現在カスタム投稿が18件あり、内容1に2件、内容2に3件、メインは残り13件です。内容1、2については全件表示、メインをページあたり4にしてみると、なぜか全部で5ページで1ページ目は4件、2ページ目は2件、3ページ目は3件、4ページ目は4件、5ページ目は表示なしとなってしまいます。

全18件 ÷ 4 を切り上げしたら 5ページになります。あくまでページャは現在表示しているページの WP_Query の総数から表示するページを出し分けているからです。
つまり、メインループの if($now2 < $now1): の部分で件数を減らしていることをページャは知りません。

if($now2 < $now1): の分岐を外して表示されれば、4件/4件/4件/4件/2件の5ページが出力されると思います。


カスタムフィールドの日付を基準に表示を切り替えているようなので、その場合 pre_get_posts の時点で絞り込んでしまう方法があります。下記サイトの日付による絞込みを御覧ください。

【query_posts(WP_Queryクラス)でカスタムフィールドを使う:WordPress私的マニュアル】
http://elearn.jp/wpman/column/c20110915_01.html

投稿2016/09/28 13:50

編集2016/09/28 14:29
kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

8-0_nyan5

2016/09/29 05:19

ありがとうございます。 条件分岐をかます位置に問題があったのですね。 いただいた情報を元に試行錯誤してうまくいきました。(いまのところ) ただ、keyに対して渡すvalueが空だとうまくいかないので、 カスタムフィールドを変更して、デフォルトで文字が入るようにしました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問