使用元查询自定义搜索


Custom search using meta query

我一直在构建一个自定义搜索。搜索功能有许多下拉菜单,用户可以留空,也可以从众多选项中选择。这些数据保存在'wine-note'自定义帖子类型的帖子的自定义字段中。

到目前为止,它正在工作。我的搜索结果页面是这样的:

<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts( array(
'post_type' => 'wine-note',
'posts_per_page' => '10',
'paged' => $paged,
'meta_query' => array(
    array(
        'key' => 'vintage',
        'value' => $vintage_select,
        'compare' => 'LIKE'
        ),
    array(
        'key' => 'full_list_regions',
        'value' => $region_select,
        'compare' => 'LIKE'
        ),
    array(
        'key' => 'producer_name',
        'value' => $winery_select,
        'compare' => 'LIKE'
        ),
    array(
        'key' => 'S100',
        'value' => $score_100_from,
        'compare' => '>='
        ),
    array(
        'key' => 'S100',
        'value' => $score_100_to,
        'compare' => '<='
        ),
    array(
        'key' => 'S20',
        'value' => $score_20_from,
        'compare' => '>='
        ),
    array(
        'key' => 'S20',
        'value' => $score_20_to,
        'compare' => '<='
        ),
    array(
        'key' => 'wine_rating',
        'value' => $rating_from_select,
        'compare' => '>='
        ),
    array(
        'key' => 'wine_rating',
        'value' => $rating_to_select,
        'compare' => '<='
        )
        )
        ) );?>

这样做的问题是,即使下拉选择器为空,搜索也会排除任何没有特定自定义字段的帖子。

。e -只显示所有自定义字段(数据或非数据)的帖子。

因此,我稍微修改了一下代码,添加了一些if语句,以便仅在用户从下拉菜单中选择选项时搜索自定义字段。我的搜索结果代码现在看起来像这样:

 <?php
 $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
 query_posts( $args = array(
'post_type' => 'wine-note',
'posts_per_page' => '10',
'paged' => $paged,
'meta_query' => array(
        )
        ) 
 if ($vintage_select) {
$args['metaquery'][] = array(
    'key' => 'vintage',
    'value' => $vintage_select,
    'compare' => 'LIKE'
);
 }
 if ($region_select) {
$args['metaquery'][] = array(
    'key' => 'full_list_regions',
    'value' => $region_select,
    'compare' => 'LIKE'
);
 }
 if ($winery_select) {
$args['metaquery'][] = array(
    'key' => 'producer_name',
    'value' => $winery_select,
    'compare' => 'LIKE'
);
}
if ($score_100_from) {
$args['metaquery'][] = array(
    'key' => 'S100',
    'value' => $score_100_from,
    'compare' => '>='
);
}
if ($score_100_to) {
$args['metaquery'][] = array(
    'key' => 'S100',
    'value' => $score_100_to,
    'compare' => '<='
);
}
if ($score_20_from) {
$args['metaquery'][] = array(
    'key' => 'S20',
    'value' => $score_20_from,
    'compare' => '>='
);
}
if ($score_20_to) {
$args['metaquery'][] = array(
    'key' => 'S20',
    'value' => $score_20_to,
    'compare' => '<='
);
}
if ($rating_from_select) {
$args['metaquery'][] = array(
    'key' => 'wine_rating',
    'value' => $rating_from_select,
    'compare' => '>='
);
}
if ($rating_to_select) {
$args['metaquery'][] = array(
    'key' => 'wine_rating',
    'value' => $rating_to_select,
    'compare' => '<='
);
}
);
?>

现在,由于某种原因,这会导致自定义字段下拉选择器无法工作。无论用户输入什么,都会返回所有搜索结果,这里的"所有"指的是该自定义帖子类型的所有帖子。

我对上面的代码做错了什么?我好像搞不懂这个!

顺便说一下,我在搜索结果PHP模板的顶部使用下面的代码正确地定义了所有变量:
<?php
$vintage_select = $_POST['vintage_select'];
$region_select = $_POST['region_select'];
$winery_select = $_POST['winery_select'];
$score_100_from = $_POST['score_100_from'];
$score_100_to = $_POST['score_100_to'];
$score_20_from = $_POST['score_20_from'];
$score_20_to = $_POST['score_20_to'];
$rating_from_select = $_POST['rating_from_select'];
$rating_to_select = $_POST['rating_to_select'];
?>

第二个代码片段混乱。在query_posts()函数的参数列表中有条件。

首先创建并填充您的'meta_query'项目,然后将其传递给您的$args数组。

的例子:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$metaList = [
    'vintage_select'=>['vintage','LIKE'],
    'region_select'=>['full_list_regions','LIKE'],
    'winery_select'=>['producer_name','LIKE'],
    'score_100_from'=>['S100','>='],
    'score_100_to'=>['S100','<='],
    'score_20_from'=>['S20','>='],
    'score_20_to'=>['S20','<='],
    'rating_from_select'=>['wine_rating','>='],
    'rating_to_select'=>['wine_rating','<='],
];
$metaQuery = [];
foreach ($metaList as $key=>$item)
    if(isset($$key) && $$key) $metaQuery[] = ['key'=>$item[0], 'compare'=>$item[1], 'value'=>$$key];
$args = [
    'post_type' => 'wine-note',
    'posts_per_page' => '10',
    'paged' => $paged,
    'metaquery'=> $metaQuery
];
query_posts( $args );