我有一个自定义的帖子类型“属性”,我的用户需要能够通过元数据进行搜索。
我有3个搜索功能-2个在前端1个在管理区域-其中2个按预期运行,另一个似乎根本没有过滤结果。
我认为自定义query\\u vars的定义或使用可能有问题。
在我的功能中。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\');
无论是在前端还是后端,按属性代码进行搜索都没有问题,但是尝试按自定义查询变量(位置、类型和卧室)过滤结果每次都会失败。
创建的查询字符串示例如下:
/property/?post_type=nc_property&which_form=meta_form&bedrooms=Two&type=Apartment&location=Bahceli
网站上有一个属性与这些详细信息匹配,但WordPress每次都会返回所有结果。
我错过什么了吗?
编辑:事实证明,因为我的元查询搜索表单没有使用\'s\'
作为其名称$query->is_search
if语句的条件返回false,这意味着没有调用我的meta\\u查询。
菲斯基为我发现了这一点,真是太好了!:D
最合适的回答,由SO网友:fischi 整理而成
在本例中,当您将相当长的永久链接与请求参数混合时,我将使用$_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
陈述