カスタムフィールドの検索フォームを作成する


11

自動車販売店のテーマを作りました。各車はカスタムポストタイプ(「車両」)であり、約12のカスタムフィールドがあり、メーカー、モデル、走行距離、燃料タイプなどが含まれます。

したがって、基本的にはホームページに、Make&Modelのドロップダウンリストがあり、使用可能なすべてのMakesまたはModelsが含まれる検索フォームが必要です。

また、年に2つのオプションを設定して、エンドユーザーが「2006」と「2012」を選択できるようにし、検索結果に、これらの2つの数値の間に年があるすべての車両が含まれるようにします。

これを行うことができるプラグインはありますか?

助けてくれてありがとう..これは私を何時間も夢中にさせてきました!!!!


このプラグインを使用して、wordpress.org
plugins / wp

ありがとう..しかし、それは実際に検索フォームを作成する方法を説明していません。HTMLでフォームをプログラムできるということですが、実際にどのように機能させるのですか?
absdigital 2014年

回答:


16

______UPDATE_______
私はますます票を獲得していて、解決策は機能していますが、cybmetaの答えは実際にはWordPressの方法で良い答えです。ぜひやってみてください。

ステップ1

ユーザーがウェブサイトを操作するための詳細検索フォームを作成し、名前を付けて保存します(つまり、名前を付けて保存しadvanced-searchform.phpますが、保存しないでください)searchform.php。WordPressのデフォルトの検索フォームが置き換えられます。 ):

<form method="get" id="advanced-searchform" role="search" action="<?php echo esc_url( home_url( '/' ) ); ?>">

    <h3><?php _e( 'Advanced Search', 'textdomain' ); ?></h3>

    <!-- PASSING THIS TO TRIGGER THE ADVANCED SEARCH RESULT PAGE FROM functions.php -->
    <input type="hidden" name="search" value="advanced">

    <label for="name" class=""><?php _e( 'Name: ', 'textdomain' ); ?></label><br>
    <input type="text" value="" placeholder="<?php _e( 'Type the Car Name', 'textdomain' ); ?>" name="name" id="name" />

    <label for="model" class=""><?php _e( 'Select a Model: ', 'textdomain' ); ?></label><br>
    <select name="model" id="model">
        <option value=""><?php _e( 'Select one...', 'textdomain' ); ?></option>
        <option value="model1"><?php _e( 'Model 1', 'textdomain' ); ?></option>
        <option value="model2"><?php _e( 'Model 1', 'textdomain' ); ?></option>
    </select>

    <input type="submit" id="searchsubmit" value="Search" />

</form>

次に、次のようにフォームをテンプレートに呼び出します。

<?php get_template_part( 'advanced', 'searchform' ); ?>

これで検索フォームの準備が整い、検索フォームを使用して、ユーザー入力をURLに取り込むことができます。

ステップ2

必要なのは、データベースにクエリを実行し、検索クエリごとに投稿タイプとそのカスタムフィールドにクエリを実行することです。検索クエリがフォームの送信後に取得したURLであることを思い出してください。次に、フォームが送信されたときにカスタム検索結果ページをロードするようにWordPressに要求します。次の関数をにfunctions.php配置して、デフォルトの代わりにカスタム検索テンプレートを有効にしますsearch.php

<?php
function wpse_load_custom_search_template(){
    if( isset($_REQUEST['search']) == 'advanced' ) {
        require('advanced-search-result.php');
        die();
    }
}
add_action('init','wpse_load_custom_search_template');
?>

WPSEからコードをどこかに持ってきました(ルートを忘れました)が、上記のコードを使用して論争があります。しかし、実際には機能します(もちろん、不完全な言い訳)。

@GMが提案する別の方法を確認してください。

ステップ3

新しいファイルを作成して保存しますadvanced-search-result.php(この名前はで使用したためfunctions.php)。これで自由です。コンセプトは:

  • URLからデータを取得し、
  • シンプルを使用しWP_Query()ます(クエリが複雑な場合は$wpdbクエリを使用します)。
  • クエリ内でコマンドを渡し、dbからデータをフェッチし、
  • 結果を表示

サンプルは次のとおりです。

<?php
// Get data from URL into variables
$_name = $_GET['name'] != '' ? $_GET['name'] : '';
$_model = $_GET['model'] != '' ? $_GET['model'] : '';

// Start the Query
$v_args = array(
        'post_type'     =>  'vehicle', // your CPT
        's'             =>  $_name, // looks into everything with the keyword from your 'name field'
        'meta_query'    =>  array(
                                array(
                                    'key'     => 'car_model', // assumed your meta_key is 'car_model'
                                    'value'   => $_model,
                                    'compare' => 'LIKE', // finds models that matches 'model' from the select field
                                ),
                            )
    );
$vehicleSearchQuery = new WP_Query( $v_args );

// Open this line to Debug what's query WP has just run
// var_dump($vehicleSearchQuery->request);

// Show the results
if( $vehicleSearchQuery->have_posts() ) :
    while( $vehicleSearchQuery->have_posts() ) : $vehicleSearchQuery->the_post();
        the_title(); // Assumed your cars' names are stored as a CPT post title
    endwhile;
else :
    _e( 'Sorry, nothing matched your search criteria', 'textdomain' );
endif;
wp_reset_postdata();
?>

だから、これが最後のことです。しかし、それでも多くの課題があります。

  • 代替値 - すべてのフィールドまたはすべてのフィールドを使用して高度な検索を実行できるため、クエリが検索とデータに従ってすべての結果を取得していることを確認する必要があります。$wpdb複雑な検索結果にカスタムSQLクエリを使用でき、それは純粋なMySQLになります-WordPressには何もありません。
  • サニタイズと検証 -テキストフィールドとテキストエリアは非常に脆弱であるため、サイトに不正行為を引き起こす可能性があります。したがって、生データを渡すことは安全ではないため、dbクエリに渡す前に、それらをサニタイズおよび検証する必要があります。(WordPress -TutsPlus によるデータの無害化と検証
  • 設計 - page.php(またはsearch.php)テンプレートを選択し、それに基づいてこのページを作成できます。

アイデアが浮かんだので、今度は方法を探索して発見する番です。みんなのやり方は違うことを覚えておいてください。あなたをフォローしてください。:)


お時間を割いていただき、ありがとうございます。「Makes」のドロップダウンメニューに、車両の投稿の1つに入力されたすべてのメイクが自動的に表示されるように、それをどのように設定できるか知っていますか?
absdigital 2014年

それがあなたのために働くならうれしいでしょう。:)
Mayeenul Islam 2014

「Makes」のドロップダウンメニューに、車両の投稿の1つに入力されたすべてのメイクが自動的に表示されるように、それをどのように設定できるか知っていますか?
absdigital

WP_Query()カスタムフィールドパラメータを使用して結果をループし、<option>s を表示します。
Mayeenul Islam 2014

この「高度な検索」pre_get_postsが2次ループではなくフックを使用して実行されることを確認したいと思います。
cybmeta 2015

23

@MayeenulIslamの答えはうまくいくかもしれませんが、高度な検索を行う正しい方法はpre_get_postsアクションフックを使用することだと思います。

ステップ1:検索フォーム

このステップは、単に変更し、他の回答でステップ1に等しいidnameフィールド(<input type="text" ...>に検索するために使用さ「S」で、それは検索フィールドなどに直接使用されますので、名前を付けて保存このコードをadvanced-searchform.phpあなたのテーマフォルダの下。その後、使用get_template_part( 'advanced', 'searchform' );にはテーマに表示する場所にロードします。

<?php /**`advanced-searchform.php`*/ ?>
<form method="get" id="advanced-searchform" role="search" action="<?php echo esc_url( home_url( '/' ) ); ?>">

    <h3><?php _e( 'Advanced Search', 'textdomain' ); ?></h3>

    <!-- PASSING THIS TO TRIGGER THE ADVANCED SEARCH RESULT PAGE FROM functions.php -->
    <input type="hidden" name="search" value="advanced">

    <label for="s" class=""><?php _e( 'Name: ', 'textdomain' ); ?></label><br>
    <input type="text" value="" placeholder="<?php _e( 'Type the Car Name', 'textdomain' ); ?>" name="s" id="name" />

    <label for="model" class=""><?php _e( 'Select a Model: ', 'textdomain' ); ?></label><br>
    <select name="model" id="model">
        <option value=""><?php _e( 'Select one...', 'textdomain' ); ?></option>
        <option value="model1"><?php _e( 'Model 1', 'textdomain' ); ?></option>
        <option value="model2"><?php _e( 'Model 2', 'textdomain' ); ?></option>
    </select>

    <input type="submit" id="searchsubmit" value="Search" />

</form>

ステップ2:検索クエリにフィルターを追加する

add_action( 'pre_get_posts', 'advanced_search_query' );
function advanced_search_query( $query ) {

    if ( isset( $_REQUEST['search'] ) && $_REQUEST['search'] == 'advanced' && ! is_admin() && $query->is_search && $query->is_main_query() ) {

        $query->set( 'post_type', 'vehicle' );

        $_model = $_GET['model'] != '' ? $_GET['model'] : '';

        $meta_query = array(
                            array(
                                'key'     => 'car_model', // assumed your meta_key is 'car_model'
                                'value'   => $_model,
                                'compare' => 'LIKE', // finds models that matches 'model' from the select field
                            )
                        )
        );
        $query->set( 'meta_query', $meta_query );

    }
}

ステップ3:テンプレート化(オプション)

この方法では、WordPressのデフォルトの検索テンプレートを使用して、二次クエリを必要とせずに結果をフィルタリングします。高度な検索に別のテンプレートを使用する場合は、template_includeフィルターを使用できます。たとえばadvanced-search-template.php、詳細検索フォームからの結果のテンプレートとしてファイルを使用する場合:

add_action('template_include', 'advanced_search_template');
function advanced_search_template( $template ) {
  if ( isset( $_REQUEST['search'] ) && $_REQUEST['search'] == 'advanced' && is_search() ) {
     $t = locate_template('advanced-search-template.php');
     if ( ! empty($t) ) {
         $template = $t;
     }
  }
  return $template;
}

3
ワードプレスの方法をありがとうございました。ちょうどこれで働いた、それは素晴らしいです。:)
Mayeenul Islam 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.