サポート » 使い方全般 » カスタムフィールドで検索すると同じ記事が複数表示されるうえに、絞り込みがなされない、、、

  • WordPressのバージョン
    5.1.1
    テーマ:Onepress
    プラグイン:simplemembership
         :easydigitaldownload
         :エレメンター
          など

    いつも大変お世話になっております。

    複数条件で記事の絞り込み検索を行うために、
    function.phpに追記を行い、検索フォームのショートコードを作成して、
    サイドバーに表記しました。
    デフォルトのsearch.phpではサムネイルが表示されないなどの問題があったため、
    デフォルトのindex.phpをsearch.phpにコピペしました。

    その状態でカスタムフィールドを対象とした(プルダウンでの価格による絞り込み)検索を行うと、同じ記事が複数検索されるうえに、カスタムフィールドで値を入力していない記事も検索結果に表示されます。

    プログラミング言語の知識がほとんどなく、いろんな方のサイトを参考にしたり、フォーラムでご意見を伺ったりして助けていただきながら、ここまで作成しましたが、行き詰ってしまいました。
    いろいろ試した挙句、ほとんどがコピペになってしまい、原因がよくわかりません。

    いつも身勝手なお助け依頼で申し訳ございません。
    回答をしていただいてもすぐに返信できずに申し訳ございません。

    そんな私ですが、非常に困っておりまして、助けていただけると幸いです。

    参考に子テーマのfunctions.phpとsearch.phpと検索フォームのcustom-search.phpを
    記載します。
    よろしくお願いいたします。
    function.php

    <?php
    /**
    * OnePress Child Theme Functions
    *
    */

    /**
    * Enqueue child theme style
    */
    add_action( ‘wp_enqueue_scripts’, ‘onepress_child_enqueue_styles’, 15 );
    function onepress_child_enqueue_styles() {
    wp_enqueue_style( ‘onepress-child-style’, get_stylesheet_directory_uri() . ‘/style.css’ );
    }
    /**
    * Hook to add custom section after about section
    *
    * @see wp-content/themes/onepress/template-frontpage.php
    */

    /*
    function add_my_custom_section(){
    ?>
    <section id=”my_section” class=”my_section section-padding onepage-section”>
    <div class=”container”>
    <div class=”section-title-area”>
    <h5 class=”section-subtitle”> My section subtitle</h5>
    <h2 class=”section-title”> My section title</h2>
    </div>
    <div class=”row”>
    <!– Your section content here, you can use bootstrap 4 elements 🙂 –>
    <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec odio. Quisque volutpat mattis eros. Nullam malesuada erat ut turpis. Suspendisse urna nibh, viverra non, semper suscipit, posuere a, pede.</p>

    </div>
    </div>
    </section>
    <?php
    }
    add_action( ‘onepress_after_section_about’, ‘add_my_custom_section’ );
    */

    //ショートコードを作成・
    function my_php_Include($params = array()) {
    extract(shortcode_atts(array(‘file’ => ‘default’), $params));
    ob_start();
    include(STYLESHEETPATH . “/$file.php”);
    return ob_get_clean();
    }
    add_shortcode(‘myphp’, ‘my_php_Include’);

    //ログアウト先を決める・
    function redirect_logout_page(){
    $url = site_url(‘https://www.structurebank.jp/logout/&#8217;, ‘http’);
    wp_safe_redirect($url);
    exit();
    }
    add_action(‘wp_logout’,’redirect_logout_page’);

    //

    /*
    function custom_search($search, $wp_query) {
    //サーチページ以外だったら終了
    if (!$wp_query->is_search) return;
    //投稿記事のみ検索
    $search .= ” AND post_type = ‘post'”;
    return $search;
    //query[‘s’]があったら検索ページ表示
    if ( isset($wp_query->query[‘s’]) ) $wp_query->is_search = true;
    /* //カスタムフィールドで検索
    if (!empty($_REQUEST[‘meta_text’])) {
    $meta_text = “‘%” .mysql_real_escape_string($_REQUEST[‘meta_text’]). “%'”;
    $search .= ”
    AND wp_postmeta.meta_key = ‘custom1’
    AND wp_postmeta.meta_value LIKE {$meta_text}”;
    }
    return $search;
    }
    add_filter(‘posts_search’,’custom_search’, 10, 2);
    */

    function custom_search($search, $wp_query) {
    //検索テキストが空でも検索ページを表示
    if ( isset($wp_query->query[‘s’]) ) $wp_query->is_search = true;
    //検索ページ以外だっ修了終了
    if (!$wp_query->is_search) return;
    //投稿記事のみ検索
    $search .= ” AND post_type = ‘post'”;
    return $search;
    //カスタムフィールド(価格)で検索
    if (!empty($_REQUEST[‘price’])) {
    $meta_price = intval($_REQUEST[‘price’]);
    $mate_pricelow = $meta_price – 10000;
    $search .= ”
    AND wp_postmeta.meta_key = ‘price’
    AND wp_postmeta.meta_value BETWEEN {$mate_pricelow} AND {$meta_price}
    “;
    }
    return $search;
    }
    add_filter(‘posts_search’,’custom_search’, 10, 2);

    function custom_search_join($join){
    if(!empty($_REQUEST[‘meta_text’]) || !empty($_REQUEST[‘price’])) {
    $join .= “INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)”;
    }
    return $join;
    }
    add_filter( ‘posts_join’, ‘custom_search_join’ );

    search.php

    <?php

    get_header();

    $layout = onepress_get_layout();

    ?>
    <?php onepress_breadcrumb(); ?>
    <div id=”content” class=”site-content”>
    <div id=”content-inside” class=”container <?php echo esc_attr( $layout ); ?>”>
    <div id=”primary” class=”content-area”>
    <main id=”main” class=”site-main” role=”main”>

    <?php if ( have_posts() ) : ?>

    <?php if ( is_home() && ! is_front_page() ) : ?>
    <header>
    <h1 class=”page-title screen-reader-text”><?php single_post_title(); ?></h1>
    </header>
    <?php endif; ?>

    <?php /* Start the Loop */ ?>
    <?php while ( have_posts() ) : the_post(); ?>

    <?php

    /*
    * Include the Post-Format-specific template for the content.
    * If you want to override this in a child theme, then include a file
    * called content-___.php (where ___ is the Post Format name) and that will be used instead.
    */
    get_template_part( ‘template-parts/content’, get_post_format() );
    ?>

    <?php endwhile; ?>

    <?php the_posts_navigation(); ?>

    <?php else : ?>

    <?php get_template_part( ‘template-parts/content’, ‘none’ ); ?>

    <?php endif; ?>

    </main><!– #main –>
    </div><!– #primary –>
    <?php if ( $layout != ‘no-sidebar’ ) { ?>
    <?php get_sidebar(); ?>
    <?php } ?>

    </div><!–#content-inside –>
    </div><!– #content –>

    <?php get_footer(); ?>

    custom-search.php

    <div class=”conditionsearch”>
    <h2 class=”side-cat-title”>商品検索</h2>
    <form method=”get” action=”<?php bloginfo( ‘url’ ); ?>” class=”form-horizontal”>
    <div class=”form-group”>
    <label class=”col-sm-4 control-label”>キーワード</label>
    <div class=”col-sm-8″>
    <input class=”form-control” name=”s” id=”s” type=”text” placeholder=”キーワードを入力”/>
    </div>
    </div>
    <div class=”form-group”>
    <label class=”col-sm-4 control-label”>価格</label>
    <div class=”col-sm-8″>
    <select class=”form-control” name=”price”>
    <option value=””>選択してください。</option>
    <option value=”10000″>~10,000円</option>
    <option value=”20000″>10,000~20,000円</option>
    <option value=”30000″>20,000~30,000円</option>
    <option value=”40000″>30,000~40,000円</option>
    <option value=”50000″>40,000~50,000円</option>
    <option value=”60000″>50,000~60,000円</option>
    <option value=”70000″>60,000~70,000円</option>
    <option value=”80000″>70,000~80,000円</option>
    <option value=”90000″>80,000~90,000円</option>
    <option value=”100000″>90,000~</option>
    </select>
    </div>
    </div>
    <div class=”form-group”>
    <label class=”col-sm-4 control-label”>カテゴリー</label>
    <div class=”col-sm-8″>
    <?php wp_dropdown_categories(‘depth=0&orderby=name&hide_empty=1&show_option_all=カテゴリーを選択&exclude=1,2,3’); ?>
    </div>
    </div>
    <div class=”form-group”>
    <div class=”col-sm-offset-4 col-sm-8″>
    <button id=”submit” type=”submit” class=”btn btn-default”>検索</button>
    </div>
    </div>
    </form>
    </div>

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

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • CG

    (@du-bist-der-lenz)

    Onepressテーマのsearch.phpにはサムネイル取得の関数が書かれていないだけなので、「デフォルトのsearch.phpではサムネイルが表示されないなどの問題があったため、」ということですから、the_post_thumbnailを、search.phpに追記することで、「デフォルトのindex.phpをsearch.phpにコピペしました。」以降の、なんともわからない工程は必要ないのではありませんか。回答はなくてもかまっていません。半日ぐらいでリセットしていますから。

    CGさま

    回答ありがとうございます。
    the_post_thumbnailをデフォルトのsearch.phpに追記したところ、サムネイルが
    表示されました。
    ありがとうございます!!
    ですが、それでも同じ記事が連続して表示される現象と、カスタムフィールドの値が検索条件の対象になっていないことに変わりはありませんでした。
    (例えば、A~Dという記事があった場合、AAAAAAAABBBBBBBBBCCCCCCCCDDDDDDDという具合に記事が常時されます、、、
    また、Dに15000というカスタムフィールドの値を付けて検索してもAAAAAAAABBBBBBBBBCCCCCCCCDDDDDDDという風に表示されてしまいます。)
    カテゴリ、タグ、キーワード検索は通常通り機能します。
    繰り返すので、whileとかが原因かとも思いましたが、どのようにいじればいいのかわかりません、、、

    CG

    (@du-bist-der-lenz)

    「同じ記事が連続して表示される現象と、カスタムフィールドの値が検索条件の対象になっていないことに変わりは」無いのは当然でしょう。一度得た情報は除外する処理をすることで整理していきましょう。

    CGさま

    回答ありがとうございます!
    「一度得た情報は除外する処理をすることで整理していきましょう。」というのは、
    同じ記事が連続して表示されることを防ぐために、検索の命令を除外する処理方法が
    あるということでしょうか?

    CG

    (@du-bist-der-lenz)

    命令を実行する度に、出力処理してればしかたのないことです。レストランで出来た料理が届く度に代金支払いますか。最後にレジで支払い(=精算)ますね。

    こんにちは

    ソースコードを貼り付ける場合は、入力エリア上にある「code」ボタンを押してその後ろに張り付け、終了箇所でもう一度「code」ボタンを押してください。
    そうしないとベタっと左寄せになってコードの判読が難しくなります。

    さて、発行されている SQL が意図どおりではないせいで同じ記事が表示されたり絞り込みが正しくない可能性はないでしょうか。

    以下を参考に、発行されている SQL を確認してみてください。
    http://wpdocs.osdn.jp/WordPress%E3%81%A7%E3%81%AE%E3%83%87%E3%83%90%E3%83%83%E3%82%B0#SAVEQUERIES

    SAVEQUERIES で検索すると、具体的な使い方が見つかると思います。

    Nora

    (@nora0123456789)

    こんにちは。

    ご希望通りの結果が返ってくるかは判りませんが、1つ気になったことがあります。
    コード内の関数「custom_search」内の7行目あたりに「return $search」というのがifなどの条件無しに書かれているように見えます。
    これにより、それ以降の「price」に関する処理がなされていないんじゃないでしょうか。

    まずは一度その一行を外して試してみてください。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「カスタムフィールドで検索すると同じ記事が複数表示されるうえに、絞り込みがなされない、、、」には新たに返信することはできません。