当前位置: 首页 > 知识库问答 >
问题:

使用元查询的自定义搜索

戚阳
2023-03-14

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

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

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

因此,我稍微修改了我的代码,添加了一些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'];
?>

共有1个答案

文国发
2023-03-14

第二个代码片段被弄乱了。在参数列表中有query_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 );
 类似资料:
  • 1. 简介 分析云作为企业进行全域用户行为数据分析的数据中台,需要满足企业不同业务角色的各类差异化分析需求。 其中,对于企业深度结合业务模式的定制化需求,分析云平台提供了“自定义SQL查询”的功能,支持业务人员自行编辑复杂的 SQL 查询语言,实现对平台数据仓库中最底层的细粒度用户行为数据进行分析操作,以获取当前分析云平台既有数据模型无法覆盖的个性化分析需求的结果。 2. 使用说明 当前 sql

  • 我正在努力让wordpress从页面模板中搜索自定义帖子元。我在互联网上到处找,似乎找不到任何有用的东西。没有插件似乎也能工作。 在我的帖子中,我有一个自定义的meta:“rate”和值:“10”-Wordpress在搜索这些内容时不会给出任何结果。 如果有人能给我写一个搜索页面,我将不胜感激。php页面模板或为我指出正确的方向(我不擅长php)。 以下是我当前的PHP代码:

  • 我想使用@Query批注从具有@OneTo许多关系的实体创建左连接查询。 母公司是: 孩子: 对于DAO,我确实喜欢以下内容: 显然,它是错误的,因为生成的查询是: 选择payment1。uuid为uuid1_9_,付款1_。注册时内部加入付款1的注册金额。uuid=payment1_uid。uuid在哪里注册。效果=? 在生成关系表时: 对我来说,正确的查询应该是这样的: 选择p.*从注册r加入

  • 我通过扩展将REST数据与Panache一起用于生成JAX RESTful Web服务。在Spring land中,有一种query builder机制,允许Spring数据存储库根据自定义方法签名的名称和返回类型生成SQL查询。 我试图用Panache来实现同样的事情,但到目前为止没有成功。

  • 我在这里创建了一个类似于教程的Web应用程序:https://spring.io/guides/tutorials/react-and-spring-data-rest/ . 我已经添加了后gresql数据库,一切正常。我有一个基本查询查找我的存储库中的By用户名(字符串名称),工作正常。我的问题是,由于某种原因我无法创建自定义查询,例如 . 假设我做了一个测试,我只想得到这个语句的值。我说的不能

  • 我是Spring Data投影的新手,我正在尝试在一个新项目中使用此功能。 特别是,我想在与复杂查询关联的回购方法上使用投影。 我用注释注释了我的方法,并声明了一个JPA查询,其中包含几个连接的表/实体和一个复杂的where条件。 在本文中,我了解到可以使用基于接口的投影和基于类的投影,但只有第一个支持嵌套投影。 我需要嵌套投影,但似乎只有使用基于接口的投影才支持此功能,并且这种方法仅适用于自动生