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

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

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

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

PHP

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

3377閲覧

wordpressでアーカイブページでソートした場合にページングの2ページ目にソート条件が反映されない

kyrly2

総合スコア14

WordPress

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

PHP

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2019/01/27 09:37

掲題の件、行き詰まっているため、ご教示ください。

■問題内容
ソートで並べ変えたページ(POSTメソッドで生成)で2ページ目のボタンを押すと、並べ替える前の条件の2ページ目が表示される
→並べ替えたページの2ページ目を表示したいです

ソートはfunction.phpに
以下のようなカスタムフィールドの複数条件で絞り込みされるようpre_get_postsを使っています。

PHP

1function SortArchive( $query ) { 2 $sortset = (string)filter_input(INPUT_POST, 'sort') ; 3 if ( $sortset === 'cheap' ) { //コース料金が安い 4 $query->set( 'meta_query', 5 array( 6 'relation' => 'AND', 7 'fee' => array( 8 'key' => 'fee', 9 ), 10 'fee_blank' => array( 11 'key' => 'fee_blank', 12 'value' => '0', 13 ) 14 ) 15 ); 16 $query->set( 'orderby', 'meta_value_num' ); 17 $query->set( 'order', 'ASC' ); 18 } elseif ( $sortset === 'expensive' ) { //コース料金が高い 19 $query->set( 'meta_query', 20 array( 21 'relation' => 'AND', 22 'fee' => array( 23 'key' => 'fee', 24 ), 25 'fee_blank' => array( 26 'key' => 'fee_blank', 27 'value' => '0', 28 ) 29 ) 30 ); 31 $query->set( 'orderby', 'meta_value_num' ); 32 } elseif ( $sortset === 'cheaponetime' ) { //1回あたりの料金が安い 33 $query->set( 'meta_query', 34 array( 35 'relation' => 'AND', 36 'feeonetime' => array( 37 'key' => 'feeonetime', 38 ), 39 'fee_blank' => array( 40 'key' => 'feeonetime_blank', 41 'value' => '0', 42 ) 43 ) 44 ); 45 $query->set( 'orderby', 'meta_value_num' ); 46 $query->set( 'order', 'ASC' ); 47 } elseif ( $sortset === 'expensiveonetime' ) { //1回あたりの料金が高い 48 $query->set( 'meta_query', 49 array( 50 'relation' => 'AND', 51 'feeonetime' => array( 52 'key' => 'feeonetime', 53 ), 54 'fee_blank' => array( 55 'key' => 'feeonetime_blank', 56 'value' => '0', 57 ) 58 ) 59 ); 60 $query->set( 'orderby', 'meta_value_num' ); 61 } else { //おすすめ 62 $query->set( 'orderby', 'modified' ); 63 } 64 return; 65} 66add_action( 'pre_get_posts', 'SortArchive' ); 67 68?>

ちなみにarchieveページはpostメソッドで絞り込んでいます。
また、getメソッドで検索結果を返すプログラムを同一PHPに記載しております。
その検索結果と、絞り込みが干渉するため、今回絞り込みをPOSTにしております。

大変恐縮なのですが、ソートをGETメソッドに変更する案ではなく、POSTメソッドのまま、ページングをうまく反映する方法が知りたいです。

また、ページングはプラグインを使用せず、以下のPHPで実行しております。

PHP

1<?php 2/*ページャ*/ 3?> 4<div class="wp-pagenavi"> 5<?php global $wp_rewrite; $paginate_base = get_pagenum_link(1); if(strpos($paginate_base, '?') || ! $wp_rewrite->using_permalinks()){ 6 $paginate_format = ''; 7 $paginate_base = add_query_arg('paged','%#%'); 8} 9else{ 10 $paginate_format = (substr($paginate_base,-1,1) == '/' ? '' : '/') . 11 user_trailingslashit('page/%#%/','paged');; 12 $paginate_base .= '%_%'; 13} 14echo paginate_links(array( 15 'base' => $paginate_base, 16 'format' => $paginate_format, 17 'total' => $wp_query->max_num_pages, 18 'mid_size' => 10, 19 'current' => ($paged ? $paged : 1), 20 'prev_text' => '«', 21 'next_text' => '»', 22)); ?> 23</div>

どこをどのように修正すれば、並べ替えた条件で、ページングの2ページ目が表示されますでしょうか。
お詳しい方、ご教示頂けますと幸いです。

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

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

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

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

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

CHERRY

2019/01/27 14:28

WordPress のページング関数 paginate_links が作成するリンクは GET メソットだったと思いますので、並び替えを POST で行うのであれば、ページング関数も POST に対応したものを自作して置き換える必要があります。 ページングの部分に記載されている paginate_links は、WordPress 標準のものでしょうか? それとも作成されたものでしょうか?
kyrly2

2019/01/27 14:53

解説ありがとうございます。 大変助かります。 paginate_linksはWordPress標準のものです。 >ページング関数も POST に対応したものを自作して置き換える必要があります。 この大枠の手順をご教示頂けますと非常に助かります。 大変恐れ入りますが、どうぞよろしくおねがいします。
CHERRY

2019/01/28 04:45

ちょっとソースを読んだり試す時間がないので、方向性だけですが... > ちなみにarchieveページはpostメソッドで絞り込んでいます。 ということですが、どのように URL を呼び出しているのでしょうか? <form> からの POST ですか? おそらくページングを POST メソッドに変更するのであれば、同じように form を作成して、検索条件とページを hidden で POST することになると思います。
kyrly2

2019/01/28 08:37

>ということですが、どのように URL を呼び出しているのでしょうか? ><form> からの POST ですか? はい。おっしゃる通りです。 >おそらくページングを POST メソッドに変更するのであれば、同じように >form を作成して、検索条件とページを hidden で POST することになる >と思います。 なるほどですね。 POSTで絞り込んだ結果ページの2ページ目以降のURLは今の仕様のまま「?page=2」みたいな表示があっても良いと思ってまして、今、絞り込んだ結果ページで、ボタン2を押すと、絞り込んでない2ページになってしまうところを直したいんですよね〜。POSTで絞り込んだ条件を継続したまま、2ページ目に遷移させるやり方が、全く検討がついていないです。 新米エンジニアなもので、もしお知恵があれば、共有頂けますと嬉しいです。
guest

回答1

0

ベストアンサー

ちょっとだけテストしてみました。

Postman を使って、POST メソッドでのページネーションを試してみましたが、単純に POST するだけではページネーションできないようです。(毎回1ページ目が表示されます。)

WordPress のソースコードを追いかけていないので推測になりますが、URL に /page/xx を指定するとそのページを表示したので、おそらくパーマリンクの処理している部分で URL を分解してページを取得していると思われます。


WordPress が、URL でページングしていると仮定して、下記のような感じで JavaScript で POST するとページネーションはどうなるでしょうか? 
フォームの部分などは、環境に合わせて調整してください。(テスト用なので、ページ番号とかベタ書きですが...)

HTML

1<div class="wp-pagenavi"> 2 3 <script type="text/javascript"> 4 function clickPaginationLink(page) { 5 var fm = document.forms["pagination"]; 6 var act = fm.action; 7 fm.action = act + "page/" + page + "/"; 8 fm.method = "POST"; 9 fm.submit(); 10 return true; 11 } 12 </script> 13 14 <form name="pagination" action="<?php echo get_pagenum_link(1) ?>" method="post"> 15 <input type="hidden" name="sort" value="<?php echo filter_input(INPUT_POST, 'sort'); ?>"> 16 </form> 17 18 <ul class="pagination"> 19 <li><a onclick="clickPaginationLink('1');">1</a></li> 20 <li><a onclick="clickPaginationLink('2');">2</a></li> 21 <li><a onclick="clickPaginationLink('3');">3</a></li> 22 </ul> 23 24</div>

投稿2019/01/29 07:08

CHERRY

総合スコア25171

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

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

kyrly2

2019/02/03 00:42

ご返信遅くなり大変恐縮です。 コードありがとうございます! 実装してみましたが、頂いたコードで実装でき、正しく動きました! お力添え、本当にありがとうございます! ちなみに、 >テスト用なので、ページ番号とかベタ書きですが... こちらの実装に手間取っているのですが、どのように書けばよろしいでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問