Query multiple custom taxonomy terms in Wordpress 2.8?

18,435

Solution 1

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

Solution 2

This is a bit of a delayed reply, but it's first on Google at the moment for "wordpress related posts by multiple terms" so thought I'd contribute my findings.

Since this question was posted Wordpress has been changed to allow for this type of query. This will give you a list of posts related by any of the custom taxonomy terms assigned to an object:

$post_cats = wp_get_object_terms(get_the_ID(), 'video_category', array('fields' => 'ids'));

$args=array(
    "tax_query" => array(
        array(
            "taxonomy" => "video_category",
            "field" => "id",
            "terms" => $post_cats
        )
    ),
    'post__not_in' => array(get_the_ID()),
    'post_type' => 'video',
    'posts_per_page' => 8,
    'caller_get_posts' => 1
);

$related_by_cats = new WP_Query($args);

This is my first contribution to SO, I hope it's up to standards.

Solution 3

You can use this plugin:

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

Solution 4

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

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

Solution 5

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");
Share:
18,435
Chris Voth
Author by

Chris Voth

Updated on June 12, 2022

Comments

  • Chris Voth
    Chris Voth almost 2 years

    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!

  • Chris Voth
    Chris Voth almost 15 years
    Unfortunately, query_posts('technologies=css+html'); does not return any posts, even though there are several posts associated with both of those terms.
  • pax
    pax over 14 years
    I had to add "global $wpdb;" inside the function. Silly me. Realized it right after posting the above entry.
  • bobsoap
    bobsoap over 13 years
    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).
  • thesunneversets
    thesunneversets over 13 years
    +1: This plugin worked immediately and unproblematically for me!
  • jasonaburton
    jasonaburton over 11 years
    This query looks like it might work for what I am trying to do, but what if I wanted to search for multiple terms on one post? I've tried changing the OR to an AND (on line 9 of the query) and it doesn't seem to work.