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

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

ただいまの
回答率

90.51%

  • PHP

    23978questions

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

  • HTML

    11446questions

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

  • WordPress

    8914questions

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

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,343

happyturn

score 4

前提・実現したいこと

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;
}

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

+2

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/20 16:44

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

    キャンセル

  • 2016/11/20 18: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つになるように書いてみたものの反映されていないようです。

    キャンセル

  • 2016/11/20 19: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'); で採れませんか?

    キャンセル

  • 2016/11/20 20:11

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

    キャンセル

  • 2016/11/20 21: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);とかして試してみてください。

    キャンセル

同じタグがついた質問を見る

  • PHP

    23978questions

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

  • HTML

    11446questions

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

  • WordPress

    8914questions

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