﻿id,summary,reporter,owner,description,type,status,priority,milestone,component,version,severity,resolution,keywords,cc
12891,Advanced multi-taxonomy WP_Query()s,markjaquith,markjaquith,"We have this great taxonomy system, but we're only able to query one of them at a time. There is no way to ask for posts that are in the 'cars' category but lack the ""VW Beetle"" tag. What people end up doing is crafting complex category systems to simulate multiple taxonomies. That's lame. We should make them want to use multiple taxonomies. Let's give them the tools to do it.

Proposed syntax, and half-working example implementation:

{{{
<?php

class WP_Query_Tax_Or {
	var $contents = array();
	function WP_Query_Tax_Or( $array ) {
		$this->contents = $array;
		return $this;
	}
}

class WP_Query_Tax_And {
	var $contents = array();
	function WP_Query_Tax_And( $array ) {
		$this->contents = $array;
		return $this;
	}
}

class WP_Query_Tax {
	var $taxonomy;
	var $object;
	var $ID;
	function WP_Query_Tax( $taxonomy, $object ) {
		$this->taxonomy = $taxonomy;
		$this->object = $object;
		$this->ID = wp_some_function_to_get_an_ID_from_ID_or_name_or_slug( $taxonomy, $object );
		return $this;
	}
}

class WP_Query_Tax_Not {
	var $taxonomy;
	var $object;
	var $ID;
	function WP_Query_Tax_Not( $taxonomy, $object ) {
		$this->taxonomy = $taxonomy;
		$this->object = $object;
		$this->ID = wp_some_function_to_get_an_ID_from_ID_or_name_or_slug( $taxonomy, $object );
		return $this;
	}
}


function wp_tax_and() {
	return new WP_Query_Tax_And( func_get_args() );
}

function wp_tax_or() {
	return new WP_Query_Tax_Or( func_get_args() );
}

function wp_tax( $taxonomy, $object ) {
	return new WP_Query_Tax( $taxonomy, $object );
}

function wp_tax_not( $taxonomy, $object ) {
	return new WP_Query_Tax_Not( $taxonomy, $object );
}

function wp_some_function_to_get_an_ID_from_ID_or_name_or_slug( $taxonomy, $object ) {
	return $object;
}

$array = array(
	'tax' => wp_tax_and(
		wp_tax_or(
			wp_tax( 'post_category', 59 ),
			wp_tax( 'post_tag', 'web' )
		),
		wp_tax_not( 'post_category', 24 ),
		wp_tax_not( 'post_tag', 'wordpress' )
	)
);

var_dump( $array );
}}}

Simple enough. group with {{{wp_tax_and()}}} or {{{wp_tax_or()}}}. Select a taxonomy item using {{{wp_tax( 'taxonomy', 'ID or name or slug' )}}} and omit a taxonomy item using {{{wp_tax_not( 'taxonomy', 'ID or name or slug' )}}}.

If you run the example code, you'll get an array of objects that could be iterated by WP_Query code using subqueries and parenthesis to generate the precise query that was requested.

It'll translate directly into SQL. Start of AND or OR means you start parenthesis, and join all children elements with AND or OR as appropriate. Getting to the end of an AND or OR means you close parenthesis. And then just use IN() and NOT IN() for {{{wp_tax()}}} and {{{wp_tax_not()}}} respectively.",task (blessed),closed,normal,3.1,Query,3.0.1,normal,fixed,ongoing-project,dkikizas@… trac@… willmot johnbillion@… beau@… aaroncampbell mikeschinkel@… trac.wordpress.org@… piemanek@… admin@… maorb
