Make WordPress Core

Opened 16 years ago

Closed 16 years ago

#15388 closed defect (bug) (worksforme)

get_posts does not order by menu_order

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

Description

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

get_posts('post_type=whatever&post_parent='.$post->ID.'$orderby=menu_order&order=ASC')

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':
  break;

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";
  break;

Change History (9)

#1 @ryan
16 years ago

This request:

get_posts('post_type=page&orderby=menu_order&order=DESC');

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
16 years ago

Replying to ggus:

get_posts('post_type=whatever&post_parent='.$post->ID.'$orderby=menu_order&order=ASC')

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

#3 @johnjamesjacoby
16 years ago

  • Resolutionworksforme
  • Status newclosed

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

Closing as worksforme.

#4 @nacin
16 years ago

  • Milestone Awaiting Review

#5 @F J Kaiser
16 years ago

  • Resolution worksforme
  • Status closedreopened
  • Version 3.0.13.0.4

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

// note: same result with & without reset
wp_reset_query();
query_posts( array( 'post_type' => 'whatever', 'post_status' => 'publish', 'order_by' => 'menu_order', 'order' => 'DESC' ) );

produces:

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
Last edited 16 years ago by F J Kaiser (previous) (diff)

#6 @F J Kaiser
16 years ago

  • Cc 24-7@… added

#7 follow-up: @SergeyBiryukov
16 years ago

Shouldn't it be orderby instead of order_by?

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

Replying to SergeyBiryukov:

Shouldn't it be orderby instead of order_by?

Absolutely right. Thanks for your comment.

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

#9 @F J Kaiser
16 years ago

  • Resolutionworksforme
  • Status reopenedclosed
Note: See TracTickets for help on using tickets.