函数文档

delete_metadata_by_mid()

💡 云策文档标注

概述

delete_metadata_by_mid() 函数用于通过 meta ID 删除元数据。它接受元数据类型和 meta ID 作为参数,执行删除操作并返回布尔值表示成功或失败。

关键要点

  • 参数:$meta_type(字符串,必需)指定元数据类型,如 'post'、'user' 等;$meta_id(整数,必需)指定要删除的元数据行的 ID。
  • 返回值:成功删除返回 true,失败返回 false。
  • 功能:验证参数后,从数据库表中删除指定 meta ID 的元数据,并清除相关缓存。
  • 钩子:包括 delete_{$meta_type}_meta、deleted_{$meta_type}_meta 等,用于在删除前后执行自定义操作。
  • 相关函数:与 wpdb::delete()、wp_cache_delete() 等配合使用,确保数据一致性和性能。

代码示例

// 示例:删除一个 post 类型的元数据,meta ID 为 123
$result = delete_metadata_by_mid('post', 123);
if ($result) {
    echo '元数据删除成功';
} else {
    echo '元数据删除失败';
}

注意事项

  • 确保 $meta_type 有效且 $meta_id 为正整数,否则函数会返回 false。
  • 删除操作会触发相关钩子,开发者可以利用这些钩子进行扩展或日志记录。
  • 函数内部会清除缓存,但需注意在高并发场景下可能存在的缓存一致性问题。

📄 原文内容

Deletes metadata by meta ID.

Parameters

$meta_typestringrequired
Type of object metadata is for. Accepts 'blog', 'post', 'comment', 'term', 'user', or any other object type with an associated meta table.
$meta_idintrequired
ID for a specific meta row.

Return

bool True on successful delete, false on failure.

Source

function delete_metadata_by_mid( $meta_type, $meta_id ) {
	global $wpdb;

	// Make sure everything is valid.
	if ( ! $meta_type || ! is_numeric( $meta_id ) || floor( $meta_id ) != $meta_id ) {
		return false;
	}

	$meta_id = (int) $meta_id;
	if ( $meta_id <= 0 ) {
		return false;
	}

	$table = _get_meta_table( $meta_type );
	if ( ! $table ) {
		return false;
	}

	// Object and ID columns.
	$column    = sanitize_key( $meta_type . '_id' );
	$id_column = ( 'user' === $meta_type ) ? 'umeta_id' : 'meta_id';

	/**
	 * Short-circuits deleting metadata of a specific type by meta ID.
	 *
	 * The dynamic portion of the hook name, `$meta_type`, refers to the meta object type
	 * (blog, post, comment, term, user, or any other type with an associated meta table).
	 * Returning a non-null value will effectively short-circuit the function.
	 *
	 * Possible hook names include:
	 *
	 *  - `delete_blog_metadata_by_mid`
	 *  - `delete_post_metadata_by_mid`
	 *  - `delete_comment_metadata_by_mid`
	 *  - `delete_term_metadata_by_mid`
	 *  - `delete_user_metadata_by_mid`
	 *
	 * @since 5.0.0
	 *
	 * @param null|bool $delete  Whether to allow metadata deletion of the given type.
	 * @param int       $meta_id Meta ID.
	 */
	$check = apply_filters( "delete_{$meta_type}_metadata_by_mid", null, $meta_id );
	if ( null !== $check ) {
		return (bool) $check;
	}

	// Fetch the meta and go on if it's found.
	$meta = get_metadata_by_mid( $meta_type, $meta_id );
	if ( $meta ) {
		$object_id = (int) $meta->{$column};

		/** This action is documented in wp-includes/meta.php */
		do_action( "delete_{$meta_type}_meta", (array) $meta_id, $object_id, $meta->meta_key, $meta->meta_value );

		// Old-style action.
		if ( 'post' === $meta_type || 'comment' === $meta_type ) {
			/**
			 * Fires immediately before deleting post or comment metadata of a specific type.
			 *
			 * The dynamic portion of the hook name, `$meta_type`, refers to the meta
			 * object type (post or comment).
			 *
			 * Possible hook names include:
			 *
			 *  - `delete_postmeta`
			 *  - `delete_commentmeta`
			 *
			 * @since 3.4.0
			 *
			 * @param int $meta_id ID of the metadata entry to delete.
			 */
			do_action( "delete_{$meta_type}meta", $meta_id );
		}

		// Run the query, will return true if deleted, false otherwise.
		$result = (bool) $wpdb->delete( $table, array( $id_column => $meta_id ) );

		// Clear the caches.
		wp_cache_delete( $object_id, $meta_type . '_meta' );

		/** This action is documented in wp-includes/meta.php */
		do_action( "deleted_{$meta_type}_meta", (array) $meta_id, $object_id, $meta->meta_key, $meta->meta_value );

		// Old-style action.
		if ( 'post' === $meta_type || 'comment' === $meta_type ) {
			/**
			 * Fires immediately after deleting post or comment metadata of a specific type.
			 *
			 * The dynamic portion of the hook name, `$meta_type`, refers to the meta
			 * object type (post or comment).
			 *
			 * Possible hook names include:
			 *
			 *  - `deleted_postmeta`
			 *  - `deleted_commentmeta`
			 *
			 * @since 3.4.0
			 *
			 * @param int $meta_id Deleted metadata entry ID.
			 */
			do_action( "deleted_{$meta_type}meta", $meta_id );
		}

		return $result;

	}

	// Meta ID was not found.
	return false;
}

Hooks

do_action( “deleted_{$meta_type}meta”, int $meta_id )

Fires immediately after deleting post or comment metadata of a specific type.

do_action( “deleted_{$meta_type}_meta”, string[] $meta_ids, int $object_id, string $meta_key, mixed $_meta_value )

Fires immediately after deleting metadata of a specific type.

do_action( “delete_{$meta_type}meta”, int $meta_id )

Fires immediately before deleting post or comment metadata of a specific type.

do_action( “delete_{$meta_type}_meta”, string[] $meta_ids, int $object_id, string $meta_key, mixed $_meta_value )

Fires immediately before deleting metadata of a specific type.

apply_filters( “delete_{$meta_type}_metadata_by_mid”, null|bool $delete, int $meta_id )

Short-circuits deleting metadata of a specific type by meta ID.

Changelog

Version Description
3.3.0 Introduced.