web-dev-qa-db-ja.com

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

私は自動車販売店のためのテーマを作りました。各自動車はカスタムポストタイプ( "vehicle")で、製造元、モデル、マイレージ、燃料タイプなどのカスタムフィールドが約12あります。

だから基本的にホームページで私はMake&Modelのためのドロップダウンリストを持ちそして利用可能なMakesやModelsを含む検索フォームが欲しい。

Yearにも2つのオプションがあるので、エンドユーザーは "2006"と "2012"を選択でき、検索結果にはこれら2つの数字の間の年を持つすべての車両が含まれます。

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

どうもありがとう..これは私を何時間も夢中にさせています!!!!

11
absdigital

______UPDATE_______
私はますます投票を得ていて、解決策は上手くいきますが、 cybmetaの答え は実際にはNiceでWordPressの方法です。あなたは間違いなくそれを試すべきです。

ステップ1

ユーザーがWebサイトとやり取りするための高度な検索フォームを作成し、名前を付けて保存します(つまり、advanced-searchform.phpとして保存します - ただし、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="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からコードを持ってきました(私はルートを忘れました)が、上のコードを使用して論争があります。しかし、実際にはうまくいきます(もちろん、言い訳はありません)。

別の方法をチェックしてください @ G.M。提案した。

ステップ3

新しいファイルを作成してadvanced-search-result.phpで保存します(これはfunctions.phpでこの名前を使用したためです)。そして今、あなたは無料です - 明らかに。概念は次のとおりです。

  • URLからデータを取得します。
  • 単純なWP_Query()を使用してください(クエリが複雑な場合は$wpdbクエリを使用してください)。
  • クエリ内でコマンドを渡し、dbからデータを取得し、そして
  • 結果を表示[s]

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

<?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();
?>

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

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

それで、あなたはアイデアを得ました、今それはwayを探検し発見するあなたの番です。覚えておいて、みんなのやり方は違う。私があなたに従うことができるようにあなたのものを作ってください。 :)

15
Mayeenul Islam

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

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

他の回答のステップ1と同じこのステップは、検索に使用される「名前」フィールドのIDを「s」に変更しただけなので、検索フィールドとして直接使用されます。このコードをテーマフォルダの下のsearchform-advanced.phpに保存します。次に、get_template_part( 'advanced', 'searchform' );を使用して、テーマのどこに表示するかを指定します。

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