WordPress.org

Make WordPress Core

Ticket #18195: update_delete_metadata_by_mid.patch

File update_delete_metadata_by_mid.patch, 3.9 KB (added by kovshenin, 7 years ago)

Removing expected slashes and implementing the delete function

  • 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                $object_id = $meta->{$column};
     358               
     359                // If a new meta_key (last parameter) was specified, change the meta key,
     360                // otherwise use the original key in the update statement.
     361                if ( false === $meta_key ) {
     362                        $meta_key = $original_key;
     363                } elseif ( ! is_string( $meta_key ) ) {
     364                        return false;
     365                }
     366                       
     367                // Sanitize the meta
     368                $meta_value = sanitize_meta( $meta_key, $meta_value, $meta_type );
     369                $meta_value = maybe_serialize( $meta_value );
     370               
     371                // Format the data query arguments.
     372                $data = array(
     373                        'meta_key' => $meta_key,
     374                        'meta_value' => $meta_value
     375                );
     376               
     377                // Format the where query arguments.
     378                $where = array();
     379                $where[$id_column] = $meta_id;
     380               
     381                // Run the update query, all fields in $data are %s, $where is a %d.
     382                $result = (bool) $wpdb->update( $table, $data, $where, '%s', '%d' );
     383               
     384                // Clear the caches.
     385                wp_cache_delete($object_id, $meta_type . '_meta');
     386               
     387                // Users cache stores usermeta that must be cleared.
     388                if ( 'user' == $meta_type )
     389                        clean_user_cache($object_id);
     390
     391                return $result;
     392        }
     393       
     394        // And if the meta was not found.
     395        return false;
     396}
     397
     398/**
     399 * Delete meta data by meta ID
     400 *
     401 * @since 3.3.0
     402 *
     403 * @uses get_metadata_by_mid() Calls get_metadata_by_mid() to fetch the meta key, value
     404 *              and object_id of the given meta_id.
     405 *
     406 * @param string $meta_type Type of object metadata is for (e.g., comment, post, or user)
     407 * @param int $meta_id ID for a specific meta row
     408 * @return bool True on successful delete, false on failure.
     409 */
     410function delete_metadata_by_mid( $meta_type, $meta_id ) {
     411        global $wpdb;
     412       
     413        // Make sure everything is valid.
     414        if ( ! $meta_type )
     415                return false;
     416
     417        if ( ! $meta_id = absint( $meta_id ) )
     418                return false;
     419
     420        if ( ! $table = _get_meta_table( $meta_type ) )
     421                return false;
     422       
     423        // object and id columns
     424        $column = esc_sql($meta_type . '_id');
     425        $id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id';
     426
     427        // Fetch the meta and go on if it's found.
     428        if ( $meta = get_metadata_by_mid( $meta_type, $meta_id ) ) {
     429                $object_id = $meta->{$column};
     430               
     431                // Run the query, will return true if deleted, false otherwise
     432                $result = (bool) $wpdb->query( $wpdb->prepare( "DELETE FROM $table WHERE $id_column = %d LIMIT 1;", $meta_id ) );
     433               
     434                // Clear the caches.
     435                wp_cache_delete($object_id, $meta_type . '_meta');
     436               
     437                // Users cache stores usermeta that must be cleared.
     438                if ( 'user' == $meta_type )
     439                        clean_user_cache($object_id);
     440                       
     441                return $result;
     442
     443        }
     444       
     445        // Meta id was not found.
     446        return false;
     447}
     448
     449/**
    325450 * Update the metadata cache for the specified objects.
    326451 *
    327452 * @since 2.9.0