8

I have a custom post type called portfolio and a custom taxonomy called build-type (acting as categories)

I am trying to query portfolio posts by build-type ID e.g. all Portfolio posts in "Hotels" (id=4 for that taxonomy)

// gets the ID from a custom field to show posts on a specific page   
$buildType = get_post_meta($post->ID, 'build_type_id', true);
// run query
query_posts(array( 
    'post_type' => 'portfolio',
    'showposts' => -1,
    'tax_query' => array(
        'taxonomy' => 'build-type',
        'terms' => $buildType,
        'field' => 'term_id'
    ),
    'orderby' => 'title',
    'order' => 'ASC'
));

Currently it's calling all portfolio posts and not just those with the build-type ID

For 'field' => 'term_id' should I be using term_id, tag_ID, id or something else?

Anyone know how to get this working?

Thanks in advance!

4 Answers 4

14

The reason this isn't working is because 'tax_query' needs to be an array of arrays (confusing, I know).

...

'tax_query' => array(
    array(
        'taxonomy' => 'build-type',

...

It is that way so you can group a few different rules together.

2
  • Nice one Drew. That solved it. Posted the final script on Github gist.github.com/1275191 Commented Oct 10, 2011 at 12:36
  • Cheers! Spent hour from customers budget resolving this minor issue :)
    – Tom
    Commented Jan 9, 2017 at 15:34
7

Drew was right, tax-query needs to be an array of arrays

The final solution is:

// gets the ID from a custom field to show posts on a specific page
$buildType = get_post_meta($post->ID, 'build_type_id', true);
// run query
query_posts(array( 
    'post_type' => 'portfolio',
    'showposts' => -1,
    'tax_query' => array(
        array(
            'taxonomy' => 'build-type',
            'terms' => $buildType,
            'field' => 'term_id',
        )
    ),
    'orderby' => 'title',
    'order' => 'ASC' )
);

On github here:

https://gist.github.com/1275191

Thanks!

3
  • Unaccepting my answer and accepting your own really hurts man... hurts me in my heart. If anybody needs me, I'll be in the lounge. Commented Oct 19, 2011 at 13:07
  • Hah sorry dude. I'm new to all this, didn't realise you could only have one answer. I will re-mark it so you can venture back out of the lounge Commented Oct 20, 2011 at 10:28
  • Haha man it's alright, I was just joking around - If you want to self-accept an answer its totally allowed, but be sure to Upvote my answer so I at least get some point love. Commented Oct 20, 2011 at 13:34
0

You need to create an array inside tax_query where you can also select operators. For example a print_r of tax_query should look like these.

 Array
(
    [relation] => AND
    [0] => Array
        (
            [taxonomy] => build-type
            [terms] => Array
                (
                    [0] => term1
                    [1] => term2blabla
                )

            [field] => slug
            [operator] => IN
        )

    [1] => Array
        (
            [taxonomy] => another-taxonomie
            [terms] => Array
                (
                    [0] => term1
                    [1] => term2
                )

            [field] => slug
            [operator] => IN
        )

)

Of course you can change the field for id but i always used slugs to keep it simpler. As you can see you can query multiple taxonomies like these.

-1

you don't need to use the tax_query,remove it and append the following:

term=>build-type,'build-type=>hotels' for example.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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