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

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

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

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

XAMPP

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

解決済

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

8-0_nyan5
8-0_nyan5

総合スコア2346

WordPress

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

XAMPP

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

2回答

0評価

0クリップ

8016閲覧

投稿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を使ってローカルで作業中
ネットの情報を元に作業中

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

kei344

2016/09/28 09:29

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

2016/09/28 11:23

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

WordPress

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

XAMPP

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