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

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

ただいまの
回答率

89.10%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 895

kyrly2

score 14

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

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

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

function SortArchive( $query ) {
        $sortset = (string)filter_input(INPUT_POST, 'sort') ;
        if ( $sortset === 'cheap' ) { //コース料金が安い
            $query->set( 'meta_query',
              array(
                'relation' => 'AND',
                'fee' => array(
                  'key' => 'fee',
                ),
                'fee_blank' => array(
                  'key' => 'fee_blank',
                  'value' => '0',
                )
              )
            );
            $query->set( 'orderby', 'meta_value_num' );
            $query->set( 'order', 'ASC' );
        } elseif ( $sortset === 'expensive' ) { //コース料金が高い
            $query->set( 'meta_query',
              array(
                'relation' => 'AND',
                'fee' => array(
                  'key' => 'fee',
                ),
                'fee_blank' => array(
                  'key' => 'fee_blank',
                  'value' => '0',
                )
              )
            );
            $query->set( 'orderby', 'meta_value_num' );
        } elseif ( $sortset === 'cheaponetime' ) { //1回あたりの料金が安い
            $query->set( 'meta_query',
              array(
                'relation' => 'AND',
                'feeonetime' => array(
                  'key' => 'feeonetime',
                ),
                'fee_blank' => array(
                  'key' => 'feeonetime_blank',
                  'value' => '0',
                )
              )
            );
            $query->set( 'orderby', 'meta_value_num' );
            $query->set( 'order', 'ASC' );
        } elseif ( $sortset === 'expensiveonetime' ) { //1回あたりの料金が高い
            $query->set( 'meta_query',
              array(
                'relation' => 'AND',
                'feeonetime' => array(
                  'key' => 'feeonetime',
                ),
                'fee_blank' => array(
                  'key' => 'feeonetime_blank',
                  'value' => '0',
                )
              )
            );
            $query->set( 'orderby', 'meta_value_num' );
        } else { //おすすめ
            $query->set( 'orderby', 'modified' );
        }
        return;
}
add_action( 'pre_get_posts', 'SortArchive' );

?>

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

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

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

<?php
/*ページャ*/
?>
<div class="wp-pagenavi">
<?php global $wp_rewrite; $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' => $wp_query->max_num_pages,
    'mid_size' => 10,
    'current' => ($paged ? $paged : 1),
    'prev_text' => '«',
    'next_text' => '»',
)); ?>
</div>

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • CHERRY

    2019/01/27 23:28

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

    キャンセル

  • kyrly2

    2019/01/27 23:53

    解説ありがとうございます。
    大変助かります。
    paginate_linksはWordPress標準のものです。

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

    キャンセル

  • CHERRY

    2019/01/28 13:45

    ちょっとソースを読んだり試す時間がないので、方向性だけですが...

    > ちなみにarchieveページはpostメソッドで絞り込んでいます。

    ということですが、どのように URL を呼び出しているのでしょうか?
    <form> からの POST ですか?

    おそらくページングを POST メソッドに変更するのであれば、同じように form を作成して、検索条件とページを hidden で POST することになると思います。

    キャンセル

  • kyrly2

    2019/01/28 17:37

    >ということですが、どのように URL を呼び出しているのでしょうか?
    ><form> からの POST ですか?
    はい。おっしゃる通りです。

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

    キャンセル

回答 1

checkベストアンサー

0

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

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

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


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

<div class="wp-pagenavi">

    <script type="text/javascript">
        function clickPaginationLink(page) {
            var fm = document.forms["pagination"];
            var act = fm.action;
            fm.action = act + "page/" + page + "/";
            fm.method = "POST";
            fm.submit();
            return true;
        }
    </script>

    <form name="pagination" action="<?php echo get_pagenum_link(1) ?>" method="post">
        <input type="hidden" name="sort" value="<?php echo filter_input(INPUT_POST, 'sort'); ?>">
    </form>

    <ul class="pagination">
    <li><a onclick="clickPaginationLink('1');">1</a></li>
    <li><a onclick="clickPaginationLink('2');">2</a></li>
    <li><a onclick="clickPaginationLink('3');">3</a></li>
    </ul>

</div>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/03 09:42

    ご返信遅くなり大変恐縮です。
    コードありがとうございます!
    実装してみましたが、頂いたコードで実装でき、正しく動きました!

    お力添え、本当にありがとうございます!

    ちなみに、
    >テスト用なので、ページ番号とかベタ書きですが...
    こちらの実装に手間取っているのですが、どのように書けばよろしいでしょうか。

    キャンセル

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

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • PHPに関する質問
  • wordpressでアーカイブページでソートした場合にページングの2ページ目にソート条件が反映されない