meta_query按2个键排序


8

我需要按2个自定义字段值对(自定义)帖子进行排序...

自定义字段名称1:is_sponsored[值可以是10]

自定义字段名称2:sfp_date[ timestampaka当前发布日期,以秒为单位]

is_sponsored”值为1的帖子需要放在最上面,并按“ sfp_date”的DESC结尾顺序排序。is_sponsored值“ ”为0的所有其他帖子也应在下方列出-降序排列(按“ sfp_date”)。

我有类似的东西:

$sfp_query_args = array(
    'tax_query'   => array( 
        array( 
            'taxonomy' => 'sfp_posts',
            'terms'    => array( 1, 5, 8 )
        )
    ),
    'post_type'   => 'sfpposts',
    'post_status' => 'publish',
    'showposts'   => 15,
    'paged'       => $paged,
    'meta_key'    => 'sfp_date', 
    'orderby'     => 'meta_value_num', 
    'order'       => 'DESC', 
    'meta_query'  => array(
        'key'          => 'is_sponsored',
        'value'        => 2,
        'type'         => 'NUMERIC',
        'compare'      => '<='
    )
);
$wp_q = new WP_Query( $sfp_query_args );

...但不起作用。有任何想法吗?


编者注:这是一个小插件,应显示查询的外观,因为我们可能没有任何数据集可用于测试。

<?php
/** Plugin Name: (#67600) Dump Query parts */
function wpse67600_dump_query_parts( $pieces )
{
    echo '<pre>'.var_export( $pieces, true ).'</pre>';
    return $pieces;
}
add_filter( 'posts_clauses', 'wpse67600_dump_query_parts' );

请在此处添加插件的输出-使用“编辑”链接

由Dameer编辑

好的,在跟踪请求和各种解决方法之后,我提出了以下解决方案...

如果我稍微简化一下“ $ sfp_query_args”,结果将接近所需的结果,但是仍然无法按顺序对帖子进行排序。这里是:

$sfp_query_args1 = array(
    'tax_query' => array( array( 'taxonomy' => 'sfp_post_category', 'terms' => $cat_id_arr ) ),
    'post_type' => 'sfpposts',
    'post_status' => 'publish',
    'showposts' => (int)$per_page,
    'paged' => $paged,
    'meta_key' => 'is_sponsored', 
    'orderby' => 'meta_value date'
);
  • * orderby具有两个属性:meta_value和date *

因此$ wpdb-> request中带有上述参数的查询看起来像这样:

SELECT SQL_CALC_FOUND_ROWS $wpdb->posts.ID 
FROM $wpdb->posts 
INNER JOIN $wpdb->term_relationships 
ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
INNER JOIN $wpdb->postmeta 
ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) 
WHERE 1=1 
AND $wpdb->posts.post_type = 'sfpposts' 
AND ($wpdb->posts.post_status = 'publish') 
AND ($wpdb->postmeta.meta_key = 'is_sponsored' ) 
GROUP BY $wpdb->posts.ID 
ORDER BY $wpdb->postmeta.meta_value, $wpdb->posts.post_date DESC 
LIMIT 0, $per_page

最后,为了也可以按meta_value进行排序,应将查询设置为只有一点点不同:

SELECT SQL_CALC_FOUND_ROWS $wpdb->posts.ID 
FROM $wpdb->posts 
INNER JOIN $wpdb->term_relationships 
ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
INNER JOIN $wpdb->postmeta 
ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) 
WHERE 1=1 
AND $wpdb->posts.post_type = 'sfpposts' 
AND ($wpdb->posts.post_status = 'publish') 
AND ($wpdb->postmeta.meta_key = 'is_sponsored' ) 
GROUP BY $wpdb->posts.ID 
ORDER BY $wpdb->postmeta.meta_value [!ORDER MISSING!], $wpdb->posts.post_date DESC 
LIMIT 0, $per_page

请找出[!ORDER MISSING!]占位符。我想以上应该可以解释问题出在哪里。


我不相信您可以使用默认的WP_Query类做到这一点。即使在文档中,它也显示“如果meta_value是数组,您是否知道如何对查询进行排序?在此处编写”。为此,您可能必须编写自己的SQL查询。
米哈·雷卡尔

是的,我知道这个问题还没有解决,但是我认为这是个正确的解决方法:)
Dameer 2012年

我为您的问题添加了一个小插件,因此您可以向我们展示最终的SQL查询部分。请使用该信息编辑您的问题。谢谢。
kaiser 2012年

哦,这是有关问题的一些一般性排序信息
kaiser 2012年

Answers:


2

好的,最后的解决方法是拆分查询:

$sfp_query_args = array(
    'tax_query' => array( array( 'taxonomy' => 'sfp_post_category', 'terms' => $cat_id_arr ) ),
    'meta_key' => 'is_sponsored',
    'post_type' => 'sfpposts',
    'post_status' => 'publish',
    'showposts' => (int)$per_page,
    'paged' => $paged
);

...并使用“ posts_orderby”过滤器修改ORDER部分:

add_filter( 'posts_orderby', 'sfp_modify_orderby' );
function sfp_modify_orderby( $orderby ) {
    if( !is_admin() && is_tax( 'sfp_post_category' ) ) {
        global $wpdb;
        $orderby = " $wpdb->postmeta.meta_value DESC, $wpdb->posts.post_date DESC ";
    }
    return $orderby;
}

最有可能需要在页面上循环后删除过滤器,以防止'posts_orderby'影响任何其他查询(侧栏或页脚)。因此,这是另一个要放入“ functions.php”的函数:

function sfp_remove_orderby_filter() {
    remove_filter( 'posts_orderby', 'sfp_modify_orderby' );
}

...并在页面上使用我们的查询丢弃过滤器:

if( have_posts() ) : while( have_posts() ) : the_post();
    // code
endwhile;
else :
    // code
endif;

sfp_remove_orderby_filter();

希望这是有道理的!


-1

我写您的查询稍作修改。希望对您有所帮助。

$sfp_query_args = array(
    'tax_query' => array( array( 'taxonomy' => 'sfp_posts', 'terms' => array( 1, 5, 8) ) ),
    'post_type' => 'sfpposts',
    'post_status' => 'publish',
    'showposts' => 15,
    'paged' => $paged, 
    'meta_key'=>'sfp_date', 
    'meta_query' => array(
    array(
        'key' => 'sfp_date',
            'type' => 'NUMERIC',
    ),
    array(
        'key' => 'is_sponsored',
        'value' => '2',
        'compare' => '<='
    )       
    ),
    'orderby' => 'meta_value_num', 
    'order' => 'DESC',
);
$wp_q = new WP_Query( $sfp_query_args );

请让我知道它是否有效:-)


2
这将是默认的排序方式(按日期),因为您不提供“ meta_key”。
米哈·雷卡

谢谢@MihaRekar,这是一个错误感谢您的修正
马里兰州Toufiqul伊斯兰教

恐怕它不起作用,它只会按日期对帖子进行排序,而不会将“ is_sponsored”值为1的那些帖子放在顶部。
Dameer

我正在寻找解决方案。可能@MihaRekar是正确的。您可能必须为此编写自定义的SQL查询
马里兰州Toufiqul伊斯兰教

有没有办法提供“正常” mySQL查询的示例?
Dameer 2012年
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.