web-dev-qa-db-ja.com

カスタム投稿タイプをメタデータで検索

私はユーザーがメタデータで検索できるようにする必要があるカスタム投稿タイプ 'Property'を持っています。

私は3つの検索機能を持っています - 2つは管理領域の1つのフロントエンドに - 期待どおりに実行されているものとまったく結果をフィルタリングしていないように思われるものです。

私の定義またはカスタムquery_varsの使用法のいずれかに問題があるかもしれないと思います。

私のfunctions.phpに私は以下があります:

function add_query_vars($public_query_vars) {
    $public_query_vars[] = 'bedrooms';
    $public_query_vars[] = 'type';
    $public_query_vars[] = 'location';
    return $public_query_vars;
}
add_filter('query_vars', 'add_query_vars');

function meta_search_query($query) {

    $query_args_code = array(
      'posts_per_page' => 5,
      'post_type' => 'nc_property',
      'meta_key' => 'nc_code',
      'meta_value' => $query->query_vars['s'],
      'meta_compare' => 'LIKE'
    );


    $query_args_meta = array(
        'posts_per_page' => -1,
        'post_type' => 'nc_property',
        'meta_query' => array(
            'relation' => 'AND',
            array(
                'key' => 'nc_bedrooms',
                'value' => $query->query_vars['bedrooms'],
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'nc_type',
                'value' => $query->query_vars['type'],
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'nc_location',
                'value' => $query->query_vars['location'],
                'compare' => 'LIKE'
            )
        )
    );

    if (is_admin() && $query->is_search ) {
        query_posts($query_args_code);

    } elseif (!is_admin() && $query->is_search ) {
        if ($_REQUEST["which_form"] == 'meta_form') {
            query_posts($query_args_meta);

        } elseif ($_REQUEST["which_form"] == 'code_form'){
            query_posts($query_args_code);

        }
    }  
}
add_filter( 'pre_get_posts', 'meta_search_query');

プロパティコードで検索してもフロントエンドとバックエンドの両方でまったく問題はありませんが、カスタムクエリvars(location、type、bedrooms)で結果をフィルタしようとすると、常にフラットになります。

作成されるクエリ文字列の例は次のとおりです。

/property/?post_type=nc_property&which_form=meta_form&bedrooms=Two&type=Apartment&location=Bahceli

これらの詳細に一致するサイト上の1つのプロパティがありますが、WordPressは毎回すべての結果を返します。

私は何かを逃しましたか?

編集:私のメタクエリのための私の検索フォームが名前として's'を持つ要素を使っていなかったので、私のifステートメントの$query->is_search条件はfalseを返していました。

私のためにこれを発見したことに対してfischiに賞賛を! :D

3
Jazibobs

この場合、あなたがリクエストパーマリンクとかなりのパーマリンクを混ぜるので、私はあなたのクエリで$_GET変数を使うでしょう。

$query_args_meta = array(
    'posts_per_page' => -1,
    'post_type' => 'nc_property',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'nc_bedrooms',
            'value' => sanitize_text_field( $_GET['bedrooms'] ),
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'nc_type',
            'value' => sanitize_text_field( $_GET['type'] ),
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'nc_location',
            'value' => sanitize_text_field( $_GET['location'] ),
            'compare' => 'LIKE'
        )
    )
);

必要に応じて適切な衛生管理を使用するか、$_GETデータのホワイトリスト値をチェックする関数を使用してください。

また、条件の機能を確認してください - それが検索要求であるなら(クエリパラメータとしてsを使って)クエリを変更するか、ifステートメントを変更します。

3
fischi