From 719b8d8f4ac8b5ac66fc98f50ba5a5d5729948b2 Mon Sep 17 00:00:00 2001 From: scribu Date: Tue, 23 Nov 2010 20:22:27 +0000 Subject: [PATCH] Introduce 'relation' operator between tax queries. Props Otto42 for initial patch. See #12891 git-svn-id: http://svn.automattic.com/wordpress/trunk@16555 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/taxonomy.php | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/wp-includes/taxonomy.php b/wp-includes/taxonomy.php index 72badd7d3..633948667 100644 --- a/wp-includes/taxonomy.php +++ b/wp-includes/taxonomy.php @@ -524,9 +524,19 @@ function get_tax_sql( $tax_query, $primary_table, $primary_id_column ) { global $wpdb; $join = ''; - $where = ''; + $where = array(); $i = 0; + + if ( isset( $tax_query['relation'] ) && strtoupper( $tax_query['relation'] ) == 'OR' ) { + $relation = 'OR'; + } else { + $relation = 'AND'; + } + foreach ( $tax_query as $query ) { + if ( ! is_array( $query ) ) + continue; + extract( wp_parse_args( $query, array( 'taxonomy' => array(), 'terms' => array(), @@ -566,8 +576,13 @@ function get_tax_sql( $tax_query, $primary_table, $primary_id_column ) { } if ( 'IN' == $operator ) { - if ( empty( $terms ) ) - return array( 'join' => '', 'where' => ' AND 0 = 1'); + + if ( empty( $terms ) ) { + if ( 'OR' == $relation ) + continue; + else + return array( 'join' => '', 'where' => ' AND 0 = 1' ); + } $terms = implode( ',', $terms ); @@ -577,24 +592,30 @@ function get_tax_sql( $tax_query, $primary_table, $primary_id_column ) { $join .= $i ? " AS $alias" : ''; $join .= " ON ($primary_table.$primary_id_column = $alias.object_id)"; - $where .= " AND $alias.term_taxonomy_id $operator ($terms)"; - - $i++; + $where[] = "$alias.term_taxonomy_id $operator ($terms)"; } elseif ( 'NOT IN' == $operator ) { + if ( empty( $terms ) ) continue; $terms = implode( ',', $terms ); - $where .= " AND $primary_table.$primary_id_column NOT IN ( - SELECT object_id - FROM $wpdb->term_relationships + $where[] = "$primary_table.$primary_id_column NOT IN ( + SELECT object_id + FROM $wpdb->term_relationships WHERE term_taxonomy_id IN ($terms) )"; } + + $i++; } + if ( !empty( $where ) ) + $where = ' AND ( ' . implode( " $relation ", $where ) . ' )'; + else + $where = ''; + return compact( 'join', 'where' ); }