delete_metadata() WP 2.9.0

Видаляє метадані зазначеного об’єкта (пост, користувач, коментар).

Функція викликає фільтр delete_(meta_type)_meta , перед видаленням даних та фільтр deleted_(meta_type)_meta після видалення даних.

Повертає

true|false. true, якщо видалити метадані або false.

Використання

delete_metadata( $meta_type, $object_id, $meta_key, $meta_value, $delete_all );
$meta_type
(рядок) (обов’язковий)
Тип об’єкта, з яким буде працювати функція. Наприклад:
post,
user,
comment,
term.
$object_id
(число) (обов’язковий)
ID об’єкті, метадані якого потрібно видалити. Наприклад ID посту.
$meta_key
(рядок) (обов’язковий)
Назва ключа метаданих, які потрібно видалити. Наприклад: ключ довільного поля запису “title”.
$meta_value
(рядок/масив/число/об’єкт/логічний)
Якщо вказати це значення, то функція спробує знайти та видалити метадані із зазначеним тут значенням, коли в одного об’єкта зберігаються різні метадані з однаковими ключами. Наприклад, у посту 5 є довільні поля: title=значення 1 і title=значення 2, нам потрібно видалити “значення 2”, вказуємо його в цей параметр.


За замовчуванням: ”
$delete_all
(логічний)
Якщо вказати цей параметр у true, то функція проігнорує параметр $object_id і видалить зазначені метадані у всіх об’єктів. За промовчанням false – метадані видаляються лише у зазначеного об’єкта.


Типово: false

Приклади

0

#1 Видалимо довільне поле посту

Видалимо довільне поле з ключем “title” біля посту 25:

delete_metadata('post', 25, "title");
0

#2 функція delete_post_meta()

Код функції файлу /wp-includes/post.php:

function delete_post_meta( $post_id, $meta_key, $meta_value = '' ) {
	// Make sure meta is added to the post, немає revision.
	if ( $the_post = wp_is_post_revision($post_id) )
		$post_id = $the_post;

	return delete_metadata('post', $post_id, $meta_key, $meta_value);
}
0

#3 Видалимо всі метаполі з усієї БД

Цей код показує як видалити всі метаполі всіх користувачів із зазначеним ключем:

$meta_key = 'is_collapsed_menu';
$deleted = delete_metadata( 'user', '', $meta_key, '', true );
// $deleted буде містити кількість видалених рядків

нотатки

  • Global. wpdb. $wpdb WordPress database abstraction object.

список змін

З версії 2.9.0Введено.

Код delete_metadata() WP 6.0.2

function delete_metadata( $meta_type, $object_id, $meta_key, $meta_value = '', $delete_all = false ) {
	Global $wpdb;

	if ( ! $meta_type || ! $meta_key || ! is_numeric( $object_id ) && ! $delete_all ) {
		return false;
	}

	$object_id = absint($object_id);
	if ( ! $object_id && ! $delete_all ) {
		return false;
	}

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

	$type_column = sanitize_key( $meta_type . '_id' );
	$id_column = ( 'user' === $meta_type ) ? 'umeta_id': 'meta_id';

	// expected_slashed ($meta_key)
	$meta_key = wp_unslash( $meta_key );
	$meta_value = wp_unslash( $meta_value );

	/**
	 * Short-circuits deleting metadata of a specific type.
	 *
	 * The dynamic portion of the hook name, `$meta_type`, refers to the meta object type
	 * (post, comment, term, user, або будь-який інший тип with an associated meta table).
	 * Returning a non-null value буде ефективно short-circuit the function.
	 *
	 * Possible hook names include:
	 *
	 * - `delete_post_metadata`
	 * - `delete_comment_metadata`
	 * - `delete_term_metadata`
	 * - `delete_user_metadata`
	 *
	 * @ Since 3.1.0
	 *
	 * @param null|bool $delete Whether to allow metadata deletion of the given type.
	 * @param int $object_id ID object metadata is for.
	 * @param string $meta_key Metadata key.
	 * @param mixed $meta_value Metadata value. Must be serializable if non-scalar.
	 * @param bool $delete_all Whether to delete the matching metadata entries
	 * for all objects, ignoring specified $object_id.
	 * Default false.
	 */
	$check = apply_filters( "delete_{$meta_type}_metadata", null, $object_id, $meta_key, $meta_value, $delete_all );
	if ( null !== $check ) {
		return (bool) $check;
	}

	$_meta_value = $meta_value;
	$meta_value = maybe_serialize( $meta_value );

	$query = $wpdb->prepare( "SELECT $id_column FROM $table WHERE meta_key = %s", $meta_key );

	if (! $delete_all) {
		$query .= $wpdb->prepare( " AND $type_column = %d", $object_id );
	}

	if ( '' !== $meta_value && null !== $meta_value && false !== $meta_value ) {
		$query .= $wpdb->prepare( ' AND meta_value = %s', $meta_value );
	}

	$meta_ids = $wpdb->get_col( $query );
	if ( ! count( $meta_ids ) ) {
		return false;
	}

	if ($ delete_all) {
		if ( '' !== $meta_value && null !== $meta_value && false !== $meta_value ) {
			$object_ids = $wpdb->get_col( $wpdb->prepare( "SELECT $type_column FROM $table WHERE meta_key = %s AND meta_value = %s", $meta_key, $meta_value ) );
		} else {
			$object_ids = $wpdb->get_col( $wpdb->prepare( "SELECT $type_column FROM $table WHERE meta_key = %s", $meta_key ) );
		}
	}

	/**
	 * Fires immediately before deleting metadata of a specific type.
	 *
	 * The dynamic portion of the hook name, `$meta_type`, refers to the meta object type
	 * (post, comment, term, user, або будь-який інший тип with an associated meta table).
	 *
	 * Possible hook names include:
	 *
	 * - `delete_post_meta`
	 * - `delete_comment_meta`
	 * - `delete_term_meta`
	 * - `delete_user_meta`
	 *
	 * @ Since 3.1.0
	 *
	 * @param string[] $meta_ids На array of metadata entry IDs to delete.
	 * @param int $object_id ID object metadata is for.
	 * @param string $meta_key Metadata key.
	 * @param mixed $_meta_value Metadata value.
	 */
	do_action( "delete_{$meta_type}_meta", $meta_ids, $object_id, $meta_key, $_meta_value);

	// Old-style action.
	if ( 'post' === $meta_type ) {
		/**
		 * Fires immediately before deleting metadata for a post.
		 *
		 * @ Since 2.9.0
		 *
		 * @param string[] $meta_ids На array of metadata entry IDs to delete.
		 */
		do_action( 'delete_postmeta', $meta_ids );
	}

	$query = "DELETE FROM $table WHERE $id_column IN( " . implode( ',', $meta_ids ) . ' )';

	$count = $wpdb->query($query);

	if (! $count) {
		return false;
	}

	if ($ delete_all) {
		$data = (array) $object_ids;
	} else {
		$ data = array ($ object_id);
	}
	wp_cache_delete_multiple( $data, $meta_type . '_meta' );

	/**
	 * Fires immediately after deleting metadata of a specific type.
	 *
	 * The dynamic portion of the hook name, `$meta_type`, refers to the meta object type
	 * (post, comment, term, user, або будь-який інший тип with an associated meta table).
	 *
	 * Possible hook names include:
	 *
	 * - `deleted_post_meta`
	 * - `deleted_comment_meta`
	 * - `deleted_term_meta`
	 * - `deleted_user_meta`
	 *
	 * @ Since 2.9.0
	 *
	 * @param string[] $meta_ids На array of metadata entry IDs to delete.
	 * @param int $object_id ID object metadata is for.
	 * @param string $meta_key Metadata key.
	 * @param mixed $_meta_value Metadata value.
	 */
	do_action( "deleted_{$meta_type}_meta", $meta_ids, $object_id, $meta_key, $_meta_value );

	// Old-style action.
	if ( 'post' === $meta_type ) {
		/**
		 * Fires immediately after deleting metadata for a post.
		 *
		 * @ Since 2.9.0
		 *
		 * @param string[] $meta_ids На array of metadata entry IDs to delete.
		 */
		do_action( 'deleted_postmeta', $meta_ids );
	}

	return true;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *