views:

4492

answers:

7

I created a custom taxonomy named 'technologies' but cannot query multiple terms like I can with categories or tags.

These querys DO work:

query_posts('tag=goldfish,airplanes');

query_posts('technologies=php');

However, neither of the following work correctly:

query_posts('technologies=php,sql');

query_posts('technologies=php&technologies=sql');

My objective: Show all posts with a technology of 'php' and all posts with a technology of 'sql'

Any ideas? Is this even possible? Thanks!

A: 

Does this work? query_posts('tag=bread+baking+recipe')

From: http://codex.wordpress.org/Template_Tags/query_posts

songdogtech
Unfortunately, query_posts('technologies=css+html'); does not return any posts, even though there are several posts associated with both of those terms.
thechrisvoth
+2  A: 

Apparently query_posts cannot help in this specific situation. (Hopefully it will be added in future versions of Wordpress!) The solution is to use a custom select query like the following:

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 = 'post' 
AND $wpdb->posts.post_status = 'publish'
AND $wpdb->term_taxonomy.taxonomy = 'technologies'
AND $wpdb->terms.slug = 'php' OR $wpdb->terms.slug = 'css'
ORDER BY $wpdb->posts.post_date DESC

More information can be found at the Wordpress Codex: http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query

thechrisvoth
A manual query like the above is exactly what I've ended up using. Right now it's the only way it works if you don't want to run multiple get_posts() queries one after the other (and you don't).
bobsoap
A: 

It's somehow silly that after implementing custom taxonomies in WP there are no built-in functions to use them at will, and the documentation is close to non-existent. I was looking for a solution, this query solves it (and made my day). Thanks.

Still, sadly I'm too dumb (OOP blind) to make it into a function so I don't repeat it all over. I get: **Fatal error**: Call to a member function get_results() on a non-object

I guess I don't know how to call $wpdb from within a function.

pax
I had to add "global $wpdb;" inside the function. Silly me. Realized it right after posting the above entry.
pax
A: 

OK, so here is my crack at this. It's a little hacky, but it works. The big downside is that any other query variables need to be re-added, as when multiple terms are invoked, the fail strips out all of the query vars.

Also, I did not test this against querying across multiple taxonomies. This only works within a specific taxonomy. Use at your own risk.

function multi_tax_terms($where) {
    global $wp_query;
    if ( strpos($wp_query->query_vars['term'], ',') !== false && strpos($where, "AND 0") !== false ) {
        // it's failing because taxonomies can't handle multiple terms
        //first, get the terms
        $term_arr = explode(",", $wp_query->query_vars['term']);
        foreach($term_arr as $term_item) {
            $terms[] = get_terms($wp_query->query_vars['taxonomy'], array('slug' => $term_item));
        }

        //next, get the id of posts with that term in that tax
        foreach ( $terms as $term ) {
            $term_ids[] = $term[0]->term_id;
        }

        $post_ids = get_objects_in_term($term_ids, $wp_query->query_vars['taxonomy']);

        if ( !is_wp_error($post_ids) && count($post_ids) ) {
            // build the new query
            $new_where = " AND wp_posts.ID IN (" . implode(', ', $post_ids) . ") ";
            // re-add any other query vars via concatenation on the $new_where string below here

            // now, sub out the bad where with the good
            $where = str_replace("AND 0", $new_where, $where);
        } else {
            // give up
        }
    }
    return $where;
}

add_filter("posts_where", "multi_tax_terms");
Bob Sherron
A: 

Hi - found this very useful. But as a newbie I am struggling with the display of the results. Let's say I have a taxonomy called 'dealtypes' used within a new post type 'deals', and I also have multiple terms for dealtypes, for example : 'featured-deal', 'businesses-for-sale', 'alliances', 'property-for-sale' etc.

I want to output a page showing as follows:

1) All featured deals: 2) Then a list of latest posts by dealtype:

Businesses For Sale date title excerpt

Alliances date title excerpt

etc.

In each case the list appears ONLY if there is a post classified in that taxonomy and term. In other words, I need to output the Term Name and any posts in that term, but the Term name doesn't appear if there are no posts. I hope this is clear.

Wd appreciate any help. Many thanks

David
A: 

it should be like this:

        global $wp_query;
        query_posts(
                array_merge(
                    array('taxonomy' => 'technologies', 'term' => array('sql', 'php')),
                    $wp_query->query
                )
            );

that works for custom post_types, at least.

Austin Web Developer
+2  A: 

You can use this plugin:

http://scribu.net/wordpress/query-multiple-taxonomies/

scribu
+1: This plugin worked immediately and unproblematically for me!
thesunneversets