WordPress.org

Make WordPress Core

Changeset 4419


Ignore:
Timestamp:
10/24/2006 10:52:59 AM (14 years ago)
Author:
markjaquith
Message:

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

Location:
trunk/wp-includes
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • 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
Note: See TracChangeset for help on using the changeset viewer.