WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Say I have the following taxonomy terms:

Term 1
  Term 1.1
  Term 1.2
Term 2
  Term 2.1

How can I get only posts that are assigned to Term 1 and not include those that are assigned to Term 1.1 or Term 1.2?

For example:

$pages = get_posts(array(
  'post_type' => 'page',
  'numberposts' => -1,
  'tax_query' => array(
    array(
      'taxonomy' => 'taxonomy-name',
      'field' => 'id',
      'terms' => 1 // Where term_id of Term 1 is "1".
    )
  )
);

is also giving me posts that have Terms 1.1 and 1.2 assigned.

Thanks.

share|improve this question
up vote 9 down vote accepted

In looking at the WP_Tax_Query class in /wp-includes/taxonomy.php, I found that there is a 'include_children' option which defaults to true. I modified my original get_posts() call with the following, and it works great:

$pages = get_posts(array(
  'post_type' => 'page',
  'numberposts' => -1,
  'tax_query' => array(
    array(
      'taxonomy' => 'taxonomy-name',
      'field' => 'id',
      'terms' => 1, // Where term_id of Term 1 is "1".
      'include_children' => false
    )
  )
));

List of more query parameters: http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters

share|improve this answer
    
Reading from the Codex page linked to, I think the value of 'field' in the tax_query array should be 'term_id' rather than 'id': "Possible values are 'term_id', 'name' and 'slug'. Default value is 'term_id'." I'm guessing 'id' only works because it causes a fall-back to the default. – Jani Uusitalo Sep 26 '15 at 9:22

just came across this the other day:

$tax = 'music';
$oterm = 'pop';
$term = get_term_by('slug', $oterm, $tax);
$termChildren = get_term_children($term->term_id, $tax);
$wp_query = new WP_Query();
$wp_query->query(
    array(
        'posts_per_page' => '5',
        'tax_query' => array(
            array(
                'taxonomy' => $tax,
                'field' => 'slug',
                'terms' => $oterm
            ),
            array(
                'taxonomy' => $tax,
                'field' => 'id',
                'terms' => $termChildren,
                'operator' => 'NOT IN'
            )
        )
    )
);

source: http://return-true.com/2011/08/wordpress-display-posts-from-a-term-without-displaying-posts-from-child-terms/

share|improve this answer

is used the operator 'IN' and it works

'taxonomy' => 'collections', 'terms' => array( 28 ), 'field' => 'id', 'operator' => 'IN'

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.