Query 1 taxonomy term, exclude another

Here’s the code I’m using to try and query a single taxonomy for one term, but exclude returned posts for that term that also belong to another.

In English, this is what I want: query ‘resource-type’ for ‘testimonies’, but not ‘testimonies’ that are also ‘audio’.

Tips to tweak this code to get it to work?

<?php

    $testimonials_args = array(

        'post_type' => 'resource',
        'posts_per_page' => 1,
        'tax_query' => array(
        'relation' => 'AND',
             array(
                'taxonomy' => 'resource-type',
                'field' => 'slug',
                'terms' => array( 'testimonies' )
            ),
            array(
                'taxonomy' => 'resource-type',
                'field' => 'slug',
                'terms' => array( 'audio' ),
                'operator' => 'NOT IN'
            )
        )
    );

?>

3 Answers
3

I guess its because you are trying two conditions on one taxonomy, you can allways create a custom sql query, something like this:

$querystr = "
SELECT * 
FROM $wpdb->posts
LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
LEFT JOIN $wpdb->terms ON($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)
WHERE $wpdb->posts.post_type="resource" 
AND $wpdb->posts.post_status="publish"
AND $wpdb->term_taxonomy.taxonomy = 'resource-type'
AND $wpdb->terms.slug = 'testimonies'
AND $wpdb->terms.slug NOT IN ('audio')
ORDER BY $wpdb->posts.post_date DESC
 ";

$pageposts = $wpdb->get_results($querystr, OBJECT);

or you can query just by one term and exclude by has_term() inside the loop something like this:

if (!has_term('audio','resource-type',$post->ID)){
  //post without audio
}else{
  //post with audio (skip or whatever)
}

Leave a Comment