WordPress.org

Make WordPress Core

Ticket #12891: relation-or.diff

File relation-or.diff, 1.1 KB (added by Otto42, 8 years ago)

Add global AND/OR/XOR relationship to the tax_query setting

  • 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 ) {
     
    594603                        )";
    595604                }
    596605        }
     606        if ( 'IN' == $operator ) {
     607                $where = ' AND ( ' . $where . ' )';
     608        }
    597609
    598610        return compact( 'join', 'where' );
    599611}