web-dev-qa-db-ja.com

検索へのカスタムフィールドの追加

メタ値で絞り込むことができるように、カスタムフィールドを検索に追加しようとしています。現在、通常の検索にいくつかの選択リストを追加しました。

<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
Howdy_McGee

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」投稿タイプとメタクエリ。

3
Bendoh