WordPress.org

Make WordPress Core

Ticket #13170: get_terms_by.2.diff

File get_terms_by.2.diff, 4.1 KB (added by scribu, 4 years ago)

introduce wp_cache_get_group()

  • wp-includes/taxonomy.php

     
    516516        if ( ! is_taxonomy($taxonomy) ) 
    517517                return false; 
    518518 
    519         if ( 'slug' == $field ) { 
    520                 $field = 't.slug'; 
    521                 $value = sanitize_title($value); 
    522                 if ( empty($value) ) 
     519        $terms = wp_cache_get_group($taxonomy); 
     520        $in_cache = false; 
     521        foreach ( $terms as $term ) 
     522                if ( $term->$field == $value ) { 
     523                        $term = wp_clone($term); 
     524                        $in_cache = true; 
     525                        break; 
     526                } 
     527 
     528        if ( ! $in_cache ) { 
     529                if ( 'slug' == $field ) { 
     530                        $field = 't.slug'; 
     531                        $value = sanitize_title($value); 
     532                        if ( empty($value) ) 
     533                                return false; 
     534                } else if ( 'name' == $field ) { 
     535                        // Assume already escaped 
     536                        $value = stripslashes($value); 
     537                        $field = 't.name'; 
     538                } else { 
     539                        $field = 't.term_id'; 
     540                        $value = (int) $value; 
     541                } 
     542 
     543                $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 ) ); 
     544                if ( !$term ) 
    523545                        return false; 
    524         } else if ( 'name' == $field ) { 
    525                 // Assume already escaped 
    526                 $value = stripslashes($value); 
    527                 $field = 't.name'; 
    528         } else { 
    529                 $field = 't.term_id'; 
    530                 $value = (int) $value; 
     546 
     547                wp_cache_add($term->term_id, $term, $taxonomy); 
    531548        } 
    532549 
    533         $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) ); 
    534         if ( !$term ) 
    535                 return false; 
    536  
    537         wp_cache_add($term->term_id, $term, $taxonomy); 
    538  
    539550        $term = sanitize_term($term, $taxonomy, $filter); 
    540551 
    541552        if ( $output == OBJECT ) { 
  • wp-includes/cache.php

     
    8383 * @see WP_Object_Cache::get() 
    8484 * 
    8585 * @param int|string $id What the contents in the cache are called 
    86  * @param string $flag Where the cache contents are grouped 
     86 * @param string $group Where the cache contents are grouped 
    8787 * @return bool|mixed False on failure to retrieve contents or the cache 
    8888 *              contents on success 
    8989 */ 
    90 function wp_cache_get($id, $flag = '') { 
     90function wp_cache_get($id, $group = '') { 
    9191        global $wp_object_cache; 
    9292 
    93         return $wp_object_cache->get($id, $flag); 
     93        return $wp_object_cache->get($id, $group); 
    9494} 
    9595 
    9696/** 
     97 * Retrieves the cached items in a group 
     98 * 
     99 * @since 3.1.0 
     100 * @uses $wp_object_cache Object Cache Class 
     101 * @see WP_Object_Cache::get_group() 
     102 * 
     103 * @param string $group Where the cache contents are grouped 
     104 * @return array List of cached objects 
     105 */ 
     106function wp_cache_get_group($group) { 
     107        global $wp_object_cache; 
     108 
     109        return $wp_object_cache->get_group($group); 
     110} 
     111 
     112 
     113/** 
    97114 * Sets up Object Cache Global and assigns it. 
    98115 * 
    99116 * @since 2.0.0 
     
    346363         *              contents on success 
    347364         */ 
    348365        function get($id, $group = 'default') { 
    349                 if ( empty ($group) ) 
     366                if ( empty($group) ) 
    350367                        $group = 'default'; 
    351368 
    352                 if ( isset ($this->cache[$group][$id]) ) { 
    353                         $this->cache_hits += 1; 
     369                if ( isset($this->cache[$group][$id]) ) { 
     370                        $this->cache_hits++; 
    354371                        if ( is_object($this->cache[$group][$id]) ) 
    355372                                return wp_clone($this->cache[$group][$id]); 
    356373                        else 
    357374                                return $this->cache[$group][$id]; 
    358375                } 
    359376 
    360                 if ( isset ($this->non_existent_objects[$group][$id]) ) 
     377                if ( isset($this->non_existent_objects[$group][$id]) ) 
    361378                        return false; 
    362379 
    363380                $this->non_existent_objects[$group][$id] = true; 
    364                 $this->cache_misses += 1; 
     381                $this->cache_misses++; 
    365382                return false; 
    366383        } 
    367384 
    368385        /** 
     386         * Retrieves the cached items in a group 
     387         * 
     388         * @since 3.1.0 
     389         * 
     390         * @param string $group Where the cache contents are grouped 
     391         * @return array List of cached objects 
     392         */ 
     393        function get_group($group) { 
     394                if ( isset($this->cache[$group]) ) { 
     395                        $this->cache_hits++; 
     396                        return $this->cache[$group]; 
     397                } 
     398 
     399                $this->cache_misses++; 
     400                return array(); 
     401        } 
     402 
     403        /** 
    369404         * Replace the contents in the cache, if contents already exist 
    370405         * 
    371406         * @since 2.0.0