Changeset 4419

Show
Ignore:
Timestamp:
10/24/06 10:52:59 (2 years ago)
Author:
markjaquith
Message:

Fix post meta caching system to reduce queries and eliminate redundant WP code. fixes #3273

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/wp-includes/functions.php

    r4383 r4419  
    564564    update_post_category_cache($post_id_list); 
    565565 
     566    update_postmeta_cache($post_id_list); 
     567} 
     568 
     569function update_postmeta_cache($post_id_list = '') { 
     570    global $wpdb, $post_meta_cache; 
     571 
     572    // We should validate this comma-separated list for the upcoming SQL query 
     573    $post_id_list = preg_replace('|[^0-9,]|', '', $post_id_list); 
     574 
     575    // we're marking each post as having its meta cached (with no keys... empty array), to prevent posts with no meta keys from being queried again 
     576    // any posts that DO have keys will have this empty array overwritten with a proper array, down below 
     577    $post_id_array = explode(',', $post_id_list); 
     578    foreach ( (array) $post_id_array as $pid ) 
     579        $post_meta_cache[$pid] = array(); 
     580 
    566581    // Get post-meta info 
    567582    if ( $meta_list = $wpdb->get_results("SELECT post_id, meta_key, meta_value FROM $wpdb->postmeta WHERE post_id IN($post_id_list) ORDER BY post_id, meta_key", ARRAY_A) ) { 
    568583        // Change from flat structure to hierarchical: 
    569         $post_meta_cache = array(); 
     584        if ( !isset($post_meta_cache) ) 
     585            $post_meta_cache = array(); 
     586 
    570587        foreach ($meta_list as $metarow) { 
    571588            $mpid = (int) $metarow['post_id']; 
  • trunk/wp-includes/post.php

    r4409 r4419  
    275275    $post_id = (int) $post_id; 
    276276 
    277     if ( isset($post_meta_cache[$post_id][$key]) ) { 
    278         if ( $single ) { 
    279             return maybe_unserialize( $post_meta_cache[$post_id][$key][0] ); 
    280         } else { 
    281             return maybe_unserialize( $post_meta_cache[$post_id][$key] ); 
    282         } 
    283     } 
    284  
    285     $metalist = $wpdb->get_results("SELECT meta_value FROM $wpdb->postmeta WHERE post_id = '$post_id' AND meta_key = '$key'", ARRAY_N); 
    286  
    287     $values = array(); 
    288     if ( $metalist ) { 
    289         foreach ($metalist as $metarow) { 
    290             $values[] = $metarow[0]; 
    291         } 
    292     } 
     277    if ( !isset($post_meta_cache[$post_id]) ) 
     278        update_postmeta_cache($post_id); 
    293279 
    294280    if ( $single ) { 
    295         if ( count($values) ) { 
    296             $return = maybe_unserialize( $values[0] ); 
    297         } else { 
     281        if ( isset($post_meta_cache[$post_id][$key][0]) ) 
     282            return maybe_unserialize($post_meta_cache[$post_id][$key][0]); 
     283        else 
    298284            return ''; 
    299         } 
    300     } else { 
    301         $return = $values; 
    302     } 
    303  
    304     return maybe_unserialize($return); 
     285    }   else { 
     286        return maybe_unserialize($post_meta_cache[$post_id][$key]); 
     287    } 
    305288} 
    306289 
     
    341324 
    342325 
    343 function get_post_custom( $post_id = 0 ) { 
     326function get_post_custom($post_id = 0) { 
    344327    global $id, $post_meta_cache, $wpdb; 
    345328 
    346     if ( ! $post_id ) 
     329    if ( !$post_id ) 
    347330        $post_id = $id; 
    348331 
    349332    $post_id = (int) $post_id; 
    350333 
    351     if ( isset($post_meta_cache[$post_id]) ) 
    352         return $post_meta_cache[$post_id]; 
    353  
    354     if ( $meta_list = $wpdb->get_results("SELECT post_id, meta_key, meta_value FROM $wpdb->postmeta WHERE post_id = '$post_id' ORDER BY post_id, meta_key", ARRAY_A) ) { 
    355         // Change from flat structure to hierarchical: 
    356         $post_meta_cache = array(); 
    357         foreach ( $meta_list as $metarow ) { 
    358             $mpid = (int) $metarow['post_id']; 
    359             $mkey = $metarow['meta_key']; 
    360             $mval = $metarow['meta_value']; 
    361  
    362             // Force subkeys to be array type: 
    363             if ( !isset($post_meta_cache[$mpid]) || !is_array($post_meta_cache[$mpid]) ) 
    364                 $post_meta_cache[$mpid] = array(); 
    365  
    366             if ( !isset($post_meta_cache[$mpid]["$mkey"]) || !is_array($post_meta_cache[$mpid]["$mkey"]) ) 
    367                 $post_meta_cache[$mpid]["$mkey"] = array(); 
    368  
    369             // Add a value to the current pid/key: 
    370             $post_meta_cache[$mpid][$mkey][] = $mval; 
    371         } 
    372         return $post_meta_cache[$mpid]; 
    373     } 
     334    if ( !isset($post_meta_cache[$post_id]) ) 
     335        update_postmeta_cache($post_id); 
     336 
     337    return $post_meta_cache[$post_id]; 
    374338} 
    375339 
     
    377341    $custom = get_post_custom( $post_id ); 
    378342 
    379     if ( ! is_array($custom) ) 
     343    if ( !is_array($custom) ) 
    380344        return; 
    381345