私はユーザーがメタデータで検索できるようにする必要があるカスタム投稿タイプ '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
この場合、あなたがリクエストパーマリンクとかなりのパーマリンクを混ぜるので、私はあなたのクエリで$_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
ステートメントを変更します。