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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

826閲覧

WordPressの「pre_get_posts」を、同一ページで複数実行する方法

yamasen

総合スコア23

WordPress

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/01/24 06:17

編集2019/01/24 08:30

「pre_get_posts」を使って、同一ページで複数のメインループを出力できますか?

###前提
index.phpをフロントページにしており、メインループを使わなければならない状況です。
(index.phpでサブループを使うとページネーションが機能しなくなるので。)

そしてフロントページには記事一覧を出力する場所が2か所あります。

###実現したいこと
よって「pre_get_posts」を使って、フロントページに2通りのメインループを出力したいと思っています。

イメージはこう↓です。

イメージ説明
なので下記のように条件ABのメインループを実現したいです。

php

1function myPreGetPosts( $query ) { 2 // フロントページ 3 if ( $query->is_home() ) { 4 if ( 右側 ) { 5 // 条件A 6 } 7 if ( 左側 ) { 8 // 条件B 9 } 10 } 11} 12add_action('pre_get_posts','myPreGetPosts');

これを実現するための書き方がございましたら是非、教えて下さい。宜しくお願い致します。

###補足
ご指摘を頂戴した点に関しまして、次のように補足させて頂きます。

・右と左のページネーションは連動せず、ページ数は別々です。ちなみに別々のカスタム投稿タイプです。
・右と左の要素の数は各ページで同じである必要はございません。(投稿者IDの指定なども動的に変更されうるため、右が15件で左が1件などもあります。)
・左または右の要素が0件というケースもありえます。

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

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

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

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

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

KazuhiroHatano

2019/01/24 08:12

右と左のページネーションは連動しちゃってOK?右と左のページ数は同じ? 右と左の要素の数は各ページで同じでなきゃいけない? 左または右の要素が0というケースを許容する?
yamasen

2019/01/24 08:29

失礼致しました。ご指摘頂いた情報の不備につきまして、補足として追記させて頂きました。ご査収のほど宜しくお願い申し上げます。
guest

回答1

0

ベストアンサー

左右でページネーションが連動しないのであれば、
メインクエリ一つで処理をするのはかなり厳しいです
左と右のページのクエリを分けるのが妥当です

サブループを使うとページネーションが機能しなくなる

いいえ、サブループのページネーションのパラメータをpaged以外の名前のパラメータで渡して
それをサブループのクエリのpagedに利用してサブループをループさせればいいだけです
paginate_linksがやってることは連番のURLパラメータのリンクを作るってことだけです
別にメインクエリのページネーションである必要はありません
formatでサブループではpaged以外のパラメータに値を入れるように設定し
baseパラメータとしてメインループはサブループのページのパラメータを残したURLを
サブループはメインループのページのパラメータを残したURLを指定すれば
メインとサブで別個にページネーション処理ができます

投稿2019/01/24 08:48

KazuhiroHatano

総合スコア7802

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

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

yamasen

2019/01/24 09:01

ご回答誠にありがとうございます。 サブループとページネーションの件ですが、仰るようにpagedを利用すれば可能かと存じます。 しかしそれは固定ページなどの場合であって、今回のようなケースでは難しいのではと考えています。 それは、こちらのサイト(http://xtra-blog.net/pagination/)に、「>2ページ目以降のURLが存在しないケース」の原因として「>投稿トップページないしアーカイブページでサブループを使用」が挙がっているためです。 今回のケースも、投稿トップページであるために、サブループの使用はページネーションが使えなくなりpagedが利用できなくなるのではないかと考えているのですが、この点にフォーカスした上でご見解を今一度お聞かせ頂けませんでしょうか。
KazuhiroHatano

2019/01/24 10:52

だからこそメインとサブでクエリもURLパラメータも分けて 互いに干渉しないようにします 変にメインクエリ一つでサブのループまで作るから メインのページネーションの有無が サブのページネーションにまで影響を与えます サブループをメインクエリから完全に独立させ ページネーションはpaginate_linksを使って お互いのパラメータを消してしまわないように処理することで 独立した2つのページネーションが同居できます
yamasen

2019/01/25 08:01 編集

なるほど、ありがとうございます。なんとなくわかりました。 あれから考えてみて、次のように paginate_links を使っています。 'add_args' でページネーションに名前をつけ、独立させているつもりです。 <?php /* functions.php に記載 */ // ページネーションの内容 function pagination( $query_type, $page_name ) { global $wp_rewrite; $paged = get_query_var('paged') ? get_query_var('paged') : 1 ; $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' => $query_type->max_num_pages, 'mid_size' => 2, 'current' => $paged, 'prev_text' => '« 前へ', 'next_text' => '次へ »', 'type' => 'list', 'add_args' => array( 'section' => $page_name ), )); } ?> <?php /* index.php に記載 */ pagination( $my_query, 'type1' ); ?> しかしこれですと、リンクが次のようになり、「/page/2」という不要な部分が入ってしまうのですが、この部分だけ消せないでしょうか? http://exaple.com/page/2/?section=type1&paged=3 http://exaple.com/page/2/?section=type1&paged=4 http://exaple.com/page/2/?section=type1&paged=5 たびたび申し訳ございません...
KazuhiroHatano

2019/01/25 09:58

メインのページネーションがパーマリンクになってるなら むしろ不要なのは&paged=の方なのでは? まあパーマリンクにする必要がないなら、フロントページなんだし baseはもうhome_url()にしちゃえばいいと思いますけどね
yamasen

2019/01/25 10:05

あ不要なのは&paged=かもしれません。 ところで 'base' => home_url(), だと http://exaple.com/?section=type1 となってしまい、ページ番号が消えてしまうのですが、、
yamasen

2019/01/25 10:24 編集

ありがとうございます!
yamasen

2019/02/23 20:37 編集

ここには追加で質問がありましたが、解決できたので削除致します。
yamasen

2019/02/23 20:37 編集

ここには追加で質問がありましたが、解決できたので削除致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問