按一个自定义字段过滤,按另一个排序?


10

我有一个自定义帖子类型“列表”,我想获取所有具有自定义字段的列表gateway_value != 'Yes',并按另一个自定义字段排序结果location_level1_value。我可以使查询分开工作,但是不能将它们合并:

查询1(按位置排序):

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'post_status' => 'publish',
                    'posts_per_page' => '9',
                    'meta_key' => 'location_level1_value',
                    'orderby' => 'location_level1_value',
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                 );

查询2(自定义字段值!=是):

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'posts_per_page' => '9',
                    'post_status' => 'publish',
                    'meta_key' => 'gateway_value',
                    'meta_value' => 'Yes',
                    'meta_compare' => '!=',
                    'paged' => $paged
                    )
                );

组合查询:

我在法典上寻求帮助,但是以下查询无效:

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'posts_per_page' => '9',
                    'post_status' => 'publish',
                    'meta_query' => array(
                        array(
                            'key' => 'gateway_value',
                            'value' => 'Yes',
                            'compare' => '!='
                        ),
                        array(
                            'key' => 'location_level1_value'
                        )
                    ),
                    'orderby' => "location_level1_value",
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                );

合并查询出现了什么问题?

[更新]:因此,现在已经发布了3.1,上面的组合查询仍然不起作用。我确实得到结果,只是排序不正确。

[更新]:var_dump($wp_query->request)提供以下内容:
string(527) " SELECT SQL_CALC_FOUND_ROWS wp_7v1oev_posts.* FROM wp_7v1oev_posts INNER JOIN wp_7v1oev_postmeta ON (wp_7v1oev_posts.ID = wp_7v1oev_postmeta.post_id) INNER JOIN wp_7v1oev_postmeta AS mt1 ON (wp_7v1oev_posts.ID = mt1.post_id) WHERE 1=1 AND wp_7v1oev_posts.post_type = 'listing' AND (wp_7v1oev_posts.post_status = 'publish') AND wp_7v1oev_postmeta.meta_key = 'gateway_value' AND CAST(wp_7v1oev_postmeta.meta_value AS CHAR) != 'Yes' AND mt1.meta_key = 'location_level1_value' ORDER BY wp_7v1oev_posts.post_date DESC LIMIT 0, 9"


3
您正在使用WordPress 3.1吗?该meta_query参数是3.1中的新增功能,由于即将发布,但当前的稳定版本仍是3.0.5,没有此参数。
Jan Fabry'2

嗯...对,那可能就是为什么。有什么办法可以使其在3.0.5中工作?
gillespieza 2011年

米尔延科有一个最好的答案,你应该接受他而不是你的。
雨果2012年

Answers:


9

您可以通过使用带有过滤选项的“ meta_query”来使用查询来过滤所需内容,对于订单部分,只需添加/修改以下参数即可:

  • 'orderby'=>'meta_value'
  • 'meta_key'=>'location_level1_value'
  • '订单'=>'ASC'

    $wp_query = new WP_Query( array (
        'post_type'      => 'listing',
        'posts_per_page' => '9',
        'post_status'    => 'publish',
        'meta_query'     => array(
            array(
                'key'       => 'gateway_value',
                'value'     => 'Yes',
                'compare'   => '!='
            )
        ),
        'orderby'  => 'meta_value',            // this means we will be using a selected 
                                               // meta field to order
    
        'meta_key' => 'location_level1_value', // this states which meta field 
                                               // will be used in the ordering, 
                                               // regardless of the filters
        'order'    => 'ASC',
        'paged'    => $paged
        )
    );

2

就像Jan在新的WordPress 3.1中所说的那样,您可以使用,meta_query但是直到出来为止,您可以使用First查询来排序并过滤循环,如下所示:

 Global $my_query;
$my_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'post_status' => 'publish',
                    'posts_per_page' => '9',
                    'meta_key' => 'location_level1_value',
                    'orderby' => 'location_level1_value',
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                 );
while ($my_query->have_posts){
    $my_query->the_post();
              //do your loop stuff
} 

并将此代码添加到您的functions.php

   //join filter
         add_filter('posts_join', 'listing_join_865' );
         function listing_join_865($join){
Global$ my_query;            
if ('listing' = $my_query->query['post_type']){
                $restriction1 = 'gateway_value';
                return $join .="
                LEFT JOIN $wpdb->postmeta AS $restriction1 ON(
                $wpdb->posts.ID = $restriction1.post_id
                AND $restriction1.meta_key = '$restriction1'
                )";
             }else {
                return $join;
            }
         }
         //where filter
         add_filter('posts_where', 'listing_where_865' );
         function listing_where_865($where){
             global $my_query;
            if ('listing' = $my_query->query['post_type']){
                return $where.= " AND $restriction1.meta_value != 'yes'";
            }else{
                return $where;
            }
         }

现在这应该工作。


谢谢你 这行得通,除了我有一个奇怪的副作用,即我的页面调度不再正常工作。而不是每页9个,我在网格中有“空白点”,而自定义帖子gateway_value == "Yes"本来是没有条件的……关于如何解决此问题的任何想法?
gillespieza 2011年

是的,那会弄乱分页,所以我想绕着它的唯一方法是自定义sql查询,请给我几分钟。
Bainternet '02

不用担心-我将只使用第二个查询并使用插件wordpress.org/extend/plugins/post-types-order直到3.1发布:)
gillespieza 2011年

大坝,我刚找到解决方案后就回来查看您的评论。无论如何,这里都是供未来的提问者使用的。
Bainternet

1
@ t31os-我通常这样做,但是从手机接听时却不这样做。
Bainternet

1

很抱歉回答我自己的问题:

查看[http://core.trac.wordpress.org/ticket/15031][1],似乎这是一个已知问题。我已经修复(破解了)它可以使用post_filter,就像这样(仅供参考,可能正在搜索相同的答案):

在functions.php ###中

add_filter('posts_orderby', 'EV_locationl1' );
function EV_locationl1 ($orderby) {
    global $EV_locationl1_orderby;
    if ($EV_locationl1_orderby) $orderby = $EV_locationl1_orderby;
    return $orderby;
}

在模板文件中修改了wp_query ###

$EV_locationl1_orderby = " mt1.meta_value ASC";

$wp_query = new WP_Query( array (
    'post_type' => 'listing',
    'posts_per_page' => '9',
    'post_status' => 'publish',
    'meta_query' => array(
            array(
                    'key' => 'gateway_value',
                    'value' => 'Yes',
                    'compare' => '!='
                    ),
            array(
                    'key' => 'location_level1_value'
            )
        ),
    'order' => $EV_locationl1_orderby,
    'paged' => $paged
    ));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.