1

Good afternoon!

This is an issue regarding the Wordpress backend and custom post types. I have spent all Friday searching and trying possible solutions and, while they helped others, in my case they're not doing what I need.

Status quo

I have a custom post type called "anco_project" it uses very few WP given data-fields but more custom ones from the ACF addon including a field called "anco_project_year_from" and one called "anco_project_year_to", both set up as a 'true number' format.

The goal: Since those two fields contain years of a construction's start and end, I want to have them sorted by the numbers given. 1998, 2006, 2012, 2016, 2016

Frontend: With following code I managed to sort the projects by their starting year without any problem.

    $args = array(
            'post_type' => 'anco_project',
            'posts_per_page' => -1,
            'meta_key' => 'anco_project_year_from',
            'orderby' => 'meta_value_num',
            'order' => 'ASC'
    );
    query_posts($args);

Backend: Here I followed several guides I can't recall URLs anymore (my brain kinda got wiped over the weekend) but the 'final' solution from Friday looks like this.

    // Administration: Register columns as sortable
    function anco_project_manage_sortable_columns( $columns ) {
            $columns['anco_project_year_from'] = 'anco_project_year_from';
            $columns['anco_project_year_to'] = 'anco_project_year_to';
            return $columns;
    }
    add_filter( 'manage_edit-anco_project_sortable_columns', 'anco_project_manage_sortable_columns' );


    // Administration: Teach wordpress to make the column sortable
    function anco_project_year_column_orderby( $vars ) {
            if ( isset( $vars['orderby'] ) && 'anco_project_year_from' == $vars['orderby'] ) {
                    $vars = array_merge( $vars, array(
                            'meta_key' => 'anco_project_year_from',
                            'orderby' => 'meta_value_num'
                    ) );
            } else if ( isset( $vars['orderby'] ) && 'anco_project_year_to' == $vars['orderby'] ) {
                    $vars = array_merge( $vars, array(
                            'meta_key' => 'anco_project_year_to',
                            'orderby' => 'meta_value_num'
                    ) );
            }
            return $vars;
    }
    add_filter( 'request', 'anco_project_year_column_orderby' );

I rechecked all the hooks used and it looks as if it should work like this.

The problem

From the code above I get pretty filters at the headers and it actually does something when pressing them, but it's not sorting by anything that would make sense.

an example

Posttype opened fresh in backend without any filters. URL: /wp-admin/edit.php?post_type=anco_project

enter image description here

Posttype sorted by 'from'.

URL: /wp-admin/edit.php?post_type=anco_project&orderby=anco_project_year_from&order=asc enter image description here

When I sort by 'anco_project_year_to' or change the code to sort by the 'location' column it always ends up like the second image's order. Reversing the order from ASC to DESC doesn't change the ordering either.

Did anyone experience the same problem and has a solution for it?

0

Remove this:

// Administration: Teach wordpress to make the column sortable
    function anco_project_year_column_orderby( $vars ) {
            if ( isset( $vars['orderby'] ) && 'anco_project_year_from' == $vars['orderby'] ) {
                    $vars = array_merge( $vars, array(
                            'meta_key' => 'anco_project_year_from',
                            'orderby' => 'meta_value_num'
                    ) );
            } else if ( isset( $vars['orderby'] ) && 'anco_project_year_to' == $vars['orderby'] ) {
                    $vars = array_merge( $vars, array(
                            'meta_key' => 'anco_project_year_to',
                            'orderby' => 'meta_value_num'
                    ) );
            }
            return $vars;
    }
    add_filter( 'request', 'anco_project_year_column_orderby' );

and add this:

add_action( 'pre_get_posts', 'my_slice_orderby' );
function my_slice_orderby( $query ) {
    if( ! is_admin() )
        return;

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

    if( 'anco_project_year_from' == $orderby ) {
        $query->set('meta_key','anco_project_year_from');
        $query->set('orderby','meta_value_num');
    } elseif('anco_project_year_to' == $orderby) {
        $query->set('meta_key','anco_project_year_to');
        $query->set('orderby','meta_value_num');
    }
}
  • Interesting idea. Unfortunately this does not change anything when trying to sort by the column. The order stays as it is. – lastria Sep 27 '16 at 6:16

Your Answer

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

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