WordPress как на ладони
Плагин рекламы для WordPress wordpress jino

update_user_meta() WP 3.0

Обновляет мета поле указанного пользователя.

Кроме обновления существующего поля, также создаст поле, если поля с таким ключом еще не существует.

Функцию можно использовать вместо add_user_meta(). При создании поля вызывает add_user_meta() с параметром $unique = true. Это означает, что add_user_meta() удобно использовать только в случаях, когда нужно создать несколько полей с одинаковыми ключами, во остальных случаях удобнее использовать эту функцию.

Используйте параметр $prev_value, когда нужно определить какое именно поле, из нескольких с одинаковыми ключами, нужно обновить.

Функция не удаляет поле, если передано пустое значение параметра $meta_value.

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

Хуков нет.

Возвращает

Логическое: true, при успешном обновлении и false при неудаче.

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

update_user_meta( $user_id, $meta_key, $meta_value, $prev_value )
$user_id(число) (обязательный)
ID пользователя.
$meta_key(строка) (обязательный)
Ключ поля - поле meta_key в таблице wp_usermeta, для которого значение meta_value должно быть обновлено.
$meta_value(строка/массив/число/объект/логический) (обязательный)

Новое значение поля. Значение должно отличаться от предыдущего. Объекты и массивы будут автоматически сериализованы (serialized).

Если указать значение, которое уже записано метаполе (такое же), то функция не будет делать лишних запросов по обновлению старого значения на такое же новое...

$prev_value(строка/массив/число/объект/логический)
Старое значение. Нужно указывать когда у пользователя может быть несколько полей с одинаковыми ключами и нам нужно обновить определенное из них.
По умолчанию: ''

Примеры

#1 Базовый пример

Предположим у пользователя с ID 1 должно быть мета поле mood. Давайте обновим его значение или создадим поле, если его не существует.

update_user_meta( 1, 'mood', 'good' )

#2 Обновим сайт пользователя

В мета полях пользователя хранятся привычные нам данные: Ник, Имя, Фамилия, Сайт и т.д. Пример ниже показывает, как обновить сайт пользователя с ID 1:

$user_id = 1;
$website = 'http://wordpress.org';
update_user_meta($user_id, 'user_url', $website);

#2 Проверка на ошибку

Этот пример показывает как проверить обновилось ли поле:

$user_id = 1;
$new_value = 'good';

// Вернет false, если предыдущее значение совпадает с $new_value.
if( ! update_user_meta( $user_id, 'some_meta_key', $new_value ) ){
	echo "Поле не обновлено";
}

// Получим значение поля и проверим его с новым значением $new_value
if ( get_user_meta($user_id,  'some_meta_key', true ) != $new_value )
	wp_die('Ошибка: новое значение не записалось.');

Код update user meta: wp-includes/user.php WP 4.8

<?php
function update_user_meta($user_id, $meta_key, $meta_value, $prev_value = '') {
	return update_metadata('user', $user_id, $meta_key, $meta_value, $prev_value);
}

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

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

Еще из раздела: Метаданные (usermeta)

update_user_meta 15 комментариев
Полезные 1 Все
  • Андрей cайт: ypfirm.ru

    Как обновить много полей? Неужели каждый раз придётся обращаться к базе через эту функцию?

    Ответить1.2 года назад #
    • Kama4396

      Ну можно одним запросом SQL. А через среду ВП если, то да каждое поле надо обновить отдельно...

      Ответить1.2 года назад #
    • Egor

      Обновить одной функцией действительно нельзя, можно лишь сделать эту операцию более удобной.

      <?php
      $user_id = 1234;
      
      $metas = array( 
      	'nickname'   => $userFirstName,
      	'first_name' => $userFirstName, 
      	'last_name'  => $userLastName ,
      	'city'       => $userCityID ,
      	'gender'     => $userGenderID
      );
      
      foreach($metas as $key => $value) {
      	update_user_meta( $user_id, $key, $value );
      }

      Тут еще пример, как сделать это прямым запросом - http://stackoverflow.com/questions/30610780/how-to-update-user-meta-for-multiple-meta-key-in-wordpress

      Ответить4 месяца назад #
      1
  • Otshelnik-Fm174 cайт: across-ocean.otshelnik-fm.ru

    Тимур подскажи - посмотрел исходник update_metadata - но не понял.
    Если в update_user_meta передавать ключ и значение которое уже там в бд есть - будет обновляться или false вызовет и не запустит работу mysql по обновлению ячейки?

    У меня в коде может передаваться значение которое присутствует уже в данном метаполе.
    Пример: update_user_meta($user_id, 'mbd_type', $type);
    а в $type будет например android.

    По ресурсам скрипта - получается я в холостую буду гонять функцию update_user_meta (так как в бд уже записано значение android) и она будет обновлять значение которое не изменилось (ненужные операции для бд). Надо ли мне делать проверку - если есть это значение - то не выполнять апдейт, если в этом юзермета оно другое - то тогда и обновлять. Или шило на мыло получается?

    1
    • Otshelnik-Fm174 cайт: across-ocean.otshelnik-fm.ru

      Отвечу - себе не внимательному - если значение одинаковое и уже присутствует в значении этого ключа - то выполнение оборвется:

      // 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($meta_type, $object_id, $meta_key);
      		if ( count($old_value) == 1 ) {
      			if ( $old_value[0] === $meta_value )
      				return false;
      		}
      	}

      Поэтому никаких лишних проверок не надо - вордпресс обо все позаботился.
      Извините за беспокойство и с наступающим новым годом!

      1
  • Сергей
    @

    Создаю поля в профиле пользователей Через хуки

        add_action( 'show_user_profile', 'add_custom_user_photo_fields' );
    	add_action( 'edit_user_profile', 'add_custom_user_photo_fields' );
    	add_action( 'personal_options_update', 'save_custom_user_photo_fields' );
    	add_action( 'edit_user_profile_update', 'save_custom_user_photo_fields' );

    а затем их сохраняю функцией update_user_meta.

    Вопрос в том, что текстовые переменные вида __( 'var', 'textdomain' ) не срабатывают и в профиле пользователя выводятся без перевода.

    В чем проблема у меня?

    Ответить2 месяца назад #
    • Сергей
      @

      Мой вопрос еще не решился, если можете, подскажите плз.

      Ответить2 месяца назад #
      • Kama4396

        Непонятно... как связан перевод и сохранение полей? unknw

        Ответить2 месяца назад #
        • Сергей
          @

          Я не стал выкладывать весь лист кода, но к примеру в функции:
          function dm_add_custom_user_photo_fields( $user )
          есть такой кусок кода:

          <td>
          	<input
          		type="text"
          		class="regular-text"
          		name="dm-user-shop-title"
          		id="dm-user-shop-title"
          		value="<?= esc_attr( get_the_author_meta( 'dm-user-shop-title', $user->ID ) ) ?>"
          		placeholder="<?php _e( 'Your Shop Title', 'decor-market' ); ?>"
          	>
          	<br>
          	<span class="description">
          		<?php _e( 'Input title for shop', 'decor-market' ); ?>
          	</span>
          </td>

          Так вот текстовые переменные выводятся как есть - без перевода, хотя перевод существует и отлично отрабатывает в других местах плагина

          Ответить2 месяца назад #
          • Kama4396

            Все равно не понятно...

            Ответить2 месяца назад #
            • Сергей
              @

              А что не понятно?
              В своем шаблоне, в админке сайта, в профиле пользователя добавляются поля. Описания к ним заданы через текстовые переменные, но выводятся без перевода

              Ответить2 месяца назад #
              • Сергей
                @

                Может я не корректно написал - не текстовые переменные php, а текстовые переменные WP вида __( 'Var', 'textdomain' )

                Ответить2 месяца назад #
              • Kama4396
                <?php _e( 'Your Shop Title', 'decor-market' ); ?>

                Это не работает что ли? Так а файл под домен 'decor-market' подключен вообще и перевод строки 'Your Shop Title' в этом файле есть? Одного из двух нет, поэтому строка и не переводится скорее всего...

                Зачем начинать вопрос с того чтобы создаешь поля в профиле. Когда как выясняется задача в том что не переводится строка.

                Короче, читай про то как переводить строки в WordPress, см фукнции:

                и то как создавать файл перевода, с помощью плагинов или программы poedit.

                Ответить2 месяца назад #
                • Сергей
                  @

                  Когда я обращался с таким вопросом, я не пытался выяснить у вас элементарные вещи такие как создание текстового домена.
                  У меня во всем шаблоне текстовые переменные переведены с помощью poedit и отображаются правильно (с переводом), не переводятся только те, которые выводятся в профиле пользователя. Именно поэтому я и задаю вопрос вам, как специалисту.

                  Ответить2 месяца назад #
                  • Kama4396

                    Если перевод есть, то проблема может быть только одна. Ты пытаешься вывести перевод до того как он подключен... Посмотри на порядок подключения ...

                    Ответить2 месяца назад #

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

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