WordPress.org

Make WordPress Core

Ticket #12891: relation-or.2.diff

File relation-or.2.diff, 1.3 KB (added by Otto42, 3 years ago)

Handle global AND/OR/XOR with both IN and NOT IN

  • taxonomy.php

     
    526526        $join = ''; 
    527527        $where = ''; 
    528528        $i = 0; 
     529        if ( !empty( $tax_query['relation'] ) ) { 
     530                $relation = $tax_query['relation']; 
     531        } else { 
     532                $relation = 'AND'; 
     533        } 
    529534        foreach ( $tax_query as $query ) { 
     535                if ( !is_array( $query ) ) continue; 
     536                 
    530537                extract( wp_parse_args( $query, array( 
    531538                        'taxonomy' => array(), 
    532539                        'terms' => array(), 
     
    576583                        $join .= " INNER JOIN $wpdb->term_relationships"; 
    577584                        $join .= $i ? " AS $alias" : ''; 
    578585                        $join .= " ON ($primary_table.$primary_id_column = $alias.object_id)"; 
     586                         
     587                        if ($i) $where .= " $relation";  
     588                         
     589                        $where .= " $alias.term_taxonomy_id $operator ($terms)"; 
    579590 
    580                         $where .= " AND $alias.term_taxonomy_id $operator ($terms)"; 
    581  
    582591                        $i++; 
    583592                } 
    584593                elseif ( 'NOT IN' == $operator ) { 
     
    587596 
    588597                        $terms = implode( ',', $terms ); 
    589598 
    590                         $where .= " AND $primary_table.$primary_id_column NOT IN ( 
     599                        if ($i) $where .= " $relation";  
     600                         
     601                        $where .= " $primary_table.$primary_id_column NOT IN ( 
    591602                                SELECT object_id  
    592603                                FROM $wpdb->term_relationships  
    593604                                WHERE term_taxonomy_id IN ($terms) 
    594605                        )"; 
     606                         
     607                        $i++; 
    595608                } 
    596609        } 
    597  
     610         
     611        $where = ' AND ( ' . $where . ' )'; 
     612         
    598613        return compact( 'join', 'where' ); 
    599614} 
    600615