サポート » 使い方全般 » サイト内検索で記事がヒットしない

  • 解決済 m0810

    (@m0810)


    現在WordPress 4.9.5で制作を行っております。

    ウィジェットの「検索」を埋め込み、search.php(検索結果)を作成したのですが
    タイトルや本文に入っている文字で検索をしても、記事は見つかりませんという結果になってしまいます。

    同じソースで、以前のサイトも制作をしてそちらは問題なく動作しているので困っています。

    Wordpressの初めの記事、「Hello…」は検索で見つかるのですが、その後作成した記事がまったく
    ヒットしません。プラグインの「WP Multibyte Patch」を停止しても同じでした。

    よろしければ、解決方法を教えてください。

    ヘルプの必要なページ: [リンクを見るにはログイン]

14件の返信を表示中 - 1 - 14件目 (全14件中)
  • モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    サイトを拝見しました。中身のソースコードがわからないのでまったく推測になりますが、

    • サイト内検索を無効化するようなプラグイン、もしくはテーマ内functions.phpなどに設定の記述がある
    • 検索結果を表示するためのテンプレート(search.php等)がおかしい
    • データベース上のデータの持ち方がおかしい

    などがあり得るかな…と思います。

    運用中のサイトなので難しいかもしれませんが、表から眺めていても分かりませんので、アクセスの少なそうな時間帯にメンテナンス中にして、テーマをTwenty Seventeenに変えてサイト内検索結果がどうなるかをチェックしてみてください。
    検索フォームが画面上に表示されていない場合は、
    (あなたのサイトのURL)/?s=体験

    という感じで直接URLを打ち込んでも検索結果を確認できます。s= の後のワードはサイト内で使っていそうな単語を入れてください。

    その結果を見ながら、どのあたりに原因がありそうか切り分けていき、関係ありそうな部分の記述や、動いているプラグインの情報などをご提供いただいて検討していくことになりそうです。

    ※最初の”Hello”は大丈夫だったとのことで、もしかしたら、マルチバイト文字がダメなのかな?と思って’jr’とかで検索してみましたがダメでしたね。検索ワードに関わらず検索結果自体が生きてない感じでした。
    プラグインの「WP Multibyte Patch」は有効に戻しておいてください。

    モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    補足です。

    もしかして、デフォルトの投稿や固定ページではなく「カスタム投稿タイプ」を使ってサイトを構築している場合は、パラメータ exclude_from_search の値がfalseになっていると検索結果に出てきません。
    そのあたりも確認してみてください。

    トピック投稿者 m0810

    (@m0810)

    回答ありがとうございます。

    環境について追記します。
    ■サーバー:GMOクラウド(レギュラー)
    ■Wordpressバージョン:4.9.5
    ■使用プラグイン:
    ・Advanced Custom Fields
    ・Google XML Sitemaps
    ・Imsanity
    ・WP Multibyte Patch
    ・WP-PageNavi

    ◎カスタム投稿を2つ作成しました。(合計3つの投稿を現在は使用中)
    ◎「searchform.php」を自作
     ———————————-
    <form method=”get” action=”<?php echo home_url(‘/’); ?>” >
    <input name=”s” type=”text”>
     ———————————-
    ◎「search.php」を作成
    ————————————
    <?php $allsearch =& new WP_Query(“s=$s&posts_per_page=-1”);
    $key = wp_specialchars($s, 1);
    $count = $allsearch->post_count;
    if($count!=0){
    // 検索結果を表示:該当記事あり
    echo ‘<p>“‘.$key.’”で検索した結果、‘.$count.’件の記事が見つかりました</p>’;
    }
    else {
    // 検索結果を表示:該当記事なし
    echo ‘<p>“‘.$key.’”で検索した結果、関連する記事は見つかりませんでした</p>’;
    }
    ?>
    ————————————

    自分で確認した部分では、Wordpress管理画面上の投稿一覧の検索(右上)でも結果にはヒットしませんでした。
    「Hello…」の投稿だけはヒットしていましたが、一旦記事を削除して再度作成したものはヒットしなくなりました。
    気になる部分と言えば、制作途中でSSLの申請をしたので途中からURLがSSLに変わった事です。
    (WordpressインストールはSSLになる前に行っております)

    「functions.php」には、カスタム投稿を作成する記述ぐらいしか記入しておりません。
    (現に同じソースの別のサイトだと検索は問題なく動きます)
    (exclude_from_searchはソース上にないです)

    自分でも1つずつ確認している現状です。

    モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    search.phpの記述ですが、通常search.phpには他のindex.phpと同じような、おなじみのWordPressループを書けばよいはずで、new WP_Queryを使う必要はないので、気になります。
    貼っていただいたのはコード内の一部の記述だけだと思うので断言はできませんが、クエリが上手く取れていないのではないかと思います。
    SSLはどうなんでしょう。。。あまり関係ないような気がしますが。。。

    おそらくかなり古いソースコードをコピペされたような雰囲気がありますので、ここはもう少し深掘りして調べたいところです。
    (いい表現が見つからなくて申し訳ないのですが、場合によっては動かないほうが正常で、動いている他のサイトのほうが「たまたま動いているだけ」という可能性もありますので…)

    まずは最優先のデバック事項として、一旦別のテーマにしてどうなるか。
    次に、このテーマでsearch.phpだけを外して、検索画面がどうなるか確認してみてください。
    原因究明のためにはその結果を知りたいです。

    モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    追記です。
    Advanced Custom Fieldsをお使いとのことで、ちょっと気になったのですが
    コンテンツのすべてを標準のWordPressのエディタを使わずにカスタムフィールドで構築しているために、サイト内検索に引っかからないという作りをしているサイトに以前出会ったことがあります。
    このサイトはちゃんと備え付けの本文欄を使用されていますでしょうか?(念のため。。。)

    あと知りたい情報としては以下です。余裕があればお願いします。

    * search.phpの全文
    * カスタム投稿タイプを定義している部分の記述
    * どのページのコンテンツが標準の「投稿」で、どれがカスタム投稿タイプか

    トピック投稿者 m0810

    (@m0810)

    返答頂きありがとうございます。

    1.「search.php」の全文は現在このような状態です。
    ———————————————-
    <?php get_header(“3″); ?>

    <div class=”body-main”>
    <div>【サイト内検索】</div>

    <div class=”contact-body”>

    <div class=”title”>
    <?php $allsearch =& new WP_Query(“s=$s&posts_per_page=-1”);
    $key = wp_specialchars($s, 1);
    $count = $allsearch->post_count;
    if($count!=0){
    // 検索結果を表示:該当記事あり
    echo ‘<p>“‘.$key.’”で検索した結果、‘.$count.’件の記事が見つかりました</p>’;
    }
    else {
    // 検索結果を表示:該当記事なし
    echo ‘<p>“‘.$key.’”で検索した結果、関連する記事は見つかりませんでした</p>’;
    }
    ?>
    </div>

    <?php if (have_posts()) : ?>
    <?php while (have_posts()) : the_post(); ?>
    <!– Start: Post –>
    <div class=”post section”>

    <h3>“><?php the_title(); ?></h3>
    <p class=”post-meta”>
    <span class=”date”><?php the_time(‘Y年m月d日(D)’); ?></span>
    </p>

    <div class=”entry”>
    <?php the_post_thumbnail(); ?>
    <?php the_excerpt(); ?>
    </div>
    <div class=”clear-both”></div>

    <?php if(has_tag()): ?><p class=”tags”><span><?php the_tags(“”); ?></span></p><?php endif; ?>

    </div>
    <!– End: Post –>
    <?php endwhile; ?>

    <div class=”navigation”>
    <?php if(function_exists(‘wp_page_numbers’)) { wp_page_numbers(); } ?>
    </div>
    <?php else : ?>
    <div class=”post section”>
    <p>お探しのキーワードは見つかりません。</p>
    </div>
    <?php endif; ?>

    </div>
    <div class=”clear”></div>

    </div>

    <?php get_footer(); ?>
    ———————————————-

    2.「カスタム投稿」は下記の記述で作成しています(functions.phpに記述)
    ———————————————-
    // カスタム投稿「宿泊施設」
    function my_custom_init() {
    register_post_type( ‘stay’, array(
    ‘label’ => ‘宿泊施設’,
    ‘public’ => true,
    ‘supports’ => array( ‘title’, ‘editor’, ‘author’, ‘thumbnail’, ‘excerpt’, ‘custom-fields’ ,’comments’ ),
    ‘menu_position’ => 5,
    ‘has_archive’ => true,
    ‘rewrite’ => true,
    ));
    }
    add_action( ‘init’, ‘my_custom_init’ );
    $args = array(
    ‘label’ => ‘カテゴリー’,
    ‘public’ => true,
    ‘show_ui’ => true,
    ‘hierarchical’ => true,
    );
    register_taxonomy(‘staylist’, ‘stay’, $args);
    $categories = get_the_terms($post_id, ‘staylist’);

    // カスタム投稿「体験」
    function my_custom_init2() {
    register_post_type( ‘experience’, array(
    ‘label’ => ‘体験’,
    ‘public’ => true,
    ‘supports’ => array( ‘title’, ‘editor’, ‘author’, ‘thumbnail’, ‘excerpt’, ‘custom-fields’ ,’comments’ ),
    ‘menu_position’ => 5,
    ‘has_archive’ => true,
    ‘rewrite’ => true,
    ));
    }
    add_action( ‘init’, ‘my_custom_init2’ );
    $args = array(
    ‘label’ => ‘カテゴリー’,
    ‘public’ => true,
    ‘show_ui’ => true,
    ‘hierarchical’ => true,
    );
    register_taxonomy(‘experiencelist’, ‘experience’, $args);
    $categories = get_the_terms($post_id, ‘experiencelist’);

    3.標準の投稿が「グリーン通信」。
      カスタム投稿が「体験」と「宿泊施設」になります。

    モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    ありがとうございます。カスタム投稿タイプはひとまず置いておいて、search.phpのコードを(そのまま貼るとエラーになったので、クオートの部分などを一部修正して)手元の環境に貼ったところ、検索クエリ自体は問題ありませんでした。

    まずは最優先のデバック事項として、一旦別のテーマにしてどうなるか。
    次に、このテーマでsearch.phpだけを外して、検索画面がどうなるか確認してみてください。

    こちらはどうですか?

    また、管理画面の投稿一覧の右上にも「投稿を検索」欄がありますが、ここで検索した際はちゃんと動作しますか?それもご確認ください。

    トピック投稿者 m0810

    (@m0810)

    返信が遅くなりました。
    確認できた部分を追記いたします。

    1.一旦別のテーマにして検索を確認する。
    「Twenty Seventeen」(バージョン: 1.5)にしたところ検索が問題なく動作しました。

    2.管理画面の投稿一覧右上の「投稿を検索」の動作を確認する。
     自作テーマの場合⇒記事がヒットしない
     「Twenty Seventeen」(バージョン: 1.5)のテーマの場合⇒投稿記事がヒットする

    ここまででわかったことが・・・
    自作の検索結果のソースに不備がある or 「Advanced Custom Fields」の不具合??
    確認する部分がだんだん絞り込めてきていますが、最終的な原因発見に向けて検証を続けていきます。

    トピック投稿者 m0810

    (@m0810)

    本日確認できたところを追記。

    1.自作の検索結果のソースを「Twenty Seventeen」からコピペしたが、検索はヒットしない。

    2.使用していたプラグインを全て停止、削除したが検索はヒットしない。

    テーマを変更すると検索が動作するので、もしかしたら自作でカスタム投稿を作成した部分に問題があるのか??

    引き続き検証していきます

    モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    情報追記ありがとうございます。どうなったかなと気になっておりました。

    あとは、カスタム投稿タイプの実装部分を一旦外して、通常の投稿のみの状態にしてどうなるかも確認してみると、functions.phpとsearch.phpのどちらに要因がありそうか絞れると思います。

    こちらの環境での再現が難しいのでなかなかズバリの回答ができず申し訳ないのですが、少しずつは絞り込めているかと思います。焦らずに調査していきましょう( ・`ω・´)

    ##追記
    ローカル環境の私の自作テーマ内functions.phpに、開示いただいたカスタム投稿タイプの登録部分のPHPをコピペして2つの投稿タイプを追加した上で検索を試してみましたが、検索結果は正常でした。

    ちなみに本件とは関係ないですが、2ヶ所出てくる↓この記述はおそらく不要だと思います。
    $categories = get_the_terms($post_id, '***');

    さらにsearch.phpの記述も開示のものを貼って試してみましたが、検索結果は表示されました。

    ですので、今回貼っていただいた以外の部分のPHPコードに原因があるかもしれません。

    トピック投稿者 m0810

    (@m0810)

    返信ありがとうございます。

    追記の内容拝見しました。
    カスタム投稿の記述で正常に動作するということは・・・もしかしたらその他の「function.php」で検索を無効させる何かがあるのでしょうか・・・。

    一応、function.phpの全文を載せておきます。
    —————————————————
    <?php
    // 記事内の画像の1枚目を取得する
    function getPostImage($mypost){
    if(empty($mypost)){ return(null); }
    if(ereg(‘<img([ ]+)([^>]*)src\=[“|\’]([^”|^\’]+)[“|\’]([^>]*)>’,$mypost->post_content,$img_array)){
    // imgタグで直接画像にアクセスしているものがある
    $dummy=ereg(‘<img([ ]+)([^>]*)alt\=[“|\’]([^”|^\’]+)[“|\’]([^>]*)>’,$mypost->post_content,$alt_array);
    $resultArray[“url”] = $img_array[3];
    $resultArray[“alt”] = $alt_array[3];
    }
    else{
    // 直接imgタグにてアクセスされていない場合は紐づけられた画像を取得
    $files = get_children(array(‘post_parent’ => $mypost->ID, ‘post_type’ => ‘attachment’, ‘post_mime_type’ => ‘image’));
    if(is_array($files) && count($files) != 0){
    $files=array_reverse($files);
    $file=array_shift($files);
    $resultArray[“url”] = wp_get_attachment_url($file->ID);
    $resultArray[“alt”] = $file->post_title;
    }
    else{
    return(null);
    }
    }
    return($resultArray);
    }

    // カスタム投稿「宿泊施設」
    function my_custom_init() {
    register_post_type( ‘stay’, array(
    ‘label’ => ‘宿泊施設’,
    ‘public’ => true,
    ‘supports’ => array( ‘title’, ‘editor’, ‘author’, ‘thumbnail’, ‘excerpt’, ‘custom-fields’ ,’comments’ ),
    ‘menu_position’ => 5,
    ‘has_archive’ => true,
    ‘rewrite’ => true,
    ));
    }
    add_action( ‘init’, ‘my_custom_init’ );
    $args = array(
    ‘label’ => ‘カテゴリー’,
    ‘public’ => true,
    ‘show_ui’ => true,
    ‘hierarchical’ => true,
    );
    register_taxonomy(‘staylist’, ‘stay’, $args);
    $categories = get_the_terms($post_id, ‘staylist’);

    // カスタム投稿「体験」
    function my_custom_init2() {
    register_post_type( ‘experience’, array(
    ‘label’ => ‘体験’,
    ‘public’ => true,
    ‘supports’ => array( ‘title’, ‘editor’, ‘author’, ‘thumbnail’, ‘excerpt’, ‘custom-fields’ ,’comments’ ),
    ‘menu_position’ => 5,
    ‘has_archive’ => true,
    ‘rewrite’ => true,
    ));
    }
    add_action( ‘init’, ‘my_custom_init2’ );
    $args = array(
    ‘label’ => ‘カテゴリー’,
    ‘public’ => true,
    ‘show_ui’ => true,
    ‘hierarchical’ => true,
    );
    register_taxonomy(‘experiencelist’, ‘experience’, $args);
    $categories = get_the_terms($post_id, ‘experiencelist’);

    // ウィジェット使用
    if ( function_exists( ‘register_sidebar’ ) ){
    register_sidebar();
    }

    // アイキャッチ画像使用
    add_theme_support(‘post-thumbnails’);

    // 1件目の記事情報取得
    function isFirst(){
    global $wp_query;
    return ($wp_query->current_post === 0);
    }

    // 行頭の全角スペースを許可
    add_filter(‘tiny_mce_before_init’, ‘my_tiny_mce_before_init_filter’,10,3);
    function my_tiny_mce_before_init_filter( $init_array ) {
    $init_array[‘remove_linebreaks’] = false;
    return $init_array;
    }

    // 抜粋記事のショートコード表示を非表示
    function my_noshotcode($content){
    $rtn = “”;
    preg_match(“/\[.+?\]/”,$content,$retArr);
    $rtn = str_replace($retArr[0],”,$content);
    return $rtn;
    }

    // 自動で入る<p>を非表示
    function SearchExcludeCategoryFilter($query) {
    if ($query->is_search) { $query->set(‘cat’,’1′); }
    return $query;
    }
    add_filter(‘pre_get_posts’,’SearchExcludeCategoryFilter’);
    add_action(‘init’, function() {
    remove_filter(‘the_excerpt’, ‘wpautop’);
    remove_filter(‘the_content’, ‘wpautop’);
    });
    add_filter(‘tiny_mce_before_init’, function($init) {
    $init[‘wpautop’] = false;
    $init[‘apply_source_formatting’] = ture;
    return $init;
    });

    // カスタムフィールドのGoogleMAPのAPIキー
    function my_acf_google_map_api( $api ){
    $api[‘key’] = ‘XXXXXX’;
    return $api;
    }
    add_filter(‘acf/fields/google_map/api’, ‘my_acf_google_map_api’);

    //カスタム投稿用post_typeセット(カスタム投稿別に検索範囲をセットする)
    add_filter(‘template_include’,’custom_search_template’);
    function custom_search_template($template){
    if ( is_search() ){
    $post_types = get_query_var(‘post_type’);
    foreach ( (array) $post_types as $post_type )
    $templates[] = “{$post_type}-search.php”;
    $templates[] = ‘search.php’;
    $template = get_query_template(‘search’,$templates);
    }
    return $template;
    }

    ?>
    —————————————————

    自分のPHPソースの記述に原因があるのか引き続き続けていきます。

    因みにですが、jQueryを幾つか導入しているのでもしかしたらその部分…というのも考えられるのでしょうか?
    現在使用中のjQueryを書いておきます。
    1.「bxslider」
    2.「fatNav」
    3.「smoothScroll」

    • この返信は6年前にm0810が編集しました。
    munyagu

    (@munyagu)

    pre_get_postsが・・・

    トピック投稿者 m0810

    (@m0810)

    あ・・・

    トピック投稿者 m0810

    (@m0810)

    function.phpの記述を1つずつ消して検証したと思っていましたが、
    指摘のあった「pre_get_posts」1か所削除で問題なく動作出来ました。

    コピペで使用していたので何処かの際で設定したのを忘れてしまっていたようでした;;;

    協力いただきました、mypacecreatorさんとmunyaguさん
    ありがとうございました。

14件の返信を表示中 - 1 - 14件目 (全14件中)
  • トピック「サイト内検索で記事がヒットしない」には新たに返信することはできません。