WordPress.org

Make WordPress Core

Ticket #12891: relation-or.3.diff

File relation-or.3.diff, 1.8 KB (added by scribu, 3 years ago)

Handle global AND/OR relations + logic fixes when empty terms

  • wp-includes/taxonomy.php

     
    526526        $join = ''; 
    527527        $where = ''; 
    528528        $i = 0; 
     529 
     530        if ( isset( $tax_query['relation'] ) && strtoupper( $tax_query['relation'] ) == 'OR' ) { 
     531                $relation = 'OR'; 
     532        } else { 
     533                $relation = 'AND'; 
     534        } 
     535 
    529536        foreach ( $tax_query as $query ) { 
     537                if ( ! is_array( $query ) ) 
     538                        continue; 
     539 
    530540                extract( wp_parse_args( $query, array( 
    531541                        'taxonomy' => array(), 
    532542                        'terms' => array(), 
     
    566576                } 
    567577 
    568578                if ( 'IN' == $operator ) { 
    569                         if ( empty( $terms ) ) 
    570                                 return array( 'join' => '', 'where' => ' AND 0 = 1'); 
    571579 
     580                        if ( empty( $terms ) ) { 
     581                                if ( 'OR' == $relation ) 
     582                                        continue; 
     583                                else 
     584                                        return array( 'join' => '', 'where' => ' AND 0 = 1' ); 
     585                        } 
     586 
    572587                        $terms = implode( ',', $terms ); 
    573588 
    574589                        $alias = $i ? 'tt' . $i : $wpdb->term_relationships; 
     
    577592                        $join .= $i ? " AS $alias" : ''; 
    578593                        $join .= " ON ($primary_table.$primary_id_column = $alias.object_id)"; 
    579594 
    580                         $where .= " AND $alias.term_taxonomy_id $operator ($terms)"; 
     595                        if ( $i ) 
     596                                $where .= " $relation "; 
    581597 
    582                         $i++; 
     598                        $where .= "$alias.term_taxonomy_id $operator ($terms)"; 
    583599                } 
    584600                elseif ( 'NOT IN' == $operator ) { 
     601 
    585602                        if ( empty( $terms ) ) 
    586603                                continue; 
    587604 
    588605                        $terms = implode( ',', $terms ); 
    589606 
    590                         $where .= " AND $primary_table.$primary_id_column NOT IN ( 
    591                                 SELECT object_id  
    592                                 FROM $wpdb->term_relationships  
     607                        if ( $i ) 
     608                                $where .= " $relation "; 
     609 
     610                        $where .= "$primary_table.$primary_id_column NOT IN ( 
     611                                SELECT object_id 
     612                                FROM $wpdb->term_relationships 
    593613                                WHERE term_taxonomy_id IN ($terms) 
    594614                        )"; 
    595615                } 
     616 
     617                $i++; 
    596618        } 
    597619 
     620        $where = ' AND ( ' . $where . ' )'; 
     621 
    598622        return compact( 'join', 'where' ); 
    599623} 
    600624