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
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)
}