update_metadata() WP 2.9.0

Оновлює метадані для зазначеного об’єкта (пост, користувач, коментар). Якщо вказаних даних не знайдено, вони будуть додані, як нові.

Екранування у значеннях довільних полів

ВАЖЛИВО! Функція очікує екранований рядок у параметрах $meta_key та $meta_value .

Перед записом до бази даних значення довільних полів обробляються функцією wp_unslash() , тому потрібно бути акуратним, коли значення передаються дані зі зворотним слеш ( ), наприклад JSON рядок.

Не розміщуйте екрановані значення!

Поганий (неправильний) приклад:

Припустимо, нам потрібно розмістити в значенні довільного поля такий JSON рядок: {"key":"value with "escaped quotes""}:

$escaped_json = '{"key":"value with "escaped quotes""}';
update_post_meta( $id, 'escaped_json', $escaped_json );
$broken = get_post_meta ($ id, 'escaped_json', true);

/*
Параметр $broken після обробки stripslashes(), перетворитися на неробочий рядок:
{"key":"value with "escaped quotes""}
*/

Правильний приклад:

Додавши ще один рівень екранування ( ), за допомогою функції wp_slash() (з версії 3.6) можна компенсувати обробку wp_unslash() :

$escaped_json = '{"key":"value with "escaped quotes""}';
update_post_meta( $id, 'double_escaped_json', wp_slash($escaped_json) );
$fixed = get_post_meta( $id, 'double_escaped_json', true );
/*
Параметр $fixed після обробки stripslashes() залишиться правильним:
{"key":"value with "escaped quotes""}
*/

Працює на основі:
get_metadata_raw() ,
add_metadata() ,
wp_cache_delete()

Повертає

int|true|false.

  • true – при успішному оновленні.
  • false – при невдачі або коли для оновлення було передано значення, яке вже є в бд.
  • ID первинного поля таблиці метаполів (umeta_id), коли створено нове поле.

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

update_metadata( $meta_type, $object_id, $meta_key, $meta_value, $prev_value );
$meta_type
(рядок) (обов’язковий)
Тип об’єкта метаданих якого оновлюємо. Наприклад: comment, post, or user
$object_id
(число) (обов’язковий)
ID об’єкта метадані якого оновлюємо. Наприклад, для посту, це буде ID посту.
$meta_key
(рядок) (обов’язковий)
Ключ (назва) метаданих.
$meta_value
(рядок/число/масив/об’єкт) (обов’язковий)

Нове значення, яке потрібно змінити/додати.

Якщо вказати значення, яке вже записано в метаполі (таке саме), то функція не робитиме зайвих запитів щодо оновлення старого значення, а просто перерве роботу.

У значенні можна зберігати масиви та об’єкти, вони зберігатимуться у вигляді серіалізованого рядка.

$prev_value
(рядок/число/масив/об’єкт)
Попереднє значення. Якщо вказати, оновить лише дані, що збігаються в цьому значенням, а не всі метаданих із вказаним у
$meta_key ключем.


За замовчуванням: ”

Приклади

0

#1 Базовий приклад, що показує як оновити метадані біля посту.

Точний аналог роботи функції update_post_meta() . Обновимо метадані з ключем key_1, у посту 76 – змінимо значення “сумний” на “веселий”:

update_metadata( 'post', 76, 'key_1', 'веселий', 'сумний');
0

#2 Ще приклади

Дивіться у функціях-обгортках:

нотатки

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

список змін

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

Код update_metadata() WP 6.0.2

function update_metadata( $meta_type, $object_id, $meta_key, $meta_value, $prev_value = '' ) {
	Global $wpdb;

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

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

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

	$meta_subtype = get_object_subtype( $meta_type, $object_id );

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

	// expected_slashed ($meta_key)
	$raw_meta_key = $meta_key;
	$meta_key = wp_unslash( $meta_key );
	$passed_value = $meta_value;
	$meta_value = wp_unslash( $meta_value );
	$meta_value = sanitize_meta( $meta_key, $meta_value, $meta_type, $meta_subtype );

	/**
	 * Short-circuits updating 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:
	 *
	 * - `update_post_metadata`
	 * - `update_comment_metadata`
	 * - `update_term_metadata`
	 * - `update_user_metadata`
	 *
	 * @ Since 3.1.0
	 *
	 * @param null|bool $check Whether to allow updating metadata for 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 mixed $prev_value Optional. Previous value to check before updating.
	 * Якщо визначено, тільки update existing metadata entries with
	 * this value. Іншіwise, update all entries.
	 */
	$check = apply_filters( "update_{$meta_type}_metadata", null, $object_id, $meta_key, $meta_value, $prev_value );
	if ( null !== $check ) {
		return (bool) $check;
	}

	// Compare existing value to new value if no prev value given and the key exists only once.
	if ( empty( $prev_value ) ) {
		$old_value = get_metadata_raw( $meta_type, $object_id, $meta_key );
		if ( is_countable( $old_value ) && count( $old_value ) === 1 ) {
			if ( $old_value[0] === $meta_value ) {
				return false;
			}
		}
	}

	$meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT $id_column FROM $table WHERE meta_key = %s AND $column = %d", $meta_key, $object_id ) );
	if ( empty( $meta_ids ) ) {
		return add_metadata( $meta_type, $object_id, $raw_meta_key, $passed_value );
	}

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

	$ data = compact ( 'meta_value');
	$where = array(
		$column => $object_id,
		'meta_key' => $meta_key,
	);

	if ( ! empty( $prev_value ) ) {
		$prev_value = maybe_serialize( $prev_value );
		$where['meta_value'] = $prev_value;
	}

	foreach ( $meta_ids as $meta_id ) {
		/**
		 * Fires immediately before updating 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:
		 *
		 * - `update_post_meta`
		 * - `update_comment_meta`
		 * - `update_term_meta`
		 * - `update_user_meta`
		 *
		 * @ Since 2.9.0
		 *
		 * @param int $meta_id ID для metadata введення до оновлення.
		 * @param int $object_id ID object metadata is for.
		 * @param string $meta_key Metadata key.
		 * @param mixed $_meta_value Metadata value.
		 */
		do_action( "update_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $_meta_value );

		if ( 'post' === $meta_type ) {
			/**
			 * Fires immediately before updating a post's metadata.
			 *
			 * @ Since 2.9.0
			 *
			 * @param int $meta_id ID metadata введення до оновлення.
			 * @param int $object_id Post ID.
			 * @param string $meta_key Metadata key.
			 * @param mixed $meta_value Metadata value. Це буде бути PHP-серіалізована string representation of the value
			 * якщо значення is array, object, або itself a PHP-serialized string.
			 */
			do_action( 'update_postmeta', $meta_id, $object_id, $meta_key, $meta_value);
		}
	}

	$result = $wpdb->update( $table, $data, $where );
	if ( ! $result ) {
		return false;
	}

	wp_cache_delete( $object_id, $meta_type . '_meta' );

	foreach ( $meta_ids as $meta_id ) {
		/**
		 * Fires immediately after updating 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:
		 *
		 * - `updated_post_meta`
		 * - `updated_comment_meta`
		 * - `updated_term_meta`
		 * - `updated_user_meta`
		 *
		 * @ Since 2.9.0
		 *
		 * @param int $meta_id ID updated metadata entry.
		 * @param int $object_id ID object metadata is for.
		 * @param string $meta_key Metadata key.
		 * @param mixed $_meta_value Metadata value.
		 */
		do_action( "updated_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $_meta_value );

		if ( 'post' === $meta_type ) {
			/**
			 * Fires immediately after updating a post's metadata.
			 *
			 * @ Since 2.9.0
			 *
			 * @param int $meta_id ID updated metadata entry.
			 * @param int $object_id Post ID.
			 * @param string $meta_key Metadata key.
			 * @param mixed $meta_value Metadata value. Це буде бути PHP-серіалізована string representation of the value
			 * якщо значення is array, object, або itself a PHP-serialized string.
			 */
			do_action( 'updated_postmeta', $meta_id, $object_id, $meta_key, $meta_value );
		}
	}

	return true;
}

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

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