Tax Query Limits
A Taxonomy Query in WordPress supports the following three arguments for the operator
parameter: IN
, NOT IN
and AND
. So it basically can’t do what you’re trying to do. Not even with advanced (tax_query
) Queries.
Meta Query and possibilities
You’ll want to move your concept a bit and work with post meta fields/data. The WP_Query
uses the WP_Meta_Query
, which has some advantages over the WP_Tax_Query
. The main one (for this question) is, that it supports more advanced relations through the compare
arguments and you can as well sort by it: 'orderby' => 'meta_value_num'
and 'orderby' => 'meta_value'
.
(string) compare
– Operator to test. Possible values are'='
,'!='
,'>'
,'>='
,'<'
,'<='
,'LIKE'
,'NOT LIKE'
,'IN'
,'NOT IN'
,'BETWEEN'
,'NOT BETWEEN'
,'EXISTS'
(only in WP >= 3.5), and'NOT EXISTS'
(also only in WP >= 3.5). Default value is'='
.
– Quote from the Meta Query part of the WP_Query
documentation @Codex wp dot org.
So you could (should) switch your taxonomies that you want to order and filter/search by to become custom fields/meta data.
Not possible? Stepped taxonomies for the rescue.
As I already explained on top of the answer, there’s an IN
operator for taxonomy queries. So what you could do is a call to get_terms()
Source: queryposts.com and grab all terms that are in your range and then build an array of taxons/terms that serves as your “limiters”.
// Set "min/max"-limits:
$min = 256;
$max = 768;
// Get all terms in that taxonomy
$memory = get_terms( array( 'memory_size' ) );
// Container for our values
$mem_range = array();
// Check if we got an error
if ( ! is_wp_error( $memory ) )
{
foreach ( $memory as $val )
{
// Convert to absolute integer for comparison
$val = absint( $val );
// Add to stack
$val >= $min
AND $val <= $max
AND $mem_range[] = $val;
}
}
// Debug
else
{
// Output only for admin users and others that have that cap
current_user_can( 'manage_options' )
AND print $memory->get_error_message();
}
// Setup the basic arguments
$args = array( 'post_type' => 'hardware' );
// Check if we got some terms in range
if ( ! empty( $mem_range ) )
{
$args['tax_query'] = array( array(
'taxonomy' => 'memory_size',
'field' => 'slug',
'terms' => $mem_range,
'operator' => 'IN'
) );
}
// Grab the results
$hardware_search = new WP_Query( $args );
Conclusion
While this might not be the best idea for high performance websites as you’re doing two queries for a single task, it may fulfill ones needs. I’d still recommend switching over to meta data for more advanced, single queries.