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

add_post_meta() WP 1.5.0

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

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

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

Работает на основе: 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:

<?php add_post_meta(68, 'my_key', 47); ?>

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

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

<?php add_post_meta(7, 'fruit', 'banana', true) or update_post_meta(7, 'fruit', 'banana'); ?>

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

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

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

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

<?php add_post_meta(68, 'my_key', '47', true); ?>

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

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

<?php add_post_meta(68, 'my_key', '47'); ?>
<?php add_post_meta(68, 'my_key', '682'); ?>
<?php 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 и это поле не будет выводится в админке на странице редактирования постов/постоянных страниц.

Код add post meta: wp-includes/post.php VER 4.9.1

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

	$added = add_metadata( 'post', $post_id, $meta_key, $meta_value, $unique );
	if ( $added ) {
		wp_cache_set( 'last_changed', microtime(), 'posts' );
	}
	return $added;
}

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

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

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

add_post_meta 22 комментария
Полезные 1 Вопросы 1 Все
  • Андрей

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

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

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

    Ответить3.4 года назад #
    • Kama4716

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

      Ответить3.4 года назад #
      • Юрий cайт: allworldcar.ru @

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

        Ответить3.4 года назад #
        • Kama4716

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

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

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

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

          Ответить3.4 года назад #
        • Хоть и поздно, но отвечу. Часто вижу подобный вопрос на форумах и тематических ресурсах, может кому в последующем пригодится, кто попадет на эту же страницу.
          Произвольные поля, которые использует плагин 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
          Ответить1.2 года назад #
  • Beer cайт: beer.ru

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

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

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

    $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">

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

    Ответить2.4 года назад #
    • campusboy1952 cайт: www.youtube.com/c/wpplus

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

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

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

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

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

        Ответить2.4 года назад #
        • campusboy1952 cайт: www.youtube.com/c/wpplus

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

          Ответить2.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"

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

            Ответить2.4 года назад #
            • campusboy1952 cайт: 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
              Ответить2.4 года назад #
              • Егор @

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

                Ответить2.4 года назад #
                • campusboy1952 cайт: www.youtube.com/c/wpplus

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

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

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

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

    а можно ли вывести произвольные поля в настройки темы к примеру, а не прикреплять к посту ?

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

    • Kama4716

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

      1

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

Ваш комментарий
Предпросмотр