Make WordPress Core


Ignore:
Timestamp:
11/23/2010 08:22:27 PM (16 years ago)
Author:
scribu
Message:

Introduce 'relation' operator between tax queries. Props Otto42 for initial patch. See #12891

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/taxonomy.php

    r16535 r16555  
    525525
    526526        $join = '';
    527         $where = '';
     527        $where = array();
    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(),
     
    567577
    568578                if ( 'IN' == $operator ) {
    569                         if ( empty( $terms ) )
    570                                 return array( 'join' => '', 'where' => ' AND 0 = 1');
     579
     580                        if ( empty( $terms ) ) {
     581                                if ( 'OR' == $relation )
     582                                        continue;
     583                                else
     584                                        return array( 'join' => '', 'where' => ' AND 0 = 1' );
     585                        }
    571586
    572587                        $terms = implode( ',', $terms );
     
    578593                        $join .= " ON ($primary_table.$primary_id_column = $alias.object_id)";
    579594
    580                         $where .= " AND $alias.term_taxonomy_id $operator ($terms)";
    581 
    582                         $i++;
     595                        $where[] = "$alias.term_taxonomy_id $operator ($terms)";
    583596                }
    584597                elseif ( 'NOT IN' == $operator ) {
     598
    585599                        if ( empty( $terms ) )
    586600                                continue;
     
    588602                        $terms = implode( ',', $terms );
    589603
    590                         $where .= " AND $primary_table.$primary_id_column NOT IN (
    591                                 SELECT object_id 
    592                                 FROM $wpdb->term_relationships 
     604                        $where[] = "$primary_table.$primary_id_column NOT IN (
     605                                SELECT object_id
     606                                FROM $wpdb->term_relationships
    593607                                WHERE term_taxonomy_id IN ($terms)
    594608                        )";
    595609                }
    596         }
     610
     611                $i++;
     612        }
     613
     614        if ( !empty( $where ) )
     615                $where = ' AND ( ' . implode( " $relation ", $where ) . ' )';
     616        else
     617                $where = '';
    597618
    598619        return compact( 'join', 'where' );
Note: See TracChangeset for help on using the changeset viewer.