WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Купить персональные IPV4 и IPV6 прокси

add_post_meta() WP 1.5.0

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

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

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

ВАЖНО! Функция проверяет не является ли указанная запись (ID поста) ревизией. Если указана ревизия, то ID меняется на ID родительской записи. Т.е. метаданные в любом случае будут обновляться у родительской записи (не у ревизии).

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

Работает на основе: add_metadata()

Хуков нет.

Возвращает

true/false.

  • true - операция по добавлению поля прошла удачно
  • false - поле добавить не удалось

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

add_post_meta( $post_id, $meta_key, $meta_value, $unique );
$post_id(число) (обязательный)
ID поста, произвольное поле к которому нужно добавить.
$meta_key(строка) (обязательный)
Название (ключ) произвольного поля.
$meta_value(строка) (обязательный)
Значение произвольного поля.
$unique(логический)

true - уникальный (только один), false - не уникальный - полей с одним ключом может быть много.

Если поставить параметр в true, то при добавлении поля, сначала будет проверяться существует ли уже поле с таким же ключом, если существует, то поле не будет добавлено.
По умолчанию: false

Примеры

#1. Базовое использование

Добавим произвольное поле "my_key" со значением 47, к посту 68:

add_post_meta( 68, 'my_key', 47 );

#2. Добавление или обновление уникального произвольного поля

Добавим произвольное поле, если такое поле еще не существует или обновим существующее. Важно понимать, что если четвертый параметр add_post_meta стоит в true, то поле не будет обновлено, если оно уже существует (пример ниже).

add_post_meta( 7, 'fruit', 'banana', true ) or update_post_meta( 7, 'fruit', 'banana' );

для этого нужно использовать такой вариант:

if ( !update_post_meta(...) ) add_post_meta(...) )

#3. Добавим поля только если его еще нет

Если мы хотим быть уверены, что поля с ключом "my_key" не существует, перед тем как добавлять его:

add_post_meta( 68, 'my_key', 47, true );

#4. Несколько полей с одинаковыми ключами

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

add_post_meta( 68, 'my_key', 47 );
add_post_meta( 68, 'my_key', 682 );
add_post_meta( 68, 'my_key', 'The quick, brown fox jumped over the lazy dog.');
...

Еще примеры можете посмотреть здесь.

Создание системных (спрятанных) произвольных полей

Если вы разработчик и вам нужно создать произвольное поле, которое не будет видно пользователям, но при этом будет работать как обычное произвольное поле, то знайте что WordPress не показывает произвольные поля начинающиеся с "_" (нижнего подчеркивания). Не показывает значит, что они игнорируются на странице редактирования постов или при использовании функции шаблона the_meta().

Поэтому, если нужно вдруг нужно спрятать произвольное поле, то нужно создавать поле с ключом начинающимся с "_", например:

<?php add_post_meta(68, '_color', 'red', true); ?>

добавит уникальное произвольное поле _color со значением red и это поле не будет выводится в админке на странице редактирования постов/постоянных страниц.

Список изменений

С версии 1.5.0 Введена.

Код add post meta: wp-includes/post.php WP 5.2.2

<?php
function add_post_meta( $post_id, $meta_key, $meta_value, $unique = false ) {
	// 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 add_metadata( 'post', $post_id, $meta_key, $meta_value, $unique );
}

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

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

20 комментов
Полезные 1 Все
  • Андрей

    Хорошая статья, Меня мучает вопрос, у меня есть статьи с произвольными полями с ключом "автор" но как оказалось авторов может быть много, все бы ничего, да я вывожу названия статей на странице авторов, и когда в поле вбито автор1, автор2 то на странице автор1 статья не выводится(
    Возможно подскажешь решение?)
    В независимости от ответа спасибо)

    Ответить7.2 лет назад #
  • @ Юрий allworldcar.ru

    Подскажите, а как можно вывести описание description из плагина all i seo в текст статьи? Как это можно реализовать?

    Ответить5 лет назад #
    • Kama7538

      Эти данные записываются в произвольные поля. Посмотрите как называется поле и с помощью функции get_post_meta( $post->ID, 'название_поля', 1 ); выведете описание в текст статьи.

      Ответить5 лет назад #
      • @ Юрий allworldcar.ru

        Я не силён в php, а где посмотреть название этого поля? И как вставлять этот код в последующем, его надо будет оборачивать в ? Заранее спасибо

        Ответить5 лет назад #
        • Kama7538

          В админ-панели при редактировании поста, есть блок произвольных полей, там попробуйте добавить поле и в выборе найдите то которое подходит, будет чтото с description в названии, по логике.

          Как определитесь с названием, вставляйте значение в текст поста с помощью такой конструкции.

          <?php get_post_meta( $post->ID, 'название_поля', 1 ); ?>

          Вставлять нужно в файл шаблона.

          Ответить5 лет назад #
        • Хоть и поздно, но отвечу. Часто вижу подобный вопрос на форумах и тематических ресурсах, может кому в последующем пригодится, кто попадет на эту же страницу.
          Произвольные поля, которые использует плагин All in One SEO Pack на WordPress:
          _aioseop_title : For the Post Title
          _aioseop_description : For the post description
          _aioseop_keywords : For the post keywords

          1
          Ответить2.9 года назад #
  • Beer beer.ru

    А как проверить существует ли поле с определенным ключом, если есть то ничего не делать, а если нет то добавить значение?

    Ответить4.9 года назад #
    • Kama7538
      if( ! get_post_meta( $post->ID, 'meta_name', 1 ) ){
      	add_post_meta( $post->ID, 'meta_name', 'meta_val' );
      }
      Ответить4.9 года назад #
  • @ Егор

    Добрый вечер. Есть:

    $ingredients = $_POST['ingredients'];
    
    $post_id = wp_insert_post( $my_post );
    
    $i=0;
    	while($i<=count($ingredients)-1) {
    
    			add_post_meta( $post_id, 'ingredients', $ingredients[$i] );
    			$i++;
    		}
    
    <input name="ingredients[]" placeholder="Ингредиент 1">
    
    <input name="ingredients[]" placeholder="Ингредиент 2">
    
    <input name="ingredients[]" placeholder="Ингредиент 3">
    
    <input name="ingredients[]" placeholder="Ингредиент 4">

    Это форма добавления записи без админки. Если инпуты не заполнены, то в админке эти поля с пустыми значениями.
    Как проверять их на пустоту и если они пустые не добавлять, а добавлять только заполненные?

    Ответить4 года назад #
    • campusboy3412 www.youtube.com/c/wpplus

      Добрый вечер. Нужно просто проверять, есть ли значения в ячейке. Измените на такую сроку:

      if ( !empty($ingredients[$i]) ) {
      	add_post_meta( $post_id, 'ingredients', $ingredients[$i] );
      }
      $i++;
      1
      Ответить4 года назад #
    • campusboy3412 www.youtube.com/c/wpplus

      Сначала написал isset, но забыл, она же не проверяет на пустоту, а именно она "прилетает" от незаполненных полей, потому изменил на !empty.

      Ответить4 года назад #
      • @ Егор

        Да, спасибо. Видимо это единственный вариант, который я не проверил) плохо когда особо не понимаешь))

        Ответить4 года назад #
        • campusboy3412 www.youtube.com/c/wpplus

          Учите PHP! Хотя бы основы, это не займёт много времени и сил, зато сразу жить станет проще smile

          Ответить4 года назад #
          • @ Егор

            Ну с основами я знаком) Вроде до этого шага дошел сам)

            И снова возник вопрос, я добавляю миниатюру к загружаемому посту. Приведу снова куски кода, думаю Вы поймете)

            $attach_id_img = $_FILES['img'];
            
            $post_id = wp_insert_post( $my_post ); // id поста
            
            	if ($_FILES['img']) {
            		$attach_id_img = media_handle_upload( 'img', $post_id );
            		update_post_meta($post_id,'_thumbnail_id',$attach_id_img);
            		//add_post_meta()
            	}
            
            <input type="file" name="img" accept="image/*,image/jpeg" required=""/>

            Все отрабатывает, но мне нужно чтобы данное изображение также записалось в произвольное поле, точнее записался путь изображения. То есть у меня есть поле resultPhoto, которое должно принимать вид: src="http://site.ru/wp-content/uploads/2015/06/govyadina.jpg"

            Это можно как-то реализовать?

            Ответить4 года назад #
            • campusboy3412 www.youtube.com/c/wpplus

              Добавить скорее всего:

              if ($_FILES['img']) {
              		$attach_id_img = media_handle_upload( 'img', $post_id );
              		update_post_meta($post_id,'_thumbnail_id',$attach_id_img);
              		$image_url = wp_get_attachment_url( $attach_id_img );
              		update_post_meta($post_id,'resultPhoto',$image_url);
              }

              Будьте бдительны, ведь тут у Вас нет нигде проверки на удачность загрузки картинки функцией media_handle_upload.

              2
              Ответить4 года назад #
              • @ Егор

                Спасибо за помощь, большое. По загрузке надо погуглить. Пока просто готовлю форму для корректной работы.

                Ответить4 года назад #
                • campusboy3412 www.youtube.com/c/wpplus

                  Пожалуйста smile А зачем гуглить, когда на сайте все эти функции описаны, в то числе и что возвращают в случае успеха или провала? Хотя решать Вам!

                  Ответить4 года назад #
                  • @ Егор

                    Ну я к тому, что просто так мне не сеть и не сделать с памяти или головы) Нужно сначала почитать

                    Ответить4 года назад #
  • Какую функцию лучше использовать для добавления метаполей? Функция update_post_meta работает дольше, чем add_post_meta?

    Ответить2.2 года назад #
    • Kama7538

      Одинаково они обе работают... Чаще удобнее update_post_meta(). Но если нужны мульти-метаполя, то без add_post_meta() не обойтись...

      1
      Ответить2.2 года назад #
Здравствуйте, !     Войти . Зарегистрироваться