私は自動車販売店のためのテーマを作りました。各自動車はカスタムポストタイプ( "vehicle")で、製造元、モデル、マイレージ、燃料タイプなどのカスタムフィールドが約12あります。
だから基本的にホームページで私はMake&Modelのためのドロップダウンリストを持ちそして利用可能なMakesやModelsを含む検索フォームが欲しい。
Yearにも2つのオプションがあるので、エンドユーザーは "2006"と "2012"を選択でき、検索結果にはこれら2つの数字の間の年を持つすべての車両が含まれます。
これを行うことができるそこにプラグインはありますか?
どうもありがとう..これは私を何時間も夢中にさせています!!!!
______UPDATE_______
私はますます投票を得ていて、解決策は上手くいきますが、 cybmetaの答え は実際にはNiceでWordPressの方法です。あなたは間違いなくそれを試すべきです。
ユーザーが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に取り込むことができます。
あなたが必要としているのは、データベースへの問い合わせ、投稿タイプとそのカスタムフィールドへの問い合わせ検索クエリによるです。検索クエリはフォーム送信後に取得した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。提案した。
新しいファイルを作成してadvanced-search-result.php
で保存します(これはfunctions.php
でこの名前を使用したためです)。そして今、あなたは無料です - 明らかに。概念は次のとおりです。
WP_Query()
を使用してください(クエリが複雑な場合は$wpdb
クエリを使用してください)。サンプルは次のとおりです。
<?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には何もありません。page.php
(またはsearch.php
)テンプレートを選択し、それに基づいてこのページを作成できます。それで、あなたはアイデアを得ました、今それはwayを探検し発見するあなたの番です。覚えておいて、みんなのやり方は違う。私があなたに従うことができるようにあなたのものを作ってください。 :)
@ 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;
}