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

get_post_meta() WP 1.5.0

Возвращает значение указанного произвольного поля записи (поста). Можно получить массив всех полей записи (поста).

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

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

Работает на основе: get_metadata()
✈ 1 раз = 0.00013с = быстро | 50000 раз = 1.0с = очень быстро

Хуков нет.

Возвращает

Строку/массив.

  • Вернет false, если неправильно переданы $meta_type или $object_id.

  • При $single = true

    • если метаполе есть - вернет значение в виде строки/массива.
    • если метаполя нет - вернет пустую строку ''.
  • При $single = false
    • если метаполе есть - вернет массив значений метаполя.
    • если метаполя нет - вернет пустой массив array().

Если в значении метаполя храниться число оно будет возвращено в виде строки, например, "54"...

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

$meta_values = get_post_meta( $post_id, $key, $single );
$post_id(число) (обязательный)
ID поста, произвольные поля которого нужно получить.
По умолчанию: нет
$key(строка) 
Название произвольного поля, значение которого нужно получить. Если оставить поле пустым, будут получены все произвольные поля поста.
По умолчанию: ''
$single(логический)

true - вернет значение метаполя (если полей несколько то вернет значение первого метаполя).
false - вернет массив всех значений мета полей с указанным ключом.

Если в значении произвольного поля находится сериализованный массив, то значение true вернет, нормальный массив, а если указать false, то вернется массив в элементе "[0]" которого будет все тот же сериализованный массив.

По умолчанию: false

Примеры

#1. Получим массив значений произвольных полей

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

$values = get_post_meta( 76, 'key_1' );
/*
Array
(
	[0] => значение 1
	[1] => значение 2
)
*/

#2. Получим только одно произвольное поле

Чтобы получить только первое (или единственное) значение произвольного поля в виде строки, используем такой вызов функции:

$value = get_post_meta( 76, 'key_1', true ); //> значение 1

#3. Объединение всех метаполей в объект

Этот пример показывает как можно удобно объединить все произвольные поля записи.

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

Подразумевается, что ключи произвольных полей не в кириллице и у поля с одним ключом предусмотрено только одно значение - все это обычное явление:

// соберем все метаполя в объект $meta
$meta = new stdClass;
foreach( (array) get_post_meta( $post->ID ) as $k => $v ) $meta->$k = $v[0];

// Теперь, допустим у записи есть метаполе 'book'
// Получаем его так:
echo $meta->book;

#4. Пример использования get_post_meta внутри Цикла WordPress.

Этот код пример того, как использовать функцию для того, чтобы получить значение произвольного поля thumb, в значении которого сохраняется ссылка на картинку-миниатюру, для того чтобы получить эту ссылку и использовать её в шаблоне.

<?php if ( get_post_meta($post->ID, 'thumb', true) ) : ?>
	<a href="<?php the_permalink() ?>" rel="bookmark">
		<img class="thumb" src="<?php echo get_post_meta($post->ID, 'thumb', true) ?>" alt="<?php the_title(); ?>" />
	</a>
<?php endif; ?>

#5. Проверим существование указанного метаполя

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

$metas = get_post_meta( $post->ID );
if( isset($metas['key_name']) ){
	echo 'Мета поле "key_name" существует, не важно какое там значение.';
}

#6. Использования функций произвольных полей на примере авторской функции

/*******************
Эта функция обрабатывает два мета тега (произвольных поля): mood и listening_to.
Она может быть вызвана тремя разными вариантами (действиями): update, delete и get (по умолчанию).
Когда функция работает как update (обновление), оба параметра $mood и $listening_to должны быть указаны.
Пример вызова: mood_music( $post->ID, 'update', 'Happy', 'Bon Jovi - It's My Life' );
*******************/
function mood_music( $post_id, $action="get", $mood = 0, $listening_to = 0 ){

  // Проверка (switch) какое из действий нужно выполнять update, delete или get
	switch ($action) {
		case "update" :
		  if( ! $mood && ! $listening_to )
			//Если не переданы данные для обновления, останавливаемся
			return false;

		  //Использование функции add_post_meta():
		  //add_post_meta( $post_id, $meta_key, $meta_value, $unique = false )

		  //Если передана переменная $mood, создаем произвольное
		  //поле 'mood', со значением этой переменной.
		  //Если такое произвольное поле уже существует,
		  //то эта команда создаст еще одну мета запись
		  if( $mood ) {
			add_post_meta( $post_id, "mood", $mood );
			return true;
			}
		  //Использование функции update_post_meta():
		  //update_post_meta( $post_id, $meta_key, $meta_value )

		  //Если передана переменная $listening_to, создаем произвольное
		  //поле 'listening_to', со значением этой переменной.
		  //Если такое произвольное поле уже существует, то эта команда
		  //обновит его данные на новое значение переданное в переменной $listening_to.
		  if( $listening_to ) {
			add_post_meta( $post_id, "listening_to", $listening_to, true ) or
			  update_post_meta( $post_id, "listening_to", $listening_to );
			return true;
		  }
		case "delete" :
		  //Использование функции delete_post_meta:
		  //delete_post_meta( $post_id, $meta_key, $prev_value = "" )

		  //Удаляем все произвольные поля с ключами mood и listening_to у указанного поста.
		  delete_post_meta( $post_id, "mood" );
		  delete_post_meta( $post_id, "listening_to" );

		  //Если нужно удалить только поле 'mood' со значением "sad", используем такой код:
		  //delete_post_meta( $post_id, 'mood', 'sad' );
		break;
		case "get" :
		  //Использование функции get_post_custom():
		  //get_post_meta( $post_id, $meta_key, $single value = false )

		  //$stored_moods будет массивом содержащим все значения произвольных полей с ключом 'mood'
		  $stored_moods = get_post_meta( $post_id, "mood" );
		  //$stored_listening_to будет значением первого произвольного поля 'listening_to'
		  //(подразумевается, что таких полей несколько)
		  $stored_listening_to = get_post_meta( $post_id, "listening_to", true );

		  //Теперь нам нужно вывести на экран настроение (mood), для этого
		  //мы должны вызвать эту функцию в шаблоне так:
		  //пример: echo mood_music( $post->ID, 'get' );

		  $return = "<div class=\"mood-music\">";
		  if ( ! empty( $stored_moods ) )
			$return .= "<strong>Мое Настроение</strong>: ";
		  foreach( $stored_moods as $mood )
			$return .= $mood . ", ";
		  $return .= "<br/>";

		  if ( ! empty( $stored_listening_to ) ) {
			$return .= "<strong>Сейчас я слушаю</strong>: ";
			$return .= $stored_listening_to;
			}
		  $return .= "</div>";

		  return $return;
		default :
		  return false;
		break;
	} //Конец проверки switch
}

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

<?php
function get_post_meta( $post_id, $key = '', $single = false ) {
	return get_metadata('post', $post_id, $key, $single);
}

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

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

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

get_post_meta 59 комментариев
Полезные 1 Вопросы 3 Все
  • Дмитрий

    Здравствуйте! А есть возможность передать значение произвольного поля в php обработчик формы обратной связи. Там у меня email адреса хранятся и нужно чтобы по клику "Написать сообщение" email подставлялся в обработчик и письмо отправлялось указанному адресату. В каждой записи email в произвольном поле разный. Спасибо!

    Ответить2.1 года назад #
    • Kama4489

      Я думаю это не очень безопасно, лучше передать ID поста и уже в самом обработчике получить email из поля зная ID поста с помощью get_post_meta():

      get_post_meta( $post_id, 'Ключ_где_email', 1 );
      1
      Ответить2.1 года назад #
  • Алёна

    Здравствуйте!
    Спасибо за статью, пол дела сделано.

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

    Пыталась как-то так, но дальше не могу сообразить.

    <?php
    	$key_1_value = get_post_meta(get_the_ID(), 'thumbs_rating_up', true);
    
    	$array = explode(' ', $key_1_value);
    	print_r($array);
    ?>

    В переменной $key_1_value появляется строка "50 50" значение поля из каждого поста через пробел. Хотела разбить строку используя пробел и сложить цифры что бы получилось 100.

    Можете помочь? куда капать smile

    Ответить1.5 года назад #
    • Kama4489
      $key_1_value = get_post_meta(get_the_ID(), 'thumbs_rating_up', true);
      
      $array = explode(' ', $key_1_value );
      $sum = array_sum( $array );
      echo $sum; //> 100
      1
      Ответить1.5 года назад #
      • Алёна

        Спасибо большое за ответ!
        Только из за того, что я не смогла объяснить, то что мне нужно в итоге получила не совсем то)) извиняюсь)

        Мне нужно из всех статей собрать значение полей thumbs_rating_up и все их сплюсовать, таким образом я полу общею оценку всех статей.

        <?php while (have_posts()) : the_post(); ?>
        
        			<?php 
        				$key_1_value = get_post_meta(get_the_ID(), 'thumbs_rating_up', true);
        
        				$array = explode(' ', $key_1_value );
        				$sum = array_sum( $array );
        				echo $sum; //> 100
        			?>
        
        		<?php endwhile; ?>

        Вот так получается только строку получить. Игралась с "$rex = $key_1_value + $key_1_value" весь рейтинг только удваивается. А одна общая цифра не получается.

        Если это не сложная задача, можете ещё раз помочь?

        Ответить1.5 года назад #
        • Kama4489

          Мне нужно из всех статей собрать значение полей thumbs_rating_up
          Из всех вообще или из всех в рубрики, или из всех на странице?

          Ответить1.5 года назад #
          • Алёна

            Да, вообще из всех. Авторы публикуют только в одну единственную рубрику на сайте с ID=2. А результат общей оценки хочу вывести в author.php и в single.php и все))

            Ответить1.5 года назад #
  • avense4 cайт: videovegas.ru

    Не пойму как проверить существование произвольного поля у заданного поста:

    if( get_post_meta(54, 'custom_key_1', true) ) {...}

    Данное условие сработает выдаст false если такого поля нету, но в то же время выдаст и false если такое поле есть, но оно пустое или содержит ноль "0".
    А как модно проверить есть ли такое поле у заданного поста вообще, хоть пустое, хоть какое?

    Ответить1.4 года назад #
    • Kama4489
      $metas = get_post_meta(1);
      if( isset($metas['custom_key_1']) ){
      	echo 'Мета поле существует, не важно какое там значение.';
      }
      1
      Ответить1.4 года назад #
  • Ян cайт: codyshop.ru @

    Делаю как вы говорите:<?php echo get_post_meta($post->ID, 'price', true); ?>, но произвольные поля не выводитsad
    Если так:<?php echo the_meta($post->ID, 'price', true); ?>, то выводит все целиком

    Ответить1.3 года назад #
    • Kama4489

      Первый вариант правильный, там либо $post->ID не тот либо такого метаполя нет у записи... Другого быть не может...

      Ответить1.3 года назад #
  • Ян cайт: codyshop.ru @

    Добрый день. У меня к записи прикреплено порядка 20 произвольных полей. get_post_meta() - это единственный способ вывода данных полей по отдельности? Изучаю, как оптимизировать запросы к бд.

    Ответить1.3 года назад #
    • Kama4489

      Во-первых get_post_meta() не создает запросы, а берет все из кэша. Кэш создается при первом вызове. Дальше все очень быстро работает.

      Во-вторых, можно получить сразу все поля так:

      $all_metas = get_post_meta( $post_id );

      Но там все во вложенных массивах, не очень удобно, поэтмоу удобнее еще обработать. Как? Смотрите пример 3...

      Ответить1.3 года назад #
  • Максим

    Здравствуйте.
    Подскажите, пожалуйста, как решить такую задачу: есть страницы статей, где с помощью произвольного поля author указывается автор, и есть страницы авторов. Как на странице автора вывести список всех его статей на сайте, ориентируясь на то, что title страницы автора равен значению произвольного поля author в статье. Понимаю, что можно на страницу каждого автора с помощью WP_Query добавить проверку по значению ключа, но хочется реализовать это через код в page.php:

    <?php if ( $post->post_parent=="32" ){ ?>
    <hr>
    <h2><center>Публикации на сайте</center></h2>
    <?php } ?>

    Подскажите, какой код нужно вставить в этот блок, чтобы добиться желаемого?
    Заранее спасибо!

    • Максим

      Сам разобрался, может кому поможет в дальнейшем:

      <?php $author = get_the_title();
      $author_children = new WP_Query(array(
      'orderby' => 'date',
      'post_type' => 'page',
      'meta_key' => 'author',
      'meta_value' => $author,
      'posts_per_page' => -1,
      'post_parent' => 411));
      if($author_children->have_posts()) :
      while($author_children->have_posts()): $author_children->the_post(); ?>
      <hr>
      <h2><center>Публикации на сайте</center></h2>
      <p style="text-align:center;"><a href="<?php echo get_permalink($page_id); ?>/#title" title="Перейти к статье"><?php the_title(); ?></a></p>
      <?php endwhile;
      endif; wp_reset_query(); ?>

      Спасибо за прекрасный сайт, много для себя почерпнул.

      • Максим

        только есть один косяк похоже... этот кусок будет выводиться перед каждой публикацией, если их несколько:

        <hr>
        <h2><center>Публикации на сайте</center></h2>

        Насколько понимаю, его надо до while вставить через echo, но пока не получается. Поможете?

        • Kama4489
          <?php
          $author = get_the_title();
          
          $author_children = new WP_Query(array(
          	'orderby'        => 'date',
          	'post_type'      => 'page',
          	'meta_key'       => 'author',
          	'meta_value'     => $author,
          	'posts_per_page' => -1,
          	'post_parent'    => 411
          ) );
          
          if( $author_children->have_posts() ){
          	echo '
          	<hr>
          	<h2><center>Публикации на сайте</center></h2>';
          
          	while( $author_children->have_posts() ){
          		$author_children->the_post();
          		?>
          		<p style="text-align:center;"><a href="<?php echo get_permalink($page_id); ?>/#title" title="Перейти к статье"><?php the_title(); ?></a></p>
          		<?php 
          	}
          }
          
          wp_reset_query();
          ?>
          1
  • Геннадий

    Здравствуйте Кама!

    Сайт у Вас великолепный

    Не давно занимаюсь WP. Очень нужна помощь!!!

    Собираю одностраничник
    Вопрос по теме - нужно вывести на страницу вопросник,
    через произвольные поля: вопрос - ответ - текст произвольный
    получается 3 произвольные поля с разными ключами и значением

    Я, от незнания, вывожу через get_post_meta( $post_id, $key, true)
    Получается сколько вопросов - столько и записей/постов
    Записи привязаны к рубрике, выводятся через цикл

    Вопрос: Как вывести через массив, (третий параметр - false)
    чтоб можно было написать на одной странице, а не на 15-20

    Так как я новичок (пока), по возможности, можно поподробнее
    Или может есть статья на Вашем сайте, а я ее просто не нашел
    Желательно с конкретным примером, т.к. уверен что многие
    "утопают" именно в таких вещах

    За ранее спасибо!

    • campusboy1837 cайт: wp-plus.ru

      Привет! А зачем было создавать запись ради дополнительного поля в ней? smile Надо было хотя бы сделать Заголовок записи - это вопрос, контент записи - это ответ. И не надо произвольных полей тогда.

      Насчёт вопроса, я бы посоветовал новичку использовать плагин ACF PRO, который имеет произвольное поле типа повторитель (repeater) - видео с примерами кода.

      1
      • Геннадий

        Спасибо за ответ,НО, мне нужно понять как работают мета поля, а про плагин ACF и ACF PRO - я знаю. Мне на много проще понять по конкретному примеру
        Позвольте повторить вопрос:

        Есть 3 произвольных поля с разными ключами (обычные ПП WP):
        1) вопрос
        2) ответ
        3) текст - какой-то произвольный текст

        и 15-20 значения для каждого ключа

        Вопрос: Как вывести через массив, так, чтоб они стали корректно -
        ВОПРОС --- ОТВЕТ --- ТЕКСТ
        ВОПРОС --- ОТВЕТ --- ТЕКСТ
        и т.д все 15 шт.

        Ну, типа FAQ, т.е. все уже написано на сайт
        НЕ посетитель пишет - это не опрос

        Например: тема сайта подвесные потолки
        Вопрос: Как сильно опустится потолок?
        Ответ: Потолок опустится незначительно
        Текст: мелким текстом - Подробности посмотрите на ...
        (иногда есть поле ТЕКСТ, а иногда его нету)

        Поля будут меняться, удалятся в процессе работы
        Поэтому хочется 1 раз написать и управлять из админки (т.е ПП страницы)

        Заранее спасибо!

        • Kama4489

          Если я все правильно понял. Тут возможно проще в одно произвольное поле добавлять массив: вопрос - ответ - текст. Далее сделать это поле мульти. И потом просто получать мульти поле и обрабатывать все это для вывода...

          Минус массива данных в поле - это не возможность потом сортировать по значению. Но тут это вроде бы и не нужно...

      • Артур @

        Здравствуйте, а не подскажете на счет плагина ACF. Я вот установил, все работает, но с файлом archive.php все никак не разберусь. В админке поля таксономии добавляются, но при выводе в файле archive.php методом

        ID, 'имя поля', true); ?>

        ничего на странице категорий не происходит. Пробовал методы вывода описанные, где то в комментах этого сайта, методы с других сайтов, с официальной инструкции - не помогает. Тыкните меня, пожалуйста, в нужный код. Как правильно вывести поля. Спасибо

        • campusboy1837 cайт: wp-plus.ru

          Привет. К чему относится то инфа? Произвольные поля чего? Какой-то записи, рубрики, чего?

          • Артур @

            Инфа относится к плагину ACF | Advanced Custom Fields и выводу различных произвольных полей в любом месте сайта, с возможностью их администратирования. Меня конкретно интересует вывод Изображения и дополнительного поля с текстом на странице рубрик(категорий) http://вашсайт.ru/category/ваша_категория/ через файл archive.php.
            Проблема именно с функцией вызова тех полей, которые были созданы в админке для страниц рубрик.
            Для всех других страниц(записи, страницы и т.д.) все работает хорошо с функцией
            <?php echo get_post_meta($post->ID, ' Имя поля ', true); ?>
            но с файлом archive.php этот метод вызова наших полей не работает. Проблема не только у меня. Найти решение не могу. Надеюсь понятно объяснил(как мог) smile

            • campusboy1837 cайт: wp-plus.ru

              Да что его искать? Обычно все решения есть на сайте раработчика. И это не исключение, идем на страницу о the_field. Там

              $post_id = null; // current post
              $post_id = 1; // post 1
              $post_id = "option"; // options page
              $post_id = "options"; // same as above
              $post_id = "category_2"; // target a specific category
              $post_id = "event_3"; // target a specific taxonomy (this tax is called "event")
              $post_id = "user_1"; // target a specific user (user id = 1)
              
              the_field( "text_field", $post_id );

              Видим в нем такое:

              $post_id = "category_2"; // target a specific category

              Ага, значит надо передать "category_" + ID это категории. Каждый раз подставлять не круто, что делать? Можно найти нужную функцию из функций по рубрикам или поглядеть в списке глобальных переменных уже готовый вариант.

              Я выбрал вариант с глобальной переменной и код стал таким:

              the_field('field-name', 'category_' . $cat);

              Проверил на странице рубрики - работает.

              • Артур @

                Я правильно понял, я должен вставить этот код в любом месте файла archive.php и заменить только значение field-name?

                $post_id = null; // current post
                $post_id = 1; // post 1
                $post_id = "option"; // options page
                $post_id = "options"; // same as above
                $post_id = "category_2"; // target a specific category
                $post_id = "event_3"; // target a specific taxonomy (this tax is called "event")
                $post_id = "user_1"; // target a specific user (user id = 1)
                
                the_field('field-name', 'category_' . $cat)
                • campusboy1837 cайт: wp-plus.ru

                  Просто написать:

                  the_field('field-name', 'category_' . $cat);

                  Печально, что Вы делаете сайт, даже не пытаясь разобраться, как и что работает.

                  • Артур @

                    Я, как бы и пишу сюда, что бы разобраться unknw
                    Ведь я вставил код, как нужно и вот, что получилось

                    • Артур @

                      Текст выводит, а изображения нет. Извиняюсь за флуд

  • Добрый день! Возникла такая задача. Я хочу, чтобы вертикальная миниатюра поста отображалась отлично от горизонтальной. Я придумал сделать метабокс с чекбоксом под миниатюрой в админке, ну и если фотка вертикальная, то соответственно должен добаляться css класс в шаблоне. Значение чекбокса это "value"? Если да, то как его можно вывести.

    вот кусок кода из добавления метаполя, я сделал у него значение "vertical" и хочу, чтобы оно добавлялось в шаблоне ( т.е. будет

    $input = sprintf(
    	'<input %s id="%s" name="%s" type="checkbox" value="vert">',
    	 $db_value === 'vert' ? 'checked' : '',
    	 $field['id'],
    	 $field['id']
    				);

    Я вывожу в шаблоне так:

    <?php echo get_post_meta( get_the_ID(), '_____vert', true ); ?>

    Т.е. поле у меня есть, я не понимаю как вывести его значение.

  • Руслан

    Доброго времени суток.

    Есть изначальный код:
    $address = get_post_meta($post->ID, 'google', true);

    То есть он берет данные из произвольного поля поста, которое назывется google

    Суть в том, что у меня уже есть поле c названием Google_maps в посте, не в поле с произвольными полями, а в основной части.

    Когда я пишу код:
    $address = get_post_meta($post->ID, 'Google_maps', true);
    ничего не происходит, почему-то не вытаскиваются данные из этого поля.

    Ответить2 месяца назад #
  • Добрый день. Помогите пожалуйста решить один вопрос.
    Столкнулся с такой проблемой:
    У меня есть отдельный php файл в котором необходимо получить данные из базы содержащиеся в post_meta, формируя переменную
    $color = get_post_meta( $post->ID, '_color' );
    Все дело в том что в этом файле не работает $post->ID и соответственно у меня не получается извлечь необходимую мне информаци. Если я подставляю вместо $post->ID, ID определенной страницы то информация извлекается на отлично. Проблема в том что страницы могут быть разными и значения данного поля будет тоже отличаться(( Как то можно передать ID страницы, в отдельный PHP файл?

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

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

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