Make WordPress Core

Ticket #34996: 34996.diff

File 34996.diff, 2.0 KB (added by eherman24, 8 years ago)

meta_query support for taxonomy queries

  • taxonomy.php

     
    13541354        // Meta query support.
    13551355        $join = '';
    13561356        if ( ! empty( $args['meta_query'] ) ) {
    1357                 $mquery = new WP_Meta_Query( $args['meta_query'] );
     1357               
     1358                $mquery = new WP_Meta_Query( $args['meta_query'] );             
    13581359                $mq_sql = $mquery->get_sql( 'term', 't', 'term_id' );
    13591360
    13601361                $join  .= $mq_sql['join'];
    13611362                $where .= $mq_sql['where'];
     1363               
     1364                // extract clauses
     1365                $meta_clauses = $mquery->get_clauses();
     1366                if ( ! empty( $meta_clauses ) ) {
     1367                        $allowed_keys = array();
     1368                        $primary_meta_query = reset( $meta_clauses );
     1369                        if ( ! empty( $primary_meta_query['key'] ) ) {
     1370                                $primary_meta_key = $primary_meta_query['key'];
     1371                                $allowed_keys[] = $primary_meta_key;
     1372                        }
     1373                        $allowed_keys[] = 'meta_value';
     1374                        $allowed_keys[] = 'meta_value_num';
     1375                        $allowed_keys = array_merge( $allowed_keys, array_keys( $meta_clauses ) );
     1376                        $orderby = ( isset( $args['orderby'] ) ) ? $args['orderby'] : '';
     1377                        if( in_array( $orderby, $allowed_keys ) ) {
     1378                                $join .= " INNER JOIN $wpdb->termmeta AS term_meta ON t.term_id = term_meta.term_id";
     1379                                switch( $orderby ) {
     1380                                        default:
     1381                                        case $primary_meta_key:
     1382                                        case 'meta_value':
     1383                                                if ( ! empty( $primary_meta_query['type'] ) ) {
     1384                                                        $orderby = "ORDER BY CAST(term_meta.meta_value AS term_meta)";
     1385                                                } else {
     1386                                                        $orderby = "ORDER BY term_meta.meta_value";
     1387                                                }
     1388                                                break;
     1389                                        case 'meta_value_num':
     1390                                                $orderby = "ORDER BY term_meta.meta_value+0";
     1391                                                break;
     1392                                }
     1393                        }
     1394                }
     1395               
    13621396        }
    13631397
    13641398        $selects = array();
     
    14201454         * @param array $args       An array of terms query arguments.
    14211455         */
    14221456        $clauses = apply_filters( 'terms_clauses', compact( $pieces ), $taxonomies, $args );
    1423 
     1457       
    14241458        $fields = isset( $clauses[ 'fields' ] ) ? $clauses[ 'fields' ] : '';
    14251459        $join = isset( $clauses[ 'join' ] ) ? $clauses[ 'join' ] : '';
    14261460        $where = isset( $clauses[ 'where' ] ) ? $clauses[ 'where' ] : '';