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

git-svn-id: https://develop.svn.wordpress.org/trunk@16555 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
scribu 2010-11-23 20:22:27 +00:00
parent fafdc943da
commit 4fd10f33f0
1 changed files with 30 additions and 9 deletions

View File

@ -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' );
}