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

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

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

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

1回答

6054閲覧

ワードプレス Search.phpのページャーを正常に動作させたい

happyturn

総合スコア12

WordPress

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2016/11/16 17:43

編集2022/01/12 10:55

###前提・実現したいこと
search.phpにおいて、ページャーを正常に動作させたい。

###発生している問題・エラーメッセージ
当初、search.phpの2ページ目以降がどうしても表示されませんでした。
ページャーの2ページ目をクリックすると、
「**http://hogehoge/page/2/?s=検索語句**」
のURLに飛び、
どうしてもNOTFOUNDになり困り果てていました。

そこでいろいろと調べて、調整したところ、
「**http://hogehoge/?s=検索語句&page=2**」
というように飛ぶ先のURLを変更させることで、NOTFOUNDにはならず、ちゃんと検索結果が表示されるようになりました。

しかし、解決したかに見えたのですが、そこからはまることになりました。
よく見ると、2ページ目以降の全てのページがどういうわけか1ページ目と同じ内容が表示されるようになりました

何か初歩的なミスをしているのか、どこがどう間違っているのか、かれこれ数日悩んでおり完全にお手上げ状態です。
検索に関しては県名、地域、詳細地域というようにカスタムフィールドで三点設定(region0,region1,region2)されており、地図上からクリックをして該当地域に所属する人物を検索結果として表示させるという物です。

###該当のソースコード
▼▼ご回答を頂いて自分なりに修正しました。 どこかがまだ間違っているようです。 いろいろと試しましたがもうさっぱり見当もつきません。 全文を掲載しておきます。▼▼
search.phpの全文修正後

<?php get_header(); ?> <div id="content"> <div class="siteWrapp cf"> <div class="mainCon cf"> <section> <div class="dietMembers-list"> <div class="cf"> <h3><?php echo $key ?>の検索結果一覧</h3> <?php if ( have_posts() ) : while (have_posts()) : the_post(); ?> <article> <div class="list-block cf"> <div class="left-box thumbnail-box"> <a class="thumbnail-a" href="<?php the_permalink(); ?>"><?php the_post_thumbnail(array(150,)); ?></a> </div> <div class="right-box"> <dl> <dt>所属</dt> <dd class="party-name"><?php the_category(); ?></dd> <dd><?php the_tags('','',''); ?></dd> <dd class="region"><?php echo post_custom('region1'); echo post_custom('region2'); ?></dd> </dl> <p class="name"><a href="<?php the_permalink(); ?>"><?php echo post_custom('name'); ?></a></p> <div class="link-box"> <?php $cat_slug = get_the_category(); $cat_slug = $cat_slug[0]; ?> <p><a href="<?php echo get_home_url(),"/",$cat_slug->category_nicename ?>">>地域詳細を見る</a></p> <p><a href="<?php the_permalink(); ?>">>プロフィールを見る</a></p> </div> </div> </div> </article> <?php endwhile; ?> <div class="s-page-nav cf"> <?php $big = 999999999; echo paginate_links( array( 'base' => 'http://hogehoge/?s=' . $key . '%_%', 'format' => '&page=%#%', 'current' => max( 0, get_query_var('page') ), 'total' => $the_query->max_num_pages, 'end_size' => 5, 'type' => 'list', 'show_all' => 'false' ) ); wp_reset_postdata(); ?> </div> <?php else : ?> <p class="notfound">該当者がいません。</p> <?php endif; ?> </div> </div> </section> </div> <?php get_sidebar(); ?> </div> </div> <?php get_footer(); ?>

function.phpの全文修正後

<?php function change_posts_per_page($query) { /* 管理画面,メインクエリに干渉しないために必須 */ if( is_admin() || ! $query->is_main_query() ){ return; } if ( $query->is_search() ) { $query->set( 'post_type','post' ); $query->set( 'paged',get_query_var( 'paged' ) ); $key = $query->get('s'); $taxquery = array( array( 'key' => 'region0', 'value' => $key, 'compare' => '=', 'type' => 'CHAR'), array( 'key' => 'region1', 'value' => $key, 'compare' => '=', 'type' => 'CHAR'), array( 'key' => 'region2', 'value' => $key, 'compare' => '=', 'type' => 'CHAR'), 'relation'=>'or' ); $query->set( 'tax_query' , $taxquery ); return; } } add_action( 'pre_get_posts', 'change_posts_per_page' ); // アイキャッチ画像を有効にする。 add_theme_support('post-thumbnails'); if (function_exists('add_theme_support')) { add_theme_support('post-thumbnails'); add_image_size( 'pc_single_thumbnails', 800, 500, true ); add_image_size( 'pc_list_thumbnails', 608, 380, true ); add_image_size( 'main_thumbnails', 480, 300, true ); add_image_size( 'mobile_list_thumbnails', 240, 180, true ); } //ここからポピュラーポストのカスタマイズ設定 function my_custom_single_popular_post( $post_html, $p, $instance ){ $thumbnail_id = get_post_thumbnail_id( $p->id); $thumbnail_img = wp_get_attachment_image_src( $thumbnail_id, 'main_thumbnails' ); $post_cat=get_the_category( $p->id); $cat_id=$post_cat[0]->cat_ID; $cat_name=$post_cat[0]->cat_name; $cat = get_the_category(); $cat = $cat[0]; $cat_slug = $post_cat[0]->category_nicename; $post_tag=get_the_tags( $p->id); $tag_id=$post_tag[0]->name; $custom_name = get_post_meta($p->id, 'name', true); $custom_region1 = get_post_meta($p->id, 'region1', true); $custom_region2 = get_post_meta($p->id, 'region2', true); $custom_id= $p->id; //$excerpt = get_post_field( post_content, $p->id, display ); $output = ' <article> <div class="list-block cf"> <div class="left-box thumbnail-box"> <a class="thumbnail-a" href="' . get_the_permalink($p->id) . '"><img src="' . $thumbnail_img[0] . '" title="' . esc_attr($p->title) . '" class="rank_thumbnail" width="150" alt="thumbnail"> </a> </div> <div class="right-box"> <dl> <dt>所属</dt> <dd class="party-name"><a href="' . get_category_link( $cat_id ) . '">' . $cat_name . '</a></dd> <dd>' . $tag_id . '</dd> <dd class="region">'. $custom_region1 .''. $custom_region2 .'</dd> </dl> <p class="name"><a href="' . get_the_permalink($p->id) . '">'. $custom_name .'</a></p> <div class="link-box"> <p><a href="' . get_home_url() . '/' . $cat_slug . '">&gt;地域詳細を見る</a></p> <p><a href="' . get_the_permalink($p->id) . '">&gt;プロフィールを見る</a></p> </div> </div> </div> </article> '; return $output; } add_filter( 'wpp_post', 'my_custom_single_popular_post', 10, 3 ); add_filter('redirect_canonical','my_disable_redirect_canonical'); function my_disable_redirect_canonical( $redirect_url ) { if ( is_search() ) $redirect_url = false; return $redirect_url; } ?>

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

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

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

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

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

guest

回答1

0

WP_Query を多数使われていますが、search.php が呼ばれた段階ですでに検索は実行されています。検索条件を増やしたいなどであれば、pre_get_posts で制御されることをお勧めします。

【[Wordpress]pre_get_postsを使いこなす!pre_get_posts使い方まとめ | EMiAC-Works】
http://emiac-works.com/coding/pre-get-posts-code-snipet/

【pre_get_postsでメインクエリを制御する | Tips Note by TAM】
http://www.tam-tam.co.jp/tipsnote/cms/post9420.html

投稿2016/11/16 17:58

kei344

総合スコア69364

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

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

happyturn

2016/11/20 07:44

早速のご回答いただきまして、誠にありがとうございます。 そうだったんですね。 一度こちらの方法を試してみます。
happyturn

2016/11/20 09:53

全く動く気配がありません……。 使い方が間違っているのでしょうか。 pre_get_postsはfunction.phpに書き込むんですよね。 下記、試しにfunction.phpに書き込んでみました。 ``` function change_posts_per_page($query) { /* 管理画面,メインクエリに干渉しないために必須 */ if( is_admin() || ! $query->is_main_query() ){ $query->set( 'posts_per_page', '4' ); return; } if ( $query->is_search() ) { $query->set( 'posts_per_page', '4' ); $query->set( 'post_type','post' ); $query->set( 'paged',get_query_var( 'paged' ) ); $searchResults = new WP_Query("s=$s & showposts=-1"); $key = wp_specialchars($s, 1); $taxquery = array( array( 'key' => 'region0', 'value' => $key, 'compare' => '=', 'type' => 'CHAR'), array( 'key' => 'region1', 'value' => $key, 'compare' => '=', 'type' => 'CHAR'), array( 'key' => 'region2', 'value' => $key, 'compare' => '=', 'type' => 'CHAR'), 'relation'=>'or' ); $query->set( 'tax_query' , $taxquery ); return; } } ``` これを書き込んでみたのですが、serach.phpで出力して持ってくる方法もいまいちわかりません。 そもそもfunction.phpに書き込んでみたもの、$queryの中身はNULLになっているようです。 また検索結果数も試しに4つになるように書いてみたものの反映されていないようです。
kei344

2016/11/20 10:09

2点、気づいたことを。 1. add_action( 'pre_get_posts', 'change_posts_per_page' ); が書かれていません  ※ change_posts_per_pageの外側です。 2. new WP_Query("s=$s & showposts=-1"); 検索文字列を取得したいがためにもう一度クエリを飛ばすのはちょっと。   $query->get('s'); で採れませんか?
happyturn

2016/11/20 11:11

ありがとうございます。 すみません…、やってみましたが、やはり動かないようです。 検索結果も検索条件とまるで違うものが表示されるようになったため、どこか私のやり方がまずくて、別のところが根本的に間違っているのだと思います。 上記「該当のソースコード」にて修正後のソースコードに変更致しました。 色々といじってはいるものの、ほぼ私ではお手上げ状態ですので、ご指導頂けたら幸いでございます。
kei344

2016/11/20 12:55

カスタムフィールドから検索するのですよね? $query->set( 'tax_query' , $taxquery );ではなく $query->set( 'meta_query' , $taxquery );では? 【pre_get_postsフックでmeta_queryを変える方法 - Daily GLOCALISM】 http://daily.glocalism.jp/memo/modifying-meta_query-using-pre_get_posts/ 下記2つは不要です。 $query->set( 'post_type','post' ); $query->set( 'paged',get_query_var( 'paged' ) ); $key = $query->get('s');の値がきちんと取れているかを var_dump($key);とかして試してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問