Make WordPress Core

Opened 8 years ago

Closed 7 years ago

#15388 closed defect (bug) (worksforme)

get_posts does not order by menu_order

Reported by: ggus Owned by:
Milestone: Priority: normal
Severity: normal Version: 3.0.4
Component: Query Keywords: menu_order get_posts orderby
Focuses: Cc:


I'm writing a plugin that makes use of custom post_types. The plugin (in the back-end) aims to manage a group of custom posts children of the actually edited custom post. I manage the ordering via the menu_order.

a statement like


does not order by menu_order, instead it returns the elements ordered by the default order (id?)

As reported in http://wordpress.org/support/topic/get_posts-not-using-orderbymenu_order#post-1006470 and also as stated in this bug fix: http://core.trac.wordpress.org/ticket/6731 there is in the core file query.php at line 2147 (WP Version 3.0.1)

switch ( $orderby ) {
  case 'menu_order':

In this way every request to order by menu_order gets ignored.

It seems that query_posts function is unaffected by this, so

 query_posts(array('post_type' => 'whatever', 'post_parent' => $post->ID , 'order' => 'ASC', 'orderby' => 'menu_order'));

does work, but I fear there are some implications in using query_posts instead of get_posts.

There is a solution proposed in the same page http://wordpress.org/support/topic/get_posts-not-using-orderbymenu_order#post-1006470

that fixes the bug by changing the code to

case 'menu_order':
  $orderby = "$wpdb->posts.menu_order";

Change History (9)

#1 @ryan
7 years ago

This request:


Produces this query:

SELECT wp_trunk_posts.* FROM wp_trunk_posts WHERE 1=1 AND wp_trunk_posts.post_type = 'page' AND (wp_trunk_posts.post_status = 'publish') ORDER BY menu_order ASC LIMIT 0, 5

menu_order is properly represented in the query and the pages are ordered as expected. That case statement is unnecessary but doesn't seem to hurt anything. Further, the Pages admin screen does orderby='menu_order title' just fine.

#2 in reply to: ↑ description @SergeyBiryukov
7 years ago

Replying to ggus:


Shouldn't it be &orderby=menu_order instead of $orderby=menu_order?

#3 @johnjamesjacoby
7 years ago

  • Resolution set to worksforme
  • Status changed from new to closed

Confirmed Ryan's code and I had the same thoughts as Sergey.

Closing as worksforme.

#4 @nacin
7 years ago

  • Milestone Awaiting Review deleted

#5 @F J Kaiser
7 years ago

  • Resolution worksforme deleted
  • Status changed from closed to reopened
  • Version changed from 3.0.1 to 3.0.4

I got the same issue as "ggus" (reporter):

query_posts( array( 'post_type' => 'whatever', 'post_status' => 'publish', 'order_by' => 'menu_order', 'order' => 'DESC' ) );


SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'whatever' AND (wp_posts.post_status = 'publish') ORDER BY wp_posts.post_date DESC LIMIT 0, 10
Version 2, edited 7 years ago by F J Kaiser (previous) (next) (diff)

#6 @F J Kaiser
7 years ago

  • Cc 24-7@… added

#7 follow-up: @SergeyBiryukov
7 years ago

Shouldn't it be orderby instead of order_by?

#8 in reply to: ↑ 7 @F J Kaiser
7 years ago

Replying to SergeyBiryukov:

Shouldn't it be orderby instead of order_by?

Absolutely right. Thanks for your comment.

Last edited 7 years ago by F J Kaiser (previous) (diff)

#9 @F J Kaiser
7 years ago

  • Resolution set to worksforme
  • Status changed from reopened to closed
Note: See TracTickets for help on using tickets.