WordPress.org

Make WordPress Core

Ticket #11531: term-cache.patch

File term-cache.patch, 13.0 KB (added by wonderboymusic, 3 years ago)
  • wp-includes/category.php

     
    1414 * @return object List of all of the category IDs. 
    1515 */ 
    1616function get_all_category_ids() { 
    17         if ( ! $cat_ids = wp_cache_get( 'all_category_ids', 'category' ) ) { 
    18                 $cat_ids = get_terms( 'category', array('fields' => 'ids', 'get' => 'all') ); 
    19                 wp_cache_add( 'all_category_ids', $cat_ids, 'category' ); 
    20         } 
    21  
    22         return $cat_ids; 
     17        // this call returns from cache if present 
     18        return get_terms( 'category', array( 'fields' => 'ids', 'get' => 'all' ) ); 
    2319} 
    2420 
    2521/** 
     
    3632 * @param string|array $args Optional. Change the defaults retrieving categories. 
    3733 * @return array List of categories. 
    3834 */ 
    39 function &get_categories( $args = '' ) { 
     35function get_categories( $args = '' ) { 
    4036        $defaults = array( 'taxonomy' => 'category' ); 
    4137        $args = wp_parse_args( $args, $defaults ); 
    4238 
     
    7874 * @param string $filter Optional. Default is raw or no WordPress defined filter will applied. 
    7975 * @return mixed Category data in type defined by $output parameter. 
    8076 */ 
    81 function &get_category( $category, $output = OBJECT, $filter = 'raw' ) { 
     77function get_category( $category, $output = OBJECT, $filter = 'raw' ) { 
    8278        $category = get_term( $category, 'category', $output, $filter ); 
    8379        if ( is_wp_error( $category ) ) 
    8480                return $category; 
     
    249245 * @param string|array $args Tag arguments to use when retrieving tags. 
    250246 * @return array List of tags. 
    251247 */ 
    252 function &get_tags( $args = '' ) { 
     248function get_tags( $args = '' ) { 
    253249        $tags = get_terms( 'post_tag', $args ); 
    254250 
    255251        if ( empty( $tags ) ) { 
     
    280276 * @param string $filter Optional. Default is raw or no WordPress defined filter will applied. 
    281277 * @return object|array Return type based on $output value. 
    282278 */ 
    283 function &get_tag( $tag, $output = OBJECT, $filter = 'raw' ) { 
     279function get_tag( $tag, $output = OBJECT, $filter = 'raw' ) { 
    284280        return get_term( $tag, 'post_tag', $output, $filter ); 
    285281} 
    286282 
  • wp-includes/taxonomy.php

     
    853853 * @see sanitize_term_field() The $context param lists the available values for get_term_by() $filter param. 
    854854 * 
    855855 * @param int|object $term If integer, will get from database. If object will apply filters and return $term. 
    856  * @param string $taxonomy Taxonomy name that $term is part of. 
     856 * @param string $taxonomy Optional if object is passed for $term. Taxonomy name that $term is part of. 
    857857 * @param string $output Constant OBJECT, ARRAY_A, or ARRAY_N 
    858858 * @param string $filter Optional, default is raw or no WordPress defined filter will applied. 
    859859 * @return mixed|null|WP_Error Term Row from database. Will return null if $term is empty. If taxonomy does not 
    860860 * exist then WP_Error will be returned. 
    861861 */ 
    862 function &get_term($term, $taxonomy, $output = OBJECT, $filter = 'raw') { 
     862function get_term($term, $taxonomy = '', $output = OBJECT, $filter = 'raw') { 
    863863        global $wpdb; 
    864864        $null = null; 
    865865 
     
    868868                return $error; 
    869869        } 
    870870 
    871         if ( ! taxonomy_exists($taxonomy) ) { 
    872                 $error = new WP_Error('invalid_taxonomy', __('Invalid taxonomy')); 
    873                 return $error; 
    874         } 
     871        if ( is_object( $term ) ) 
     872                $taxonomy = $term->taxonomy; 
    875873 
     874        if ( ! taxonomy_exists( $taxonomy ) ) 
     875                return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy' ) );     
     876 
    876877        if ( is_object($term) && empty($term->filter) ) { 
    877                 wp_cache_add($term->term_id, $term, $taxonomy); 
     878                update_term_cache( $term, $taxonomy ); 
    878879                $_term = $term; 
    879880        } else { 
    880881                if ( is_object($term) ) 
    881882                        $term = $term->term_id; 
     883                 
    882884                if ( !$term = (int) $term ) 
    883885                        return $null; 
    884                 if ( ! $_term = wp_cache_get($term, $taxonomy) ) { 
     886                 
     887                if ( ! $_term = wp_cache_get( $term, term_cache_group( $taxonomy ) ) ) { 
    885888                        $_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 t.term_id = %d LIMIT 1", $taxonomy, $term) ); 
    886889                        if ( ! $_term ) 
    887890                                return $null; 
    888                         wp_cache_add($term, $_term, $taxonomy); 
     891                         
     892                        update_term_cache( $_term, $taxonomy ); 
    889893                } 
    890894        } 
    891895 
     
    940944                return false; 
    941945 
    942946        if ( 'slug' == $field ) { 
    943                 $field = 't.slug'; 
    944                 $value = sanitize_title($value); 
    945                 if ( empty($value) ) 
     947                $value = sanitize_title( $value ); 
     948                if ( empty( $value ) ) 
    946949                        return false; 
     950                 
     951                $term_id = wp_cache_get( $value, term_cache_group( $taxonomy, $field ) ); 
     952                $field = 't.slug';               
    947953        } else if ( 'name' == $field ) { 
    948954                // Assume already escaped 
    949                 $value = stripslashes($value); 
    950                 $field = 't.name'; 
     955                $value = stripslashes( $value ); 
     956                $term_id = wp_cache_get( $value, term_cache_group( $taxonomy, $field ) ); 
     957                $field = 't.name';               
    951958        } else { 
    952                 $term = get_term( (int) $value, $taxonomy, $output, $filter); 
     959                $term_id = $value; 
     960        } 
     961         
     962        if ( ! empty( $term_id ) ) { 
     963                $term = get_term( (int) $term_id, $taxonomy, $output, $filter ); 
    953964                if ( is_wp_error( $term ) ) 
    954965                        $term = false; 
     966                 
    955967                return $term; 
    956968        } 
    957969 
     
    959971        if ( !$term ) 
    960972                return false; 
    961973 
    962         wp_cache_add($term->term_id, $term, $taxonomy); 
     974        update_term_cache( $term, $taxonomy ); 
    963975 
    964976        $term = apply_filters('get_term', $term, $taxonomy); 
    965977        $term = apply_filters("get_$taxonomy", $term, $taxonomy); 
     
    11761188 * @param string|array $args The values of what to search for when returning terms 
    11771189 * @return array|WP_Error List of Term Objects and their children. Will return WP_Error, if any of $taxonomies do not exist. 
    11781190 */ 
    1179 function &get_terms($taxonomies, $args = '') { 
     1191function get_terms($taxonomies, $args = '') { 
    11801192        global $wpdb; 
    11811193        $empty_array = array(); 
    11821194 
     
    12321244        } 
    12331245 
    12341246        // $args can be whatever, only use the args defined in defaults to compute the key 
    1235         $filter_key = ( has_filter('list_terms_exclusions') ) ? serialize($GLOBALS['wp_filter']['list_terms_exclusions']) : ''; 
    1236         $key = md5( serialize( compact(array_keys($defaults)) ) . serialize( $taxonomies ) . $filter_key ); 
     1247        // deprecate 'list_terms_exclusions' - use 'get_terms' filter instead 
     1248        if ( has_filter( 'list_terms_exclusions' ) ) 
     1249                _doing_it_wrong( __FUNCTION__, __( '"list_terms_exclusions" is no longer supported. Use the "get_terms" filter instead.' ), '3.5' ); 
     1250         
     1251        $key = md5( serialize( compact(array_keys($defaults)) ) . serialize( $taxonomies ) ); 
    12371252        $last_changed = wp_cache_get('last_changed', 'terms'); 
    12381253        if ( !$last_changed ) { 
    12391254                $last_changed = time(); 
     
    25562571 
    25572572        foreach ( $object_ids as $id ) 
    25582573                foreach ( get_object_taxonomies($object_type) as $taxonomy ) 
    2559                         wp_cache_delete($id, "{$taxonomy}_relationships"); 
     2574                        wp_cache_delete( $id, term_cache_group( $taxonomy, 'relationships' ) ); 
    25602575 
    25612576        do_action('clean_object_term_cache', $object_ids, $object_type); 
    25622577} 
     
    25792594 
    25802595        if ( !is_array($ids) ) 
    25812596                $ids = array($ids); 
    2582  
     2597         
    25832598        $taxonomies = array(); 
     2599         
     2600        $select = "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id"; 
     2601         
     2602        $ids = array_map( 'intval', $ids ); 
    25842603        // If no taxonomy, assume tt_ids. 
    2585         if ( empty($taxonomy) ) { 
    2586                 $tt_ids = array_map('intval', $ids); 
    2587                 $tt_ids = implode(', ', $tt_ids); 
    2588                 $terms = $wpdb->get_results("SELECT term_id, taxonomy FROM $wpdb->term_taxonomy WHERE term_taxonomy_id IN ($tt_ids)"); 
     2604        if ( empty( $taxonomy ) ) { 
     2605                $terms = $wpdb->get_results( $wpdb->prepare( "$select WHERE tt.term_taxonomy_id IN (" . join( ',', $ids ) . ")" ) ); 
    25892606                $ids = array(); 
    2590                 foreach ( (array) $terms as $term ) { 
     2607                foreach ( $terms as $term ) { 
    25912608                        $taxonomies[] = $term->taxonomy; 
    25922609                        $ids[] = $term->term_id; 
    2593                         wp_cache_delete($term->term_id, $term->taxonomy); 
    25942610                } 
    25952611                $taxonomies = array_unique($taxonomies); 
    25962612        } else { 
    2597                 $taxonomies = array($taxonomy); 
    2598                 foreach ( $taxonomies as $taxonomy ) { 
    2599                         foreach ( $ids as $id ) { 
    2600                                 wp_cache_delete($id, $taxonomy); 
    2601                         } 
    2602                 } 
     2613                $terms = $wpdb->get_results( $wpdb->prepare( "$select WHERE tt.taxonomy = %s AND tt.term_id IN (" . join( ',', $ids ) . ")", $taxonomy ) ); 
     2614                $taxonomies = array( $taxonomy );                
    26032615        } 
     2616         
     2617        foreach ( $terms as $term ) { 
     2618                wp_cache_delete( $term->term_id, term_cache_group( $term->taxonomy ) ); 
     2619                wp_cache_delete( $term->name, term_cache_group( $term->taxonomy, 'names' ) ); 
     2620                wp_cache_delete( $term->slug, term_cache_group( $term->taxonomy, 'slugs' ) );    
     2621        } 
    26042622 
    26052623        foreach ( $taxonomies as $taxonomy ) { 
    26062624                if ( isset($cleaned[$taxonomy]) ) 
     
    26082626                $cleaned[$taxonomy] = true; 
    26092627 
    26102628                if ( $clean_taxonomy ) { 
    2611                         wp_cache_delete('all_ids', $taxonomy); 
    2612                         wp_cache_delete('get', $taxonomy); 
    26132629                        delete_option("{$taxonomy}_children"); 
    26142630                        // Regenerate {$taxonomy}_children 
    26152631                        _get_term_hierarchy($taxonomy); 
     
    26342650 * @param string $taxonomy Taxonomy Name 
    26352651 * @return bool|array Empty array if $terms found, but not $taxonomy. False if nothing is in cache for $taxonomy and $id. 
    26362652 */ 
    2637 function &get_object_term_cache($id, $taxonomy) { 
    2638         $cache = wp_cache_get($id, "{$taxonomy}_relationships"); 
     2653function get_object_term_cache($id, $taxonomy) { 
     2654        $cache = wp_cache_get( $id, term_cache_group( $taxonomy, 'relationships' ) ); 
    26392655        return $cache; 
    26402656} 
    26412657 
     
    26752691        $ids = array(); 
    26762692        foreach ( (array) $object_ids as $id ) { 
    26772693                foreach ( $taxonomies as $taxonomy ) { 
    2678                         if ( false === wp_cache_get($id, "{$taxonomy}_relationships") ) { 
     2694                        if ( false === wp_cache_get( $id, term_cache_group( $taxonomy, 'relationships' ) ) ) { 
    26792695                                $ids[] = $id; 
    26802696                                break; 
    26812697                        } 
     
    27032719 
    27042720        foreach ( $object_terms as $id => $value ) { 
    27052721                foreach ( $value as $taxonomy => $terms ) { 
    2706                         wp_cache_add( $id, $terms, "{$taxonomy}_relationships" ); 
     2722                        wp_cache_add( $id, $terms, term_cache_group( $taxonomy, 'relationships' ) ); 
    27072723                } 
    27082724        } 
    27092725} 
     
    27182734 * @param array $terms List of Term objects to change 
    27192735 * @param string $taxonomy Optional. Update Term to this taxonomy in cache 
    27202736 */ 
    2721 function update_term_cache($terms, $taxonomy = '') { 
    2722         foreach ( (array) $terms as $term ) { 
    2723                 $term_taxonomy = $taxonomy; 
    2724                 if ( empty($term_taxonomy) ) 
    2725                         $term_taxonomy = $term->taxonomy; 
     2737function update_term_cache( $terms, $taxonomy = '' ) { 
     2738        if ( ! is_array( $terms ) ) 
     2739                $terms = array( $terms ); 
     2740         
     2741        foreach ( $terms as $term ) { 
     2742                $tax = $taxonomy; 
     2743                if ( empty( $tax ) ) 
     2744                        $tax = $term->taxonomy; 
    27262745 
    2727                 wp_cache_add($term->term_id, $term, $term_taxonomy); 
     2746                wp_cache_add( $term->term_id, $term, term_cache_group( $tax ) ); 
     2747                wp_cache_add( $term->name, $term->term_id, term_cache_group( $tax, 'names' ) ); 
     2748                wp_cache_add( $term->slug, $term->term_id, term_cache_group( $tax, 'slugs' ) ); 
    27282749        } 
    27292750} 
    27302751 
     2752/** 
     2753 * 
     2754 * @package WordPress 
     2755 * @subpackage Taxonomy 
     2756 * @since 3.5.0 
     2757 * 
     2758 * @param string $taxonomy Taxonomy 
     2759 * @param string $group Optional. ids, names, slugs, or relationships. 
     2760 */ 
     2761function term_cache_group( $taxonomy, $group = 'ids' ) { 
     2762        $tax = get_taxonomy( $taxonomy ); 
     2763         
     2764        if ( ! $tax ) 
     2765                return false; 
     2766 
     2767        if ( $tax->_builtin ) { 
     2768                $key = $taxonomy; 
     2769                switch ( $group ) { 
     2770                        case 'name': 
     2771                        case 'names': 
     2772                                $key = "$taxonomy:names"; 
     2773                                break; 
     2774                        case 'slug': 
     2775                        case 'slugs': 
     2776                                $key = "$taxonomy:slugs"; 
     2777                                break; 
     2778                        case 'relationship': 
     2779                        case 'relationships': 
     2780                                $key = "{$taxonomy}_relationships"; 
     2781                                break;                   
     2782                } 
     2783        } else { 
     2784                $key = "taxonomy:$taxonomy:ids"; 
     2785                switch ( $group ) { 
     2786                        case 'name': 
     2787                        case 'names': 
     2788                                $key = "taxonomy:$taxonomy:names"; 
     2789                                break; 
     2790                        case 'slug': 
     2791                        case 'slugs': 
     2792                                $key = "taxonomy:$taxonomy:slugs"; 
     2793                                break; 
     2794                        case 'relationship': 
     2795                        case 'relationships': 
     2796                                $key = "taxonomy:$taxonomy:relationships"; 
     2797                                break;                   
     2798                } 
     2799        } 
     2800         
     2801        return $key;     
     2802} 
     2803 
    27312804// 
    27322805// Private 
    27332806// 
     
    27802853 * @param string $taxonomy The taxonomy which determines the hierarchy of the terms. 
    27812854 * @return array The subset of $terms that are descendants of $term_id. 
    27822855 */ 
    2783 function &_get_term_children($term_id, $terms, $taxonomy) { 
     2856function _get_term_children($term_id, $terms, $taxonomy) { 
    27842857        $empty_array = array(); 
    27852858        if ( empty($terms) ) 
    27862859                return $empty_array; 
  • wp-includes/media.php

     
    11561156         * @uses WP_Embed::maybe_make_link() 
    11571157         * @uses get_option() 
    11581158         * @uses current_user_can() 
    1159          * @uses wp_cache_get() 
    1160          * @uses wp_cache_set() 
    11611159         * @uses get_post_meta() 
    11621160         * @uses update_post_meta() 
    11631161         * 
  • wp-includes/category-template.php

     
    10651065        $terms = get_object_term_cache( $post->ID, $taxonomy ); 
    10661066        if ( false === $terms ) { 
    10671067                $terms = wp_get_object_terms( $post->ID, $taxonomy ); 
    1068                 wp_cache_add($post->ID, $terms, $taxonomy . '_relationships'); 
     1068                wp_cache_add( $post->ID, $terms, term_cache_group( $taxonomy, 'relationships' ) ); 
    10691069        } 
    10701070 
    10711071        $terms = apply_filters( 'get_the_terms', $terms, $post->ID, $taxonomy );