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

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

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

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

PHP

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

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

1回答

10646閲覧

WordPressの絞り込み検索結果画面でページネーションを実装したい

noki0905

総合スコア12

WordPress

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

PHP

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

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2020/02/06 15:47

前提・実現したいこと

WordPressでポータルサイトを作成しています。
フリーワード検索と絞り込み検索の結果画面をsearch.phpで共通にしています。(トップページからフリーワード検索と絞り込みどちらも可能)

検索結果画面でページネーションを実装したいのですがどうにもうまく機能しません。

発生している問題・エラーメッセージ

現在のページネーションの機能状況は状況は以下の通りです。

フリーワード検索:空で検索 => 次のページに進むと404
リンク => http://localhost:8888/wordpress/page/2/?s

フリーワード検索:なにかワードを入れて検索 => 正常
リンク => http://localhost:8888/wordpress/page/2/?s=%E6%9D%B1%E4%BA%AC

絞り込み検索:すべての絞り込み条件 => 次のページに進むと404
リンク => http://localhost:8888/wordpress/page/2/?area=tokyo&s#038;s
(このパターンではリンクの文字列が一部コードに変わってます)

他のページでもページネーションを取得するコードは同様で、別のカスタム投稿タイプでも正常に機能しています。

該当のソースコード

search.php

PHP

1<div class="c-wrapper"> 2 3 <div> 4 <h3><i class="fas fa-search"></i>さらに条件を絞り込んで検索</h3> 5 <form action="<?php echo esc_url( home_url( '/' ) ); ?>" method="GET" class="p-accordion-menu__list p-search-accordion__list"> 6 <table> 7 <tr> 8 <th>エリア検索</th> 9 <td> 10 <div> 11 <select name="area" id=""> 12 <option disabled selected>エリアを選択してください</option> 13 14 <?php 15 $taxonomy_name = 'area'; 16 $taxonomies = get_terms($taxonomy_name); 17 if(!is_wp_error($taxonomies) && count($taxonomies)): 18 foreach($taxonomies as $taxonomy): 19 $tax_posts = get_posts(array('post_type' => 'company', 'taxonomy' => $taxonomy_name, 'term' => $taxonomy->slug ) ); 20 if($tax_posts): 21 ?> 22 <option value="<?php echo $taxonomy->slug; ?>"><?php echo $taxonomy->name; ?></option> 23 <?php 24 endif; 25 endforeach; 26 endif; 27 ?> 28 29 </select> 30 </div> 31 </td> 32 </tr> 33//その他にもいくつか条件がありますが、だいたい同じです。 34 <tr> 35 <th>条件1<span"></span></th> 36 <td> 37 <ul> 38 <li><label for="checkbox-1"><input id="checkbox-1" type="checkbox" name="point[]" value="roof"><span></span>屋根</label></li> 39 <li><label for="checkbox-2"><input id="checkbox-2" type="checkbox" name="point[]" value="tile"><span></span>瓦屋根</label></li> 40 <li><label for="checkbox-3"><input id="checkbox-3" type="checkbox" name="point[]" value="rain"><span></span>雨樋</label></li> 41 </ul> 42 </td> 43 </tr> 44 </table> 45 </ul> 46 </td> 47 </tr> 48 <tr> 49 <th>特徴<span></span></th> 50 <td> 51 <ul> 52 <?php 53 $taxonomy_name = 'feature'; 54 $taxonomies = get_terms($taxonomy_name); 55 if(!is_wp_error($taxonomies) && count($taxonomies)): 56 foreach($taxonomies as $taxonomy): 57 $tax_posts = get_posts(array('post_type' => 'company', 'taxonomy' => $taxonomy_name, 'term' => $taxonomy->slug ) ); 58 if($tax_posts): 59 ?> 60 <li><label for="<?php echo $taxonomy->slug; ?>"><input id="<?php echo $taxonomy->slug; ?>" type="checkbox" name="feature[]" value="<?php echo $taxonomy->slug; ?>"><span></span><?php echo $taxonomy->name; ?></label></li> 61 <?php 62 endif; 63 endforeach; 64 endif; 65 ?> 66 </ul> 67 </td> 68 </tr> 69 </table> 70 <div> 71 <input type="hidden" name="s" id="s" placeholder="検索" class="u-dn"> 72 <input type="submit" value="この条件で検索"> 73 </div> 74 </form> 75 </div> 76 </div> 77 78//ここからループ生成 79<section class="se-list"> 80 <div class="c-wrapper"> 81<?php 82$s = $_GET['s']; 83$area = $_GET['area']; 84$point = $_GET['point']; 85$feature = $_GET['feature']; 86$paged = get_query_var('paged') ? get_query_var('paged') : 1 ; 87?> 88<?php if($s) : ?> //フリーワード検索で文字列があった場合 89<?php 90$the_query = new WP_Query( array( 91 'post_type' => 'company', 92 'posts_per_page' => 5, 93 'paged' => $paged, 94 's' => $s, 95 ) 96); 97?> 98<?php else : ?> 99 100//絞り込み検索で条件の指定があった場合 101<?php 102 103if($area){ 104 $taxquery[] = array( 105 'relation' => 'OR', 106 array ( 107 'taxonomy'=>'area', 108 'terms'=> $area, 109 'include_children'=>true, 110 'field'=>'slug', 111 ), 112 array ( 113 'taxonomy'=>'area', 114 'terms'=> "alljapan", 115 'include_children'=>true, 116 'field'=>'slug', 117 ) 118 ); 119} 120 121if($feature){ 122 $taxquery[] = array( 123 'taxonomy'=>'feature', 124 'terms'=> $feature, 125 'include_children'=>false, 126 'field'=>'slug', 127 'operator'=>'AND' 128 ); 129} 130 131$taxquery['relation'] = 'AND'; 132 133if( $point ){ 134 foreach($point as $val){ 135 $metaquery[] = array( 136 'key'=>'point', 137 'value'=> $val, 138 'compare'=>'LIKE', 139 ); 140 } 141} 142 143$metaquery['relation'] = 'AND'; 144 145$the_query = new WP_Query( array( 146 'post_type' => 'company', 147 'posts_per_page' => 2, 148 'paged' => $paged, 149 'tax_query' => $taxquery, 150 'meta_query' => $metaquery, 151 ) 152); 153?> 154 155<?php endif; ?> 156 157<?php if ( $the_query->have_posts() ) : ?> 158 159 <p><?php echo $the_query->post_count; ?><span><?php echo $the_query->found_posts; ?></span></p> 160 161<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?> 162 163//コンテンツの表示 164 165<?php endwhile; ?> 166<?php 167$GLOBALS['wp_query']->max_num_pages = $the_query->max_num_pages; 168$max_num_pages = $the_query->max_num_pages; 169$big = 999999999; 170if ($the_query->max_num_pages > 1) { 171echo paginate_links( array( 172 'type' => 'list', 173 'mid_size' => '5', 174 'prev_text' => '<i class="fas fa-chevron-left"></i>', 175 'next_text' => '<i class="fas fa-chevron-right"></i>', 176 // 'base' => get_pagenum_link(1) . '%_%', 177 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 178 'format' => '?paged=%#%', 179 'current' => max(1, $paged), 180 'total' => $max_num_pages 181) );} 182?> 183<?php pagination( $the_query->max_num_pages, $paged ); ?> 184 185<?php else:?> 186 187 <div>該当する業者がありません。</div> 188 189<?php endif; wp_reset_postdata(); ?> 190 191 192 </div><!-- .c-wrapper --> 193</section>

ページネーションに該当しそうな部分のみ抜粋
function.php

PHP

1/*****************************************************************************************/ 2// 検索する投稿タイプを業者のみに指定 3function SearchFilter($query) { 4 if ($query->is_search) { 5 $query->set('post_type', 'company'); 6 } 7return $query; 8} 9add_filter('pre_get_posts','SearchFilter'); 10/*****************************************************************************************/ 11 12 13// /**ページネイション数**/ 14add_action('pre_get_posts','my_pre_get_posts'); 15function my_pre_get_posts( $query ) { 16if ( !is_admin() && $query->is_main_query() ) { 17 if ( $query->is_post_type_archive('example') ) { 18 $query->set( 'posts_per_page', 3 ); 19 } 20 else if( $query->is_post_type_archive('company') ) { 21 $query->set( 'posts_per_page', 5 ); 22 } 23} 24} 25// /*ページネイションurlリダイレクト*/ 26add_filter('redirect_canonical','my_disable_redirect_canonical'); 27function my_disable_redirect_canonical( $redirect_url ) { 28 29 if ( is_archive() ){ 30 $subject = $redirect_url; 31 $pattern = '//page//'; // URLに「/page/」があるかチェック 32 preg_match($pattern, $subject, $matches); 33 34 if ($matches){ 35 //リクエストURLに「/page/」があれば、リダイレクトしない。 36 $redirect_url = false; 37 return $redirect_url; 38 } 39 } 40}

試したこと

  • こちらの記事を参考にfunctionでもやってみました。

https://wemo.tech/978
その他にもいくつかブログなどをみて試しましたが、どれも結果は同様です。

  • リンクが崩れている箇所を直してみたり、直に打ち込んでみても結果は同じでした。

  • Wp-Queryではなく、query_postsでループ処理するパターンも試しましたが結果変わらずです。

状況説明で足りない箇所がありましたらご指摘いただけると助かります。

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

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

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

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

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

guest

回答1

0

自己解決

絞り込み検索結果表示のWP_queryを生成する際に、Sが空っぽのため、Sをqueryに含めていませんでした。
Sをからの状態で含めると検索に何も引っかからなくなっていまうためです。

しかし、Sを指定することによってページネーションが機能したので(検索結果として認識されるから?)、
ACFで検索用の文字列を設けて確実にその投稿に'search'の文字列が含まれるようにし、Sを'search'で指定することとしました。

あまりスマートな方法ではないですがとりあえず解決です。

投稿2020/03/05 15:54

noki0905

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問