ORDERBY定制字段元值ASC,然后按日期DESC

时间:2011-10-21 作者:Z. Zlatev

我需要允许在某些类别中进行后期订购。排序选项之一是自定义字段元值。第一个问题是,并不是所有的帖子都分配了那个meta,我需要按日期(默认)排序。

另一个问题是元字段应该使用ASC order和rest DESC。

到目前为止我的代码

在模板文件中:

$request = $_REQUEST;
global $query_string;
parse_str( $query_string, $qs_arr );

switch ( $request[\'sort\'] ) {

    case \'title\':
        $qs_arr[\'orderby\'] = \'title\';
        $qs_arr[\'order\'] = \'ASC\';
        break;
    case \'publisher\':
        $qs_arr[\'meta_key\'] = \'discography_publisher\';
        $qs_arr[\'orderby\'] = \'meta_value\';

        add_filter( \'posts_orderby\', \'sort_posts_orderby\' );
        add_filter( \'get_meta_sql\', \'sort_get_meta_sql\' );
        add_filter( \'posts_where\' , \'sort_posts_where\' );
        break;
}

if ( isset( $request[\'sort\'] ) ) { query_posts( $qs_arr ); }
功能。php

function sort_get_meta_sql( $meta_sql ) {
    $meta_sql[\'join\'] = " LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = \'discography_publisher\') ";
    return $meta_sql;
}

function sort_posts_where( $where ) {
    //here i remove the last statement "wp_postmeta.meta_key = \'discography_publisher\' " so query return all posts in category 
    $explode = explode( \'AND\', $where );
    array_pop( $explode );
    return implode( \'AND\', $explode );
}



function sort_posts_orderby( $orderby ) {
    $orderby = \'COALESCE(wp_postmeta.meta_value, wp_posts.post_date) DESC\';
    return $orderby;
}

2 个回复
SO网友:EarnestoDev

假设其余部分都能正常工作,为什么不按正常方式订购呢

function sort_posts_orderby( $orderby ) {
    $orderby = \'wp_postmeta.meta_value ASC, wp_posts.post_date DESC\';
    return $orderby;
}

SO网友:Shane

我也有类似的做法,我用“order”字段订购了CPT,但并不是所有CPT都有赋值,我的订单是:

 //SELECT
 //FROM
 //WHERE
 ORDER BY
      wp_postmeta.meta_value = \'\' ASC,
      wp_postmeta.meta_key ASC,
      wp_posts.post_date DESC
结果是先使用订单字段对帖子进行排序,然后按发布日期降序对没有值的帖子进行排序。

结束

相关推荐