Support » Developing with WordPress » Using WP_Query with sort in Admin

  • Resolved cpaprotna

    (@cpaprotna)


    I have a page where I use wp_query to display a custom post type. The args I pass to it are as follows:

    $args = array(
    	'post_type'=> 'fsga_breakouts',
    	'post_status' => 'publish',
    	'posts_per_page' => -1,
    	'meta_query'    => array(
    		array(
    		'key'       => 'fsga_breakout_conf_id',
    		'value'     => get_the_ID(),
    		'compare'   => '=',
    		),
    		'starttime_clause' => array(
    		'key' => 'fsga_breakouts_start_time', 
    		'compare' => 'EXISTS',                       
    		),
    	       'session_id_clause' => array(
    		'key' => 'fsga_breakouts_session_id', 
    		'compare' => 'EXISTS',                       
    		),
    	),
    	'orderby'   => array (
    		'starttime_clause' => 'ASC',
    		'session_id_clause' => 'ASC',
    	),
      );	

    On the front end pages of my site this query and sort works perfectly. I need to do the same query for a page in admin and it seems to ignore the sort. What do I need to do to make sure that the sort does not get ignored in admin?

Viewing 4 replies - 1 through 4 (of 4 total)
  • To add to my question… I have used var_dump to look at the query for front end and admin in pre_get_posts and they are identical.

    I then dumped the request of the result of the call to wp_query.
    Here is the group by and order by settings on the front end:
    GROUP BY fl_posts.ID ORDER BY fl_posts.menu_order, CAST(mt1.meta_value AS CHAR) ASC, CAST(mt2.meta_value AS CHAR) ASC

    Here is the group by and order by settings in admin:
    GROUP BY fl_posts.ID ORDER BY fl_posts.menu_order, fl_posts.post_date DESC

    So even though the arguments going into WP_Query have a different sort order. Even though I tried to reset the sort order in pre_get_posts for admin, it still is overriding it with menu_order and post_date. The page I am creating is a report for administrators and it needs to be sorted as it is on the front end of the site.

    With more testing, I added a filter for posts_orderby and the correct order by is being sent into the query at this time.

    I just need to know where it is changed so I can stop that from happening.

    In case anyone is wondering, just use get_posts instead of new WP_query with the same $args

    You will still get a Post Object, but you have to use a foreach loop to access each record.

    Its worthing noting that this can also be done by hooking into pre_get_posts checking for is_admin (and possibly your custom post type) and filtering the query with the set method $query->set().

    https://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts#Examples

Viewing 4 replies - 1 through 4 (of 4 total)
  • You must be logged in to reply to this topic.