按元数据搜索自定义帖子类型

时间:2014-01-28 作者:Jazibobs

我有一个自定义的帖子类型“属性”,我的用户需要能够通过元数据进行搜索。

我有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

1 个回复
最合适的回答,由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 陈述

结束