Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

Can I get the term by it's id without knowing to whish taxonomy it belongs?

I have a meta field that stores term ids, but doesn't store the taxonomy. However, all the get_term function have taxonomy parameter marked as required.

Maybe I can get the taxonomy of the term by it's (term's) id somehow?

share|improve this question
add comment

2 Answers

up vote 2 down vote accepted

Yes, but you need you make your own SQL query.

A modified version of WP's get_term():

function &get_term_by_id_only($term, $output = OBJECT, $filter = 'raw') {
    global $wpdb;
    $null = null;

    if ( empty($term) ) {
        $error = new WP_Error('invalid_term', __('Empty Term'));
        return $error;
    }

    if ( is_object($term) && empty($term->filter) ) {
        wp_cache_add($term->term_id, $term, 'my_custom_queries');
        $_term = $term;
    } else {
        if ( is_object($term) )
            $term = $term->term_id;
        $term = (int) $term;
        if ( ! $_term = wp_cache_get($term, 'my_custom_queries') ) {
            $_term = $wpdb->get_row( $wpdb->prepare( "SELECT t.* FROM $wpdb->terms AS t WHERE t.term_id = %s LIMIT 1", $term) );
            if ( ! $_term )
                return $null;
            wp_cache_add($term, $_term, 'my_custom_queries');
        }
    }

    if ( $output == OBJECT ) {
        return $_term;
    } elseif ( $output == ARRAY_A ) {
        $__term = get_object_vars($_term);
        return $__term;
    } elseif ( $output == ARRAY_N ) {
        $__term = array_values(get_object_vars($_term));
        return $__term;
    } else {
        return $_term;
    }
}

Probably not a good idea. Try to handle the tax too in your meta fields...

share|improve this answer
    
Thanks, this is what I was looking for. My problem was that WPML didn't seem to pick up my get_term(1, 'x'). So it returned another language term instead? I used your code to write a method to query directly (and utilize the cache). Kudos for that! –  Till Jan 3 '12 at 15:54
add comment

I accepted One Trick Pony's answer because it got me on the right track and it does answer my question. However, in the end I am using this, it returns full term object with it's taxonomy fields. Though it's a bit hacky...

/**
 * Get ther without khowing it's taxonomy. Not very nice, though.
 * 
 * @uses type $wpdb
 * @uses get_term()
 * @param int|object $term
 * @param string $output
 * @param string $filter
 */
function &get_term_by_id($term, $output = OBJECT, $filter = 'raw') {
    global $wpdb;
    $null = null;

    if ( empty($term) ) {
        $error = new WP_Error('invalid_term', __('Empty Term'));
        return $error;
    }

    $_tax = $wpdb->get_row( $wpdb->prepare( "SELECT t.* FROM $wpdb->term_taxonomy AS t WHERE t.term_id = %s LIMIT 1", $term) );
    $taxonomy = $_tax->taxonomy;

    return get_term($term, $taxonomy, $output, $filter);

}
share|improve this answer
add comment

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.