メタ値で絞り込むことができるように、カスタムフィールドを検索に追加しようとしています。現在、通常の検索にいくつかの選択リストを追加しました。
<form role="search" action="<?php echo site_url('/'); ?>" method="get" id="searchform">
<input type="hidden" name="s" value="carcpt" /> <!-- // hidden 'products' value -->
<select name="price">
<option value="">Nothing</option>
<option value="500.00">500.00</option>
<option value="100.00">100.00</option>
<option value="50.00">50.00</option>
</select>
<select name="year">
<option value="">Nothing</option>
<option value="2011">2011</option>
<option value="2007">2007</option>
<option value="1991">1991</option>
</select>
<input type="submit" alt="Search" value="Search" />
</form>
そして私のsearch.php
の一番上に、私はこの条件付きがあります:
$q = get_search_query();
if($q = 'carcpt'){
$price = $_GET['price'];
$year = $_GET['year'];
$search = new WP_Query(
array(
'post_type' => 'carcpt',
'meta_query' => array(
array(
'key' => '_price',
'value' => $price
),
array(
'key' => '_year',
'value' => $year
)
)
)
);
}
それがシナリオです - 私は2つの質問があります:
1)これは、カスタムフィールドで検索結果を追加して絞り込むための非常に「厄介な」方法のようです。これを行う?
2)上記のクエリの問題は、ユーザーが価格や年を入力しなかった場合 - クエリを実行し、空の投稿のみを返すことです価格/年メタ私のクエリでは、メタが空かどうかを判断し、それに応じてクエリを変更する方法があります - スイッチは含まないのですか?
1)「正しい方法」の観点からあなたのソリューションは完全に受け入れられると思います-ポストメタは検索用です。私にはハッキーではないようです。
2)行うべきことは、meta_queryを個別にビルドすることです。
$meta_query = array();
if( !empty( $_GET['price'] ) ) {
$meta_query[] = array( 'key' => '_price', 'value' => $_GET['price'] );
}
if( !empty( $_GET['year'] ) ) {
$meta_query[] = array( 'key' => '_year', 'value' => $_GET['year'] );
}
$search = new WP_Query( array(
'post_type' => 'carcpt',
'meta_query' => $meta_query
) );
この方法では、指定された空ではない値を持つメタキーに対してのみクエリを実行します。
クエリ変数の変更はpre_get_posts
アクションで行うほうが良いことを指摘したいと思います。それ以外の場合、このインスタンスでは2つのクエリが実行されます。1つは「carcpt」の検索、 「carcpt」投稿タイプとメタクエリ。