WordPress.org

Support

Support » How-To and Troubleshooting » [Resolved] Querying Taxonomies

[Resolved] Querying Taxonomies

  • scarekrow76
    Member

    @scarekrow76

    Could anyone give me a push in the right direction? This is for a menu system.

    I currently have Posts and 2 Taxonomies. Based on the ID of a Term in the first Taxonomy, I need to return a list/array of Terms in the second Taxonomy where they share a common Post.

    Does that make sense?

Viewing 15 replies - 1 through 15 (of 19 total)
  • TC.K
    Participant

    @wp_dummy

    This is what I looking for, just want to post a similar question and saw your question. Seem I am not the only one that looking for this solution.

    Anybody please.

    scarekrow76
    Member

    @scarekrow76

    I know it can be done via a custom SQL query but my brain just isn’t working today and I need to get it done for the client ASAP.

    scarekrow76
    Member

    @scarekrow76

    Does anyone have a better suggestion than this?

    SELECT DISTINCT $wpdb->terms.term_id, $wpdb->terms.name, $wpdb->terms.slug
    FROM $wpdb->terms
    INNER JOIN $wpdb->term_taxonomy ON $wpdb->terms.term_id = $wpdb->term_taxonomy.term_id
    INNER JOIN $wpdb->term_relationships ON $wpdb->term_taxonomy.term_taxonomy_id = $wpdb->term_relationships.term_taxonomy_id
    INNER JOIN $wpdb->posts ON $wpdb->term_relationships.object_id = $wpdb->posts.ID
    INNER JOIN $wpdb->term_relationships tr2 ON $wpdb->posts.ID = tr2.object_id
    INNER JOIN $wpdb->term_taxonomy tt2 ON tr2.term_taxonomy_id = tt2.term_taxonomy_id
    WHERE $wpdb->posts.post_status = 'publish' AND $wpdb->posts.post_type = 'post' AND $wpdb->term_taxonomy.taxonomy = 'tasks' AND tt2.term_id = 592
    ORDER BY $wpdb->terms.name
    TC.K
    Participant

    @wp_dummy

    This is what I found on wpquestion

    $terms = get_terms(array('tax1', 'tax2'));
    foreach($terms as $term) {
    	echo "<a href='/statistics/term/" . $term->slug . "'";
    	echo "class='" . $term->taxonomy . "'>";
    	echo $term->name;
    	echo "</a>";
    }

    Never tried though.

    scarekrow76
    Member

    @scarekrow76

    Yes, that would give you a list of all terms with the two taxonomies supplied.

    http://codex.wordpress.org/Function_Reference/get_terms

    What I’m attempting to do is only select terms within Taxonmy A that have been assigned to Posts which a specific term in Taxonomy B has also been assigned.

    Should be able to accomplish it with my SQL query, but I was hoping there might be a simpler way.

    TC.K
    Participant

    @wp_dummy

    I see.

    Are you using hierarchy taxonomies? Or, you using two mutually exclusive taxonomies?

    scarekrow76
    Member

    @scarekrow76

    If only it were that simple. At the insistance of the client, there are two seperate taxonomies. A Post should always be assigned atleast one term from each taxonomy.

    I *think* I have it now. Just slotting it into a plugin and will then test it.

    TC.K
    Participant

    @wp_dummy

    Really, that’s great. Can’t wait to see your solution. 🙂

    scarekrow76
    Member

    @scarekrow76

    if ( !function_exists( 'get_associated_terms' ) ) {
    	function get_associated_terms( $taxonomy_slug, $term_id = 0 ) {
    		global $wpdb;
    
    		$sql = "SELECT DISTINCT $wpdb->terms.term_id, $wpdb->terms.name, $wpdb->terms.slug, $wpdb->terms.term_group, $wpdb->term_taxonomy.term_taxonomy_id, $wpdb->term_taxonomy.taxonomy, $wpdb->term_taxonomy.description, $wpdb->term_taxonomy.parent, $wpdb->term_taxonomy.count
    			FROM $wpdb->terms
    			INNER JOIN $wpdb->term_taxonomy ON $wpdb->terms.term_id = $wpdb->term_taxonomy.term_id
    			INNER JOIN $wpdb->term_relationships ON $wpdb->term_taxonomy.term_taxonomy_id = $wpdb->term_relationships.term_taxonomy_id
    			INNER JOIN $wpdb->posts ON $wpdb->term_relationships.object_id = $wpdb->posts.ID
    			INNER JOIN $wpdb->term_relationships tr2 ON $wpdb->posts.ID = tr2.object_id
    			INNER JOIN $wpdb->term_taxonomy tt2 ON tr2.term_taxonomy_id = tt2.term_taxonomy_id
    			WHERE $wpdb->posts.post_status = 'publish' AND $wpdb->posts.post_type = 'post' AND $wpdb->term_taxonomy.taxonomy = %s AND tt2.term_id = %d
    			ORDER BY $wpdb->terms.name";
    
    		$safe_sql = $wpdb->prepare( $sql, $taxonomy_slug, $term_id );
    
    		$results = $wpdb->get_results( $safe_sql, OBJECT );
    
    		return $results;
    	}
    }

    @cornflower Design, can you elaborate how to use ur code?

    Sorry, I am a novice in coding. Hope you don’t mind to help me out.

    Thanks

    scarekrow76
    Member

    @scarekrow76

    @fune : Once added to your functions.php file or a plugin, its used in the same way you’d use a built-in function like get_terms() (except my function accepts fewer parameters).

    http://codex.wordpress.org/Function_Reference/get_terms

    It returns an object that can be looped through.

    $terms = get_associated_terms( 'tax1', 256 );
    foreach($terms as $term) {
    	echo "<a href='/tax1/" . $term->slug . "'";
    	echo "class='" . $term->taxonomy . "'>";
    	echo $term->name;
    	echo "</a>";
    }

    @cornflower Design, Thank you very much. 🙂

    @cornflower Design, i tried your code but nothing displayed.

    Correct me if I am wrong, in the $terms = get_associated_terms( 'my_tax', 123); isn’t it the ‘123’ is the term_id in taxonomy ‘my_tax’?

    scarekrow76
    Member

    @scarekrow76

    @fune : The first parameter is the name of the taxonomy you wish to return. The second parameter is the ID of a term within your starting taxonomy.

    Running my example would return an Object containing all terms within the ‘tax1’ taxonomy which are assigned to posts that also have term 256 assigned to them.

    TC.K
    Participant

    @wp_dummy

    @cornflower Design,
    Glad that you finally found solution. However, I also have problem to use your codes.

    I have two custom taxonomy for a post, let’s say ‘state’ and ‘city’ and I use your codes in the archive page.
    When I landed on the ‘state’ of New York, I expect to see the ‘city’ terms that shared the same post.

    So I tweak a bit of your codes:

    $queried_object = get_queried_object();
      $term_id = $wp_query->queried_object->term_id;
      $terms = get_associated_terms( 'city',$term_id);
     foreach($terms as $term) {
     echo "<a href='/city/" . $term->slug . "'";
    	echo "class='" . $term->taxonomy . "'>";
    	echo $term->name;
    	echo "</a>";

    The problem is no result returned, even I tried to insert term_id manually with the actually number without the wp_query.

    Am I correctly implement your codes? Does this codes have use in the content loop or outside the content loop?

Viewing 15 replies - 1 through 15 (of 19 total)
  • The topic ‘[Resolved] Querying Taxonomies’ is closed to new replies.