1

I am stuck trying to get a custom column to sort according to a custom field. I have two custom post types: Brand and Product. I would like the Product admin screen to have a "Brand" column, and for that "Brand" column to be sortable by the custom field _wpcf_belongs_brand-listing_id.

I was able to successfully add a new "Brand" column to the "Product" admin screen

I then successfully registered the Brand column as sortable. The "Brand" custom column has a key of brand and a value of _wpcf_belongs_brand-listing_id, which is the custom field I want to sort by.

//Register the Brand column in the Product admin page as sortable.    
add_filter( 'manage_edit-eproduct_sortable_columns', 'vendia_sortable_brand_column');

function vendia_sortable_brand_column( $sortable_columns ){
    $sortable_columns[ 'brand' ] = '_wpcf_belongs_brand-listing_id';
    debug($sortable_columns);
    return $sortable_columns;
}  

To confirm the above function worked correctly, I use a debug() function that sends the output of print_r() to Firebug's console.
The debug() function output is:

Array
    (
        [title] => title
        [parent] => parent
        [comments] => comment_count
        [date] => Array
            (
                [0] => date
                [1] => 1
            )
        [brand] => _wpcf_belongs_brand-listing_id
    )

So I know that the "Brand" custom column is registered correctly.

However, my "Brand" custom column sort function is not working. I would like to sort this column by the custom field _wpcf_belongs_brand-listing_id.

//Tell WordPress what to sort by in the Brand column of the Product admin page.
add_action( 'pre_get_posts', 'vendia_brand_column_orderby' );
function vendia_brand_column_orderby( $query ) {

    if( ! is_admin() )
        return;

    $orderby = $query->get( 'orderby' );
    echo $orderby;

    if( '_wpcf_belongs_brand-listing_id' == $orderby ) {
        $query->set('meta_key','_wpcf_belongs_brand-listing_id');
        $query->set('orderby','meta_value');
    }

}

For some reason I don't understand, my debugging statement of echo $orderby; returns a value of date for the key orderby for every sortable column. I was the expecting orderby parameter to take on the values of "title", "parent", "comment_count", "date", and "_wpcf_belong_brand-listing_id". Those are the values associated with each custom column key, output by my debugging function above.

According to http://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters

date is simply the default value for the orderby parameter of WP_Query. So it seems like the WP_Query has not been changed from its defaults at this point, meaning, at the point that pre_get_posts fires. However, every example I have seen that discusses adding a custom column, and making it sortable, uses pre_get_posts for changing the orderby parameter for the custom columns.

So am I using the wrong WordPress action (pre_get_posts) to change the orderby parameter for custom columns ? If not, why is my WP_Query returning date as the orderby parameter for every custom column?

Thank you for your help. I know this was a really long question.

  • Try checking for $query->is_main_query() also - eg if( ! is_admin() || ! $query->is_main_query() ) return; ... – bonger Oct 5 '15 at 12:27
  • 1
    That did it @bonger. Thanks so much. Struggled with this for days. Wish you made this an answer so I could upvote it. – LeonardShelby Oct 5 '15 at 17:42

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.