WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

update_post_meta() WP 1.5.0

Обновляет указанное произвольное поле (метаполе) указанной записи (поста) или добавляет новое.

Функция может быть использована вместо add_post_meta(), т.к. сначала проверяется существование произвольного поля у указанного поста, если поле не найдено, то управление полностью передается функции add_post_meta().

Если в значение $meta_value передать массив, то он автоматически будет записан в виде сериализованной строки, т.е. нет необходимости обрабатывать массив функцией serialize() перед передачей его в значение $meta_value.

ВАЖНО! Функция ожидает экранированную строку в параметрах $meta_key и $meta_value. Т.е. перед записью в базу данных значение произвольных полей обрабатываются функцией wp_unslash(). Подробнее смотрите: «Экранирование в значениях произвольных полей».

Работает на основе: update_metadata()
✈ 1 раз = 0.001327с = очень медленно | 50000 раз = 42.23с = очень медленно | PHP 7.0.8, WP 4.6.1

Хуков нет.

Возвращает

Число/true/false.

  • true - при успешном обновлении.
  • false - при неудаче. Или когда было передано такое же значение поля (как в бд).
  • ID первичного поля таблицы метаполей (meta_id), когда было создано новое поле.

Использование

update_post_meta( $post_id, $meta_key, $meta_value, $prev_value );
$post_id(число) (обязательный)
ID поста, произвольное поле которого нужно обновить/создать.
$meta_key(строка) (обязательный)
Ключ произвольного поля, которое нужно обновить/создать.
$meta_value(строка/массив) (обязательный)
Новое, значение произвольного поля, которое нужно обновить/создать. Если передать массив, то значение будет серриализованно в строку.
$prev_value(строка/массив)
Значение произвольного поля, которое мы хотим изменить. Нужно для тех случаев, когда у поста имеются несколько произвольных полей с одинаковыми ключами. Если не указать этот параметр и у поста имеются несколько полей с одинаковыми ключами, то все поля будут обновлены.
По умолчанию: нет

Примеры

#1 Обновим произвольное поле my_key, у поста 76

Заменим имеющееся там значение на Steve:

update_post_meta(76, 'my_key', 'Steve');

#2 Примеры операций над полями

Предположим, что у поста 76 есть 4 следующих произвольных поля, со значениями:

key_1 = Happy
key_1 = Sad
key_2 = Gregory
my_key = Steve

Изменим значение поля key_2 на Hans:

update_post_meta( 76, 'key_2', 'Hans' );

Изменим значение поля key_1 с Sad на Happy:

update_post_meta( 76, 'key_1', 'Happy', 'Sad' );

Теперь, у нас такие поля:

key_1 = Happy
key_1 = Happy
key_2 = Hans
my_key = Steve

Изменим значение первого поля key_1 с Happy на Excited:

update_post_meta( 76, 'key_1', 'Excited', 'Happy' );

// Или
update_post_meta( 76, 'key_1', 'Excited' );

// Такое использование, обновит только первое поле (всего одно)!
// Чтобы обновить все поля с ключом "key_1" на Excited, нужно применить функцию к каждому полю, например через цикл:

$key1_values = get_post_custom_values( 'key_1', 76 );
foreach ( $key1_values as $value )
	update_post_meta( 76, 'key_1', 'Excited', $value );

#3 Изменим файл шаблона постоянной страницы.

Файл шаблона для постоянной страницы записывается в системное произвольное поле _wp_page_template:

update_post_meta( $id, '_wp_page_template', 'new_template.php' );

#4 Еще примеры

Смотрите здесь

Код update post meta: wp-includes/post.php WP 5.2.1

<?php
function update_post_meta( $post_id, $meta_key, $meta_value, $prev_value = '' ) {
	// Make sure meta is added to the post, not a revision.
	$the_post = wp_is_post_revision( $post_id );
	if ( $the_post ) {
		$post_id = $the_post;
	}

	return update_metadata( 'post', $post_id, $meta_key, $meta_value, $prev_value );
}

Cвязанные функции

Из метки: update

Еще из метки: metadata (метаданные)

13 комментов
Полезные 1 Все
  • Игорь cайт: nnlog.net

    Забыли упомянуть о том, что если для "meta_value" указано такое же значение, как и то что уже имеется в базе, то функция тоже вернет "false".

    Ответить5.4 лет назад #
    • Kama7453

      Спасибо, дополнил статью и не только вашей заметкой: добавил еще раздел "Экранирование в значениях произвольных полей".

      1
      Ответить5.4 лет назад #
      • campusboy3315 cайт: www.youtube.com/c/wpplus

        Тимур, насчет экранирования. Если на фротэнде пользователи добавляют инфу, к примеру в поля всякий текст и цифры (рецепты пирогов, биографию, открытку) нужно ли применять какие то специальные функции или же update_post_meta() сама заботиться о защите от инъекция и другой пакости? Могу ли я сразу $_POST['title'] как в wp_insert_post вставлять и ни о чем не волноваться?
        P.S.: Прошу прощения за беспокойство, ты давал уже ответ на этот вопрос ниже.

        1
        Ответить3.8 года назад #
  • Валерий

    Классный сайт, спасибо!

    2
    Ответить5.3 лет назад #
  • Саныч

    Может подскажете как можно присваивать значения циклическим полям

    1
    Ответить4.6 года назад #
    • Kama7453

      Вас четвертый параметр интересует?

      $prev_value (строка)
      Значение произвольного поля, которое мы хотим изменить. Нужно для тех случаев, когда у поста имеются несколько произвольных полей с одинаковыми ключами. Если не указать этот параметр и у поста имеются несколько полей с одинаковыми ключами, то все поля будут обновлены.

      Ответить4.6 года назад #
  • Денис

    Здравствуйте. А как с безопасностью у этой функции, она проверяет и очищает все поля данных как это делает wp_insert_post() ?

    Ответить4 года назад #
    • Kama7453

      Да, очищает. В WordPress все базовые функции проверяют и очищают...

      1
      Ответить4 года назад #
  • Виктор

    Подскажите как можно обновить информацию в произвольных полях с exel файла. Например, есть небольшой WP сайт по продаже деревянных домов, без WooCommerce, у каждого дома есть цена, значение которой записано в произвольное поле. Как можно обновить эту цену из файла?

    Ответитьгод назад #
    • newbie33 cайт: yumchief.com

      На мой взгляд, если сайт небольшой, проще руками поменять цены - быстрее и дешевле.

      Ответитьгод назад #
    • Илья

      Цены должны быть привязаны к постам каким-нибудь образом в excel файле, например по ID и задача станет тривиальной.

      Ответить10 мес назад #
  • @ Otshelnik-Fm202 cайт: otshelnik-fm.ru

    Привет Тимур. Дополни вот этот пункт: Возвращает true/false.

    Там на самом деле возвращает аналогично update_user_meta:
    в случае изменения (обновления) - true, а в случае добавления нового ID

    $result = update_post_meta( $post_id, 'key', $name );
    if ( is_int( $result ) ) {
    	// add new value
    }
    else {
    	// change
    }
    Ответитьмесяц назад #
Здравствуйте, !     Войти . Зарегистрироваться