1

I need to allow post ordering in certain categories. One of the sorting options is a custom field meta value. First problem is that not all posts have that meta assigned and i need to order these by date (default).

Another problem is that meta field should use ASC order and the rest DESC.

My code so far

In Template File:

$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 ); }

functions.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 Answers 2

2

Assuming the rest works, why not order the normal way:

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

I had something similar, where I ordered CPTs with an 'order' field, but not all of them had an assignement value, my order by :

 //SELECT
 //FROM
 //WHERE
 ORDER BY
      wp_postmeta.meta_value = '' ASC,
      wp_postmeta.meta_key ASC,
      wp_posts.post_date DESC

Results in ordering the posts with order field first, then orders the posts with no value by post date in descending order.

1
  • Hmm, didn't see the date, this question appeared at the top of my RSS feed...
    – Shane
    Commented Dec 23, 2011 at 17:33

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.