WordPress как на ладони
wordpress jino

update_post_meta() WP 1.5.0

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

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

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

Функция ожидает экранированную строку. Т.е. перед записью в базу данных значение произвольных полей обрабатываются функцией stripslashes(). Подробнее см.ниже: Экранирование в значениях произвольных полей.

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

Хуков нет.

Возвращает

true в случае успешной операции или false, если произошла ошибка. 
Возвращает true, только если удалось обновить поле, т.е. функция вернет false, если в $meta_value указано старое значение.

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

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' );

Еще примеры можно посмотреть <a href="/function/get_post_meta#usage">здесь</a>.

Экранирование в значениях произвольных полей

Перед записью в базу данных значение произвольных полей обрабатываются функцией stripslashes(), поэтому нужно быть аккуратным, когда в значениях передаются данные с обратным слэш (\), например 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), вы можете компенсировать обработку stripslashes():

$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\""}
*/

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

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

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

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

Из метки: update

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

Еще из раздела: Произвольные поля (postmeta)

update_post_meta 9 комментариев
  • Игорь cайт: nnlog.net

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

    Ответить3.7 года назад #
    • Kama4486

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

      1
      Ответить3.7 года назад #
      • campusboy1833 cайт: wp-plus.ru

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

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

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

    2
    Ответить3.6 года назад #
  • Саныч

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

    Ответить3 года назад #
    • Kama4486

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

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

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

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

    Ответить2.4 года назад #
    • Kama4486

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

      1
      Ответить2.4 года назад #
  • Дмитрий

    А если стоит задача обновить за раз более 2000 полей, создаст ли это большую нагрузку на сервер?

    1

Здравствуйте, !

Ваш комментарий