通过插件创建搜索过滤器

时间:2016-06-13 作者:Vinícius Óliver

我正在使用wordpress进行房地产项目,为此,我将一个主题与一个插件(realia real estate)一起用于房地产。所以我相信这不是离题。。。我的问题很简单,我有几个自定义meta\\u键,如property\\u baths(bathrooms)、property\\u beds(rooms)等。。。我想做的是在wordpress管理中的“帖子”选项卡中创建一个过滤器,一个高级搜索。我还需要此搜索是累积的,例如,如果“浴室”和“房间”都已填充,则应根据已填充的内容过滤帖子。

经过多次搜索,我找到了一种方法,通过创建一个插件来实现这一点,但我这里的代码,它只传递1个meta\\u键和你的meta\\u值,我需要它传递几个meta\\u键和它们的值。。。

到目前为止,我得到的是:

add_action( \'restrict_manage_posts\', \'wpse45436_admin_posts_filter_restrict_manage_posts\' );

function wpse45436_admin_posts_filter_restrict_manage_posts(){
    $type = \'property\';
    if (isset($_GET[\'post_type\'])) {
        $type = $_GET[\'post_type\'];
    }

    //only add filter to post type you want
    if (\'property\' == $type){
        //change this to the list of values you want to show
        //in \'label\' => \'value\' format
        $values = array(
            \'Banheiros\' => \'property_baths\', 
            \'Quartos\' => \'property_beds\'
        );

        $current_v = isset($_GET[\'ADMIN_FILTER_FIELD_VALUE\'])? $_GET[\'ADMIN_FILTER_FIELD_VALUE\']:\'\';
        foreach ($values as $label => $value) {
            printf
            (
            \'<input type="text" name="%s"%s placeholder="%s"></option>\',
            $value, 
            $value == $current_v? \' value="\'.$current_v.\'"\':\'\', 
            $label 
            );
        }
    }
}

add_filter(\'parse_query\', \'wpse45436_posts_filter\');

function wpse45436_posts_filter( $query ){
    global $pagenow;
    $type = \'property\';
    if (isset($_GET[\'post_type\'])) {
        $type = $_GET[\'post_type\'];
    }
    if ( \'property\' == $type && is_admin() && $pagenow==\'edit.php\' && isset($_GET[\'property_baths\']) && $_GET[\'property_baths\'] != \'\') {

        $query->query_vars[\'meta_key\'] = \'property_baths\';
        $query->query_vars[\'meta_value\'] = $_GET[\'property_baths\'];
    }
}
有了这个代码(插件),我只能过滤1个meta\\u键,我需要这样做,我可以使用几个“meta\\u键”及其值。

我试过循环,试过数组,但都没用。我希望有人能帮助我。。。提前感谢。。。

1 个回复
SO网友:Paul Zee

您可以添加多个筛选器调用,因此每个meta_key\'可以在单独的代码中处理,执行时将累计调整查询。

也许看看pre_get_posts 筛选而不是parse_query (尽管我建议的解决方案可能在任何一种情况下都有效)。pre_get_posts 允许您在WordPress执行当前查询之前访问该查询,并且您将限制查询从数据库中获取的帖子。

我还没有测试过这段代码:这只是针对您的代码进行的编辑,以向您展示如何实现这一点(因此请检查语法中的错误)。

你最终会得到这样的结果:

add_filter(\'pre_get_posts\', \'wpse45436_property_baths_posts_filter\');

function wpse45436_property_baths_posts_filter( $query ){
    global $pagenow;
    $type = \'property\';
    if (isset($_GET[\'post_type\'])) {
        $type = $_GET[\'post_type\'];
    }
    if ( \'property\' == $type && is_admin() && $pagenow==\'edit.php\' && isset($_GET[\'property_baths\']) && $_GET[\'property_baths\'] != \'\') {

        $query->query_vars[\'meta_key\'] = \'property_baths\';
        $query->query_vars[\'meta_value\'] = $_GET[\'property_baths\'];
    }
}

add_filter(\'pre_get_posts\', \'wpse45436_property_beds_posts_filter\');

function wpse45436_property_beds_posts_filter( $query ){
    global $pagenow;
    $type = \'property\';
    if (isset($_GET[\'post_type\'])) {
        $type = $_GET[\'post_type\'];
    }
    if ( \'property\' == $type && is_admin() && $pagenow==\'edit.php\' && isset($_GET[\'property_beds\']) && $_GET[\'property_beds\'] != \'\') {

        $query->query_vars[\'meta_key\'] = \'property_beds\';
        $query->query_vars[\'meta_value\'] = $_GET[\'property_beds\'];
    }
}
检查Codex 有关pre_get_posts 滤器