Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用元查询的自定义搜索_Php_Mysql_Search - Fatal编程技术网

Php 使用元查询的自定义搜索

Php 使用元查询的自定义搜索,php,mysql,search,Php,Mysql,Search,我一直在建立一个自定义搜索。该搜索具有许多下拉列表,用户可以将其留空,也可以从许多选项中进行选择。此数据保存在“wine note”自定义帖子类型的帖子中的自定义字段中 到目前为止,它在某种程度上起了作用。我的搜索结果页面如下所示: <?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; query_posts( array( 'post_type' => 'wine-note', 'posts_pe

我一直在建立一个自定义搜索。该搜索具有许多下拉列表,用户可以将其留空,也可以从许多选项中进行选择。此数据保存在“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' => '<='
        )
        )
        ) );?>
 <?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' => '<='
);
}
);
?>

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

即-仅显示所有自定义字段(数据或非数据)存在的帖子

因此,我稍微修改了我的代码,添加了一些if语句,以便在用户从下拉列表中选择选项时仅搜索该自定义字段。 我的搜索结果代码现在如下所示:

<?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' => '<='
        )
        )
        ) );?>
 <?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\u posts()
函数的参数列表中有条件

在将“元查询”项传递到
$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 );
$paged=(获取查询变量('paged'))?获取查询变量('paged'):1;
$metaList=[
“复古”\u select'=>[“复古”、“喜欢”],
“区域选择”=>[“完整区域列表”、“类似”],
“酿酒厂选择”=>[“生产商名称”,“类似”],
'从'=>['S100','>=']获得100分,
'得分100分至'=>['S100','='],
'得分20分到'=>['S20','='],

“rating_to_select”=>[“wine_rating”,“将从“query_posts()”中删除“$args”,并将其添加到“meta_query=>$args=array”(“解决问题”?我已将代码更改为“query_posts”(array('post_type'=>'wine note','posts per_page'=>'10','paged'=>$paged,'meta_query'=>$args=array()))但不好!我在上面的代码中将“metaquery”改为“meta_query”,它工作起来很有魅力!!!