WordPress.org

Make WordPress Core

Ticket #31045: meta-query.patch

File meta-query.patch, 3.5 KB (added by Funkatronic, 3 years ago)

New patch

  • meta.php

     
    932932         * @var array
    933933         */
    934934        protected $table_aliases = array();
     935       
     936        /**
     937         * A flat list of ORDER BY clauses with aliases as the keys.
     938         *
     939         * @since 4.2.0
     940         * @var array
     941         */
     942        public $orderby_clauses = array();
    935943
    936944        /**
    937945         * Constructor.
     
    13511359                // We prefer to avoid joins if possible. Look for an existing join compatible with this clause.
    13521360                $alias = $this->find_compatible_table_alias( $clause, $parent_query );
    13531361                if ( false === $alias ) {
    1354                         $i = count( $this->table_aliases );
    1355                         $alias = $i ? 'mt' . $i : $this->meta_table;
     1362                        if( empty( $clause['alias'] ) ){
     1363                                $i = count( $this->table_aliases );
     1364                                $alias = $i ? 'mt' . $i : $this->meta_table;
     1365                        } else {
     1366                                $alias = $clause['alias'];     
     1367                        }
    13561368
    13571369                        // JOIN clauses for NOT EXISTS have their own syntax.
    13581370                        if ( 'NOT EXISTS' === $meta_compare ) {
     
    13731385
    13741386                // Save the alias to this clause, for future siblings to find.
    13751387                $clause['alias'] = $alias;
     1388               
     1389                //Build the ORDER BY clause
     1390                if ( ! empty( $primary_meta_query['type'] ) ) {
     1391                        $meta_type = $this->meta_query->get_cast_for_type( $clause['type'] );
     1392                        $this->orderby_clauses[$alias] = "CAST($alias.meta_value AS {$meta_type})";
     1393                } else {
     1394                        $this->orderby_clauses[$alias] = "$alias.meta_value";
     1395                }
    13761396
    13771397                // Next, build the WHERE clause.
    13781398
  • query.php

     
    22302230                        'post_parent', 'post_type', 'name', 'author', 'date', 'title', 'modified',
    22312231                        'parent', 'type', 'ID', 'menu_order', 'comment_count', 'rand',
    22322232                );
     2233               
     2234                $allowed_keys = apply_filters( 'allowed_orderby_keys', $allowed_keys );
    22332235
    22342236                $primary_meta_key = '';
    22352237                $primary_meta_query = false;
     
    22442246                        $allowed_keys[] = 'meta_value';
    22452247                        $allowed_keys[] = 'meta_value_num';
    22462248                }
     2249               
     2250                if ( ! empty( $this->meta_query->table_aliases ) ) {
     2251                        $aliases = (array) $this->meta_query->table_aliases;
     2252                }
    22472253
    22482254                if ( ! in_array( $orderby, $allowed_keys ) ) {
    22492255                        return false;
     
    22602266                        case 'ID':
    22612267                        case 'menu_order':
    22622268                        case 'comment_count':
    2263                                 $orderby = "$wpdb->posts.{$orderby}";
     2269                                $orderby_clause = "$wpdb->posts.{$orderby}";
    22642270                                break;
    22652271                        case 'rand':
    2266                                 $orderby = 'RAND()';
     2272                                $orderby_clause = 'RAND()';
    22672273                                break;
    22682274                        case $primary_meta_key:
    22692275                        case 'meta_value':
    22702276                                if ( ! empty( $primary_meta_query['type'] ) ) {
    22712277                                        $sql_type = $this->meta_query->get_cast_for_type( $primary_meta_query['type'] );
    2272                                         $orderby = "CAST($wpdb->postmeta.meta_value AS {$sql_type})";
     2278                                        $orderby_clause = "CAST($wpdb->postmeta.meta_value AS {$sql_type})";
    22732279                                } else {
    2274                                         $orderby = "$wpdb->postmeta.meta_value";
     2280                                        $orderby_clause = "$wpdb->postmeta.meta_value";
    22752281                                }
    22762282                                break;
    22772283                        case 'meta_value_num':
    2278                                 $orderby = "$wpdb->postmeta.meta_value+0";
     2284                                $orderby_clause = "$wpdb->postmeta.meta_value+0";
    22792285                                break;
     2286                        case array_key_exists( $orderby, $this->meta_query->orderby_clauses ):
     2287                                $orderby_clause = $this->meta_query->orderby_clauses[$orderby];
     2288                                break;
    22802289                        default:
    2281                                 $orderby = "$wpdb->posts.post_" . $orderby;
     2290                                $orderby_clause = "$wpdb->posts.post_" . $orderby;
    22822291                                break;
    22832292                }
    2284 
    2285                 return $orderby;
     2293               
     2294                return apply_filters( 'parse_orderby', $orderby_clause, $orderby );
    22862295        }
    22872296
    22882297        /**