WordPress.org

Make WordPress Core

Ticket #13170: get_terms_by.diff

File get_terms_by.diff, 2.0 KB (added by scribu, 8 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 ) {