______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
)テンプレートを選択し、それに基づいてこのページを作成できます。
アイデアが浮かんだので、今度は方法を探索して発見する番です。みんなのやり方は違うことを覚えておいてください。あなたをフォローしてください。:)