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

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

ただいまの
回答率

90.48%

  • WordPress

    7448questions

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

WordPressの検索ページのページネーションの3ページ目で404が表示される

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,775

kefi3104

score 26

WordPress初心者です。

カスタム投稿タイプで登録したお店の検索機能を作っているのですが、どうしても3ページ目で404が出てしまいます。
3ページ目で404が出る事例がなかなか見つからず、困っております。

サンプルを切り貼りしているため、どこか間違っているのかもしれませんので、ご指定いただけますと幸いですm(_ _)m

<?php
            $city = get_post(get_the_ID())->area_city;
            global $wpdb;
            // If you use a custom search form
            // $keyword = sanitize_text_field( $_POST['keyword'] );
            // If you use default WordPress search form
            $keyword = get_search_query();
            $keyword = '%' . $wpdb->esc_like( $keyword ) . '%'; // Thanks Manny Fleurmond
            // Search in all custom fields
            $post_ids_meta = $wpdb->get_col( $wpdb->prepare( "
    SELECT DISTINCT post_id FROM {$wpdb->postmeta}
    WHERE meta_value LIKE '%s'
", $keyword ) );
            // Search in post_title and post_content
            $post_ids_post = $wpdb->get_col( $wpdb->prepare( "
    SELECT DISTINCT ID FROM {$wpdb->posts}
    WHERE post_title LIKE '%s'
    OR post_content LIKE '%s'
", $keyword, $keyword ) );
//            $post_ids = $post_ids_meta;
            $post_ids = array_merge( $post_ids_meta, $post_ids_post );

            $args = Array(
                'post_type' => 'shop',
                'posts_per_page'  => 10,
                'paged' => $paged,
                'post__in'    => $post_ids
            );

            $temp = $wp_query;
            $wp_query = null;
            if(!empty($post_ids)) {
                $wp_query = new WP_Query($args);
            }
            else {
                $wp_query = new WP_Query();
            }
            //検索件数
//            global $wp_query;
            $total_results = $wp_query->found_posts;
            ?>

            <article class="search-result">
                <header class="article-header">
                    <h1 class="page-title" itemprop="headline">
                        <?php
                        if($total_results > 0) {
                            echo $total_results . '件のお店が見つかりました';
                        }
                        else {
                            echo 'お店が見つかりませんでした';
                        }

                        ?>
                    </h1>
                </header> <?php // end article header ?>
                <section class="entry-content cf" itemprop="articleBody">


                    <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
                    <article id="post-<?php the_ID(); ?>" <?php post_class( 'cf' ); ?> role="article" itemscope itemtype="http://schema.org/BlogPosting">
                        <section class="entry-content cf" itemprop="articleBody">
                            <article class="shop-info">
                                <header>
                                    <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
                                </header>
                                <section>
                                    <ul>
                                        <li>
                                            <dl>
                                                <dt><strong>店舗名</strong></dt>
                                                <dd><?php echo get_post_meta($post->ID, 'shop_name', true); ?></dd>
                                            </dl>
                                        </li>
                                        <li>
                                            <dl>
                                                <dt><strong>住所</strong></dt>
                                                <dd><?php echo get_post_meta($post->ID, 'shop_address', true); ?></dd>
                                            </dl>
                                        </li>
                                        <li>
                                            <dl>
                                                <dt><strong>電話番号</strong></dt>
                                                <dd><?php echo get_post_meta($post->ID, 'shop_tel', true); ?></dd>
                                            </dl>
                                        </li>
                                        <li>
                                            <dl>
                                                <dt><strong>営業時間</strong></dt>
                                                <dd><?php echo get_post_meta($post->ID, 'shop_time', true); ?></dd>
                                            </dl>
                                            <dl>
                                                <dt><strong>定休日</strong></dt>
                                                <dd><?php echo get_post_meta($post->ID, 'shop_holiday', true); ?></dd>
                                            </dl>
                                        </li>
                                        <li>
                                            <dl>
                                                <dt><strong>ホームページ</strong></dt>
                                                <dd><a href="<?php echo get_post_meta($post->ID, 'shop_url', true); ?>"><?php echo get_post_meta($post->ID, 'shop_url', true); ?></a></dd>
                                            </dl>
                                        </li>
                                    </ul>
                                </section>
                            </article>



                            </section> <?php // end article section ?>

                            <!--                    <footer class="article-footer cf">-->
                            <!--                    </footer>-->

<!--                            --><?php //comments_template(); ?>
                        </article>


                    <?php endwhile;?>
                        <nav class="pagenav">
                            <span><?php previous_posts_link(); ?></span>
                            <span><?php next_posts_link(); ?></span>
                        </nav>
                    <?php else: ?>
                        <article>
                            <p>検索キーワードを変更してやり直してください。</p>
                            <?php get_search_form(); ?>
                        </article>

                    <?php endif; ?>
                    <?php $wp_query = null; $wp_query = $temp; ?>

                </section>
            </article>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

check解決した方法

+1

自己解決しました。
以下のサイトが参考になりました。
http://miraikogeisya.com/archives/373/

もう一つの方法は、ダッシュボード設定→表示設定で
「1ページに表示する最大投稿数」を1にして
‘posts_per_page’で表示件数を設定する方法です。
これも意外に解決する場合が多いです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

提示のコードが書かれているのは search.php でしょうか。とりあえずページングのための書き換えなどが無いように見えます。
WordPressの検索ページはもう少し簡単にカスタム投稿タイプのみを検索する事が出来ます。
検索フォーム部分で、下記のような項目を挿入します。

<input type="hidden" name="post_type" value="shop">

詳しくは参考(になりそうな)URLをご覧ください。

【検索フォームと検索結果ページを複数設置する | フロントエンドエンジニアのblog | 有限会社Willさんいん】
http://www.will3in.co.jp/blog/article/multiple-search-form/

【絞り込み検索をプラグインを使わずに実装[WordPress]】
http://kotori-blog.com/wordpress/refinement_search/#refinement2_3

【Wordpressで特定のカスタム投稿内だけ検索する検索フォーム】
http://webmateria.co.jp/wordpress-custom-search/


追記:

通常の検索動作でカスタムフィールドを検索する事はできるのでしょうか?

【カスタムフィールドをサイト内検索の対象にする「Search Everything」[WordPress]】
http://kotori-blog.com/wordpress/searcheverything/

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/04 20:25

    ご回答頂きましてありがとうございます。
    また、カスタイム投稿タイプの検索の記述を簡単にする方法を教えていただきましてありがとうございます。

    おっしゃるとおり、search.phpの記述です。

    本題のページングについてですが、ページングのための書き換えとは、他に何があるのでしょうか?
    $pagedでページ数を渡していたり、next_posts_link()などでページ切り替えができるようにしているのですが、他に記述が必要なものがあるのでしょうか?

    キャンセル

  • 2016/05/05 03:42

    > 他に記述が必要なものがあるのでしょうか?
    そもそも search.php のテンプレートが呼ばれる前の段階で、通常の検索動作は終わっています。書かれているコードは一度検索が行われ、その結果を表示するテンプレート上で新たに WP_Query で検索している状態です。そのため、search.php を改造しない状態での通常の検索で 3 ページ目が 0 件しか無い場合 404 になります。
    現在のコードをこのままがんばることは、あまりお勧めしません。

    キャンセル

  • 2016/05/06 10:16

    WorsPressの検索機能の仕様を十分に理解できておらず、申し訳ありません。

    本題は上記の通り解決しましたが、search.phpは改善の余地があるみたいですね。

    カスタムフィールドの検索を行おうとして上記のコードに行き着いているのですが、通常の検索動作でカスタムフィールドを検索する事はできるのでしょうか?

    キャンセル

  • 2016/05/06 14:26 編集

    追記しました。プラグインで解決するのが手早いです。

    キャンセル

  • 2016/05/06 15:48

    ありがとうございます。一旦解決済みとしました。

    キャンセル

関連した質問

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

  • WordPress

    7448questions

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