WordPress.org

Make WordPress Core

Ticket #18195: update_delete_metadata_by_mid.2.patch

File update_delete_metadata_by_mid.2.patch, 4.3 KB (added by kovshenin, 4 years ago)

Adding some actions before and after update/delete by mid

  • wordpress/wp-includes/meta.php

     
    322322} 
    323323 
    324324/** 
     325 * Update meta data by meta ID 
     326 * 
     327 * @since 3.3.0 
     328 * 
     329 * @uses get_metadata_by_mid() Calls get_metadata_by_mid() to fetch the meta key, value 
     330 *              and object_id of the given meta_id. 
     331 * 
     332 * @param string $meta_type Type of object metadata is for (e.g., comment, post, or user) 
     333 * @param int $meta_id ID for a specific meta row 
     334 * @param string $meta_value Metadata value 
     335 * @param string $meta_key Optional, you can provide a meta key to update it 
     336 * @return bool True on successful update, false on failure. 
     337 */ 
     338function update_metadata_by_mid( $meta_type, $meta_id, $meta_value, $meta_key = false ) { 
     339        global $wpdb; 
     340         
     341        // Make sure everything is valid. 
     342        if ( ! $meta_type ) 
     343                return false; 
     344 
     345        if ( ! $meta_id = absint( $meta_id ) ) 
     346                return false; 
     347 
     348        if ( ! $table = _get_meta_table( $meta_type ) ) 
     349                return false; 
     350                 
     351        $column = esc_sql($meta_type . '_id'); 
     352        $id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id'; 
     353 
     354        // Fetch the meta and go on if it's found. 
     355        if ( $meta = get_metadata_by_mid( $meta_type, $meta_id ) ) { 
     356                $original_key = $meta->meta_key; 
     357                $original_value = $meta->meta_value; 
     358                $object_id = $meta->{$column}; 
     359                 
     360                // If a new meta_key (last parameter) was specified, change the meta key, 
     361                // otherwise use the original key in the update statement. 
     362                if ( false === $meta_key ) { 
     363                        $meta_key = $original_key; 
     364                } elseif ( ! is_string( $meta_key ) ) { 
     365                        return false; 
     366                } 
     367                         
     368                // Sanitize the meta 
     369                $_meta_value = $meta_value; 
     370                $meta_value = sanitize_meta( $meta_key, $meta_value, $meta_type ); 
     371                $meta_value = maybe_serialize( $meta_value ); 
     372                 
     373                // Format the data query arguments. 
     374                $data = array( 
     375                        'meta_key' => $meta_key, 
     376                        'meta_value' => $meta_value 
     377                ); 
     378                 
     379                // Format the where query arguments. 
     380                $where = array(); 
     381                $where[$id_column] = $meta_id; 
     382                 
     383                do_action( "update_{$meta_type}_meta_by_mid", $meta_id, $object_id, $meta_key, $_meta_value ); 
     384                 
     385                // Run the update query, all fields in $data are %s, $where is a %d. 
     386                $result = (bool) $wpdb->update( $table, $data, $where, '%s', '%d' ); 
     387                 
     388                // Clear the caches. 
     389                wp_cache_delete($object_id, $meta_type . '_meta'); 
     390                 
     391                // Users cache stores usermeta that must be cleared. 
     392                if ( 'user' == $meta_type ) 
     393                        clean_user_cache($object_id); 
     394                         
     395                do_action( "updated_{$meta_type}_meta_by_mid", $meta_id, $object_id, $meta_key, $_meta_value ); 
     396 
     397                return $result; 
     398        } 
     399         
     400        // And if the meta was not found. 
     401        return false; 
     402} 
     403 
     404/** 
     405 * Delete meta data by meta ID 
     406 * 
     407 * @since 3.3.0 
     408 * 
     409 * @uses get_metadata_by_mid() Calls get_metadata_by_mid() to fetch the meta key, value 
     410 *              and object_id of the given meta_id. 
     411 * 
     412 * @param string $meta_type Type of object metadata is for (e.g., comment, post, or user) 
     413 * @param int $meta_id ID for a specific meta row 
     414 * @return bool True on successful delete, false on failure. 
     415 */ 
     416function delete_metadata_by_mid( $meta_type, $meta_id ) { 
     417        global $wpdb; 
     418         
     419        // Make sure everything is valid. 
     420        if ( ! $meta_type ) 
     421                return false; 
     422 
     423        if ( ! $meta_id = absint( $meta_id ) ) 
     424                return false; 
     425 
     426        if ( ! $table = _get_meta_table( $meta_type ) ) 
     427                return false; 
     428         
     429        // object and id columns 
     430        $column = esc_sql($meta_type . '_id'); 
     431        $id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id'; 
     432 
     433        // Fetch the meta and go on if it's found. 
     434        if ( $meta = get_metadata_by_mid( $meta_type, $meta_id ) ) { 
     435                $object_id = $meta->{$column}; 
     436                 
     437                do_action( "delete_{$meta_type}_meta_by_mid", $meta_id, $object_id ); 
     438                 
     439                // Run the query, will return true if deleted, false otherwise 
     440                $result = (bool) $wpdb->query( $wpdb->prepare( "DELETE FROM $table WHERE $id_column = %d LIMIT 1;", $meta_id ) ); 
     441                 
     442                // Clear the caches. 
     443                wp_cache_delete($object_id, $meta_type . '_meta'); 
     444                 
     445                // Users cache stores usermeta that must be cleared. 
     446                if ( 'user' == $meta_type ) 
     447                        clean_user_cache($object_id); 
     448 
     449                do_action( "deleted_{$meta_type}_meta_by_mid", $meta_id, $object_id ); 
     450                         
     451                return $result; 
     452 
     453        } 
     454         
     455        // Meta id was not found. 
     456        return false; 
     457} 
     458 
     459/** 
    325460 * Update the metadata cache for the specified objects. 
    326461 * 
    327462 * @since 2.9.0