WordPress.org

Make WordPress Core

Ticket #45084: 45084.patch

File 45084.patch, 2.1 KB (added by keraweb, 2 years ago)

Patch to support multiple orderby clauses for terms.

  • wp-includes/class-wp-term-query.php

     
    388388                        }
    389389                }
    390390
    391                 // 'term_order' is a legal sort order only when joining the relationship table.
    392391                $_orderby = $this->query_vars['orderby'];
    393                 if ( 'term_order' === $_orderby && empty( $this->query_vars['object_ids'] ) ) {
    394                         $_orderby = 'term_id';
     392                $_orderby_array = array();
     393
     394                if ( is_array( $_orderby ) ) {
     395                        foreach ( $_orderby as $__orderby => $order ) {
     396                                // 'term_order' is a legal sort order only when joining the relationship table.
     397                                if ( 'term_order' === $__orderby && empty( $this->query_vars['object_ids'] ) ) {
     398                                        $__orderby = 'term_id';
     399                                }
     400                                $__orderby = addslashes_gpc( urldecode( $__orderby ) );
     401                                $parsed = $this->parse_orderby( $__orderby );
     402
     403                                $_orderby_array[] = $parsed . ' ' . $this->parse_order( $order );
     404                        }
     405
     406                        $_orderby = implode( ', ', $_orderby_array );
     407                } else {
     408                        $_orderby = addslashes_gpc( urldecode( $_orderby ) );
     409                        $order    = $this->parse_order( $this->query_vars['order'] );
     410
     411                        foreach ( explode( ' ', $_orderby ) as $i => $__orderby ) {
     412                                // 'term_order' is a legal sort order only when joining the relationship table.
     413                                if ( 'term_order' === $__orderby && empty( $this->query_vars['object_ids'] ) ) {
     414                                        $__orderby = 'term_id';
     415                                }
     416                                $parsed = $this->parse_orderby( $__orderby );
     417                                // Only allow certain values for safety.
     418                                if ( ! $parsed ) {
     419                                        continue;
     420                                }
     421
     422                                $_orderby_array[] = $parsed . ' ' . $order;
     423                        }
     424                        $_orderby = implode( ', ', $_orderby_array );
    395425                }
    396                 $orderby = $this->parse_orderby( $_orderby );
    397426
    398                 if ( $orderby ) {
    399                         $orderby = "ORDER BY $orderby";
     427                $orderby = '';
     428                if ( $_orderby ) {
     429                        $orderby = "ORDER BY $_orderby";
     430                        $order   = '';
    400431                }
    401432
    402                 $order = $this->parse_order( $this->query_vars['order'] );
    403 
    404433                if ( $taxonomies ) {
    405434                        $this->sql_clauses['where']['taxonomy'] = "tt.taxonomy IN ('" . implode( "', '", array_map( 'esc_sql', $taxonomies ) ) . "')";
    406435                }