Query: Standardize treatment of 'orderby' values `post__in`, `post_parent__in`, and `post_name__in`.
Ordering by `post__in` was introduced in [21776], but the code assumed that `post__in` would be a comma-separated string listing post IDs. When an array of post IDs was passed to the `post__in` query var, 'orderby=post__in' was not respected. This changeset changes this behavior by handling 'orderby=post__in' in the same way as most other values of 'orderby', which ensures that arrays as well as strings can be properly parsed. The same treatment is given to the similar `post_name__in` and `post_parent__in` options of 'orderby', so that most query generation for orderby clauses happens in the same place, instead of in special cases. A slight change in the resulting SQL (related to the whitespace around parentheses and commas) necessitates a change to an existing REST API test that does a string comparison against the SQL query. Props mgibbs189, kelvink. Fixes #38034. Built from https://develop.svn.wordpress.org/trunk@44452 git-svn-id: http://core.svn.wordpress.org/trunk@44283 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
parent
7f67e235a7
commit
5950f27205
|
@ -1546,6 +1546,9 @@ class WP_Query {
|
|||
'menu_order',
|
||||
'comment_count',
|
||||
'rand',
|
||||
'post__in',
|
||||
'post_parent__in',
|
||||
'post_name__in',
|
||||
);
|
||||
|
||||
$primary_meta_key = '';
|
||||
|
@ -1576,6 +1579,8 @@ class WP_Query {
|
|||
return false;
|
||||
}
|
||||
|
||||
$orderby_clause = '';
|
||||
|
||||
switch ( $orderby ) {
|
||||
case 'post_name':
|
||||
case 'post_author':
|
||||
|
@ -1603,6 +1608,23 @@ class WP_Query {
|
|||
case 'meta_value_num':
|
||||
$orderby_clause = "{$primary_meta_query['alias']}.meta_value+0";
|
||||
break;
|
||||
case 'post__in':
|
||||
if ( ! empty( $this->query_vars['post__in'] ) ) {
|
||||
$orderby_clause = "FIELD({$wpdb->posts}.ID," . implode( ',', array_map( 'absint', $this->query_vars['post__in'] ) ) . ')';
|
||||
}
|
||||
break;
|
||||
case 'post_parent__in':
|
||||
if ( ! empty( $this->query_vars['post_parent__in'] ) ) {
|
||||
$orderby_clause = "FIELD( {$wpdb->posts}.post_parent," . implode( ', ', array_map( 'absint', $this->query_vars['post_parent__in'] ) ) . ' )';
|
||||
}
|
||||
break;
|
||||
case 'post_name__in':
|
||||
if ( ! empty( $this->query_vars['post_name__in'] ) ) {
|
||||
$post_name__in = array_map( 'sanitize_title_for_query', $this->query_vars['post_name__in'] );
|
||||
$post_name__in_string = "'" . implode( "','", $post_name__in ) . "'";
|
||||
$orderby_clause = "FIELD( {$wpdb->posts}.post_name," . $post_name__in_string . ' )';
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if ( array_key_exists( $orderby, $meta_clauses ) ) {
|
||||
// $orderby corresponds to a meta_query clause.
|
||||
|
@ -2239,6 +2261,12 @@ class WP_Query {
|
|||
$q['order'] = $rand ? '' : $this->parse_order( $q['order'] );
|
||||
}
|
||||
|
||||
// These values of orderby should ignore the 'order' parameter.
|
||||
$force_asc = array( 'post__in', 'post_name__in', 'post_parent__in' );
|
||||
if ( isset( $q['orderby'] ) && in_array( $q['orderby'], $force_asc, true ) ) {
|
||||
$q['order'] = '';
|
||||
}
|
||||
|
||||
// Order by.
|
||||
if ( empty( $q['orderby'] ) ) {
|
||||
/*
|
||||
|
@ -2252,12 +2280,6 @@ class WP_Query {
|
|||
}
|
||||
} elseif ( 'none' == $q['orderby'] ) {
|
||||
$orderby = '';
|
||||
} elseif ( $q['orderby'] == 'post__in' && ! empty( $post__in ) ) {
|
||||
$orderby = "FIELD( {$wpdb->posts}.ID, $post__in )";
|
||||
} elseif ( $q['orderby'] == 'post_parent__in' && ! empty( $post_parent__in ) ) {
|
||||
$orderby = "FIELD( {$wpdb->posts}.post_parent, $post_parent__in )";
|
||||
} elseif ( $q['orderby'] == 'post_name__in' && ! empty( $post_name__in ) ) {
|
||||
$orderby = "FIELD( {$wpdb->posts}.post_name, $post_name__in )";
|
||||
} else {
|
||||
$orderby_array = array();
|
||||
if ( is_array( $q['orderby'] ) ) {
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
*
|
||||
* @global string $wp_version
|
||||
*/
|
||||
$wp_version = '5.1-alpha-44451';
|
||||
$wp_version = '5.1-alpha-44452';
|
||||
|
||||
/**
|
||||
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.
|
||||
|
|
Loading…
Reference in New Issue