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, 7 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