WordPress.org

Make WordPress Core

Ticket #13170: get_terms_by.diff

File get_terms_by.diff, 2.0 KB (added by scribu, 5 years ago)
  • wp-includes/taxonomy.php

     
    500500 * @return mixed Term Row from database. Will return false if $taxonomy does not exist or $term was not found. 
    501501 */ 
    502502function get_term_by($field, $value, $taxonomy, $output = OBJECT, $filter = 'raw') { 
    503         global $wpdb; 
     503        global $wpdb, $wp_object_cache; 
    504504 
    505505        if ( ! is_taxonomy($taxonomy) ) 
    506506                return false; 
    507507 
    508         if ( 'slug' == $field ) { 
    509                 $field = 't.slug'; 
    510                 $value = sanitize_title($value); 
    511                 if ( empty($value) ) 
     508        $terms = $wp_object_cache->cache[$taxonomy]; 
     509        $in_cache = false; 
     510        foreach ( $terms as $term ) 
     511                if ( $term->$field == $value ) { 
     512                        $term = wp_clone($term); 
     513                        $in_cache = true; 
     514                        break; 
     515                } 
     516 
     517        if ( ! $in_cache ) { 
     518                if ( 'slug' == $field ) { 
     519                        $field = 't.slug'; 
     520                        $value = sanitize_title($value); 
     521                        if ( empty($value) ) 
     522                                return false; 
     523                } else if ( 'name' == $field ) { 
     524                        // Assume already escaped 
     525                        $value = stripslashes($value); 
     526                        $field = 't.name'; 
     527                } else { 
     528                        $field = 't.term_id'; 
     529                        $value = (int) $value; 
     530                } 
     531 
     532                $term = $wpdb->get_row( $wpdb->prepare( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy = %s AND $field = %s LIMIT 1", $taxonomy, $value) ); 
     533                if ( !$term ) 
    512534                        return false; 
    513         } else if ( 'name' == $field ) { 
    514                 // Assume already escaped 
    515                 $value = stripslashes($value); 
    516                 $field = 't.name'; 
    517         } else { 
    518                 $field = 't.term_id'; 
    519                 $value = (int) $value; 
     535 
     536                wp_cache_add($term->term_id, $term, $taxonomy); 
    520537        } 
    521538 
    522         $term = $wpdb->get_row( $wpdb->prepare( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy = %s AND $field = %s LIMIT 1", $taxonomy, $value) ); 
    523         if ( !$term ) 
    524                 return false; 
    525  
    526         wp_cache_add($term->term_id, $term, $taxonomy); 
    527  
    528539        $term = sanitize_term($term, $taxonomy, $filter); 
    529540 
    530541        if ( $output == OBJECT ) {