Make WordPress Core

Ticket #3273: postmeta4.diff

File postmeta4.diff, 4.1 KB (added by markjaquith, 20 years ago)

This should be good to go

  • wp-includes/post.php

     
    274274
    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         }
     277        if ( !isset($post_meta_cache[$post_id]) )
     278                update_postmeta_cache($post_id);
    284279
    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         }
    293 
    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;
     285        }       else {
     286                return maybe_unserialize($post_meta_cache[$post_id][$key]);
    302287        }
    303 
    304         return maybe_unserialize($return);
    305288}
    306289
    307290function update_post_meta($post_id, $key, $value, $prev_value = '') {
     
    340323}
    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];
     334        if ( !isset($post_meta_cache[$post_id]) )
     335                update_postmeta_cache($post_id);
    353336
    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         }
     337        return $post_meta_cache[$post_id];
    374338}
    375339
    376340function get_post_custom_keys( $post_id = 0 ) {
    377341        $custom = get_post_custom( $post_id );
    378342
    379         if ( ! is_array($custom) )
     343        if ( !is_array($custom) )
    380344                return;
    381345
    382346        if ( $keys = array_keys($custom) )
  • wp-includes/functions.php

     
    563563
    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'];
    572589                        $mkey = $metarow['meta_key'];