WordPress как на ладони
Шаблоны, плагины и темы для настоящих поклонников Elementor. От TemplateMonster.com 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
)
*/

#1.1. Получим все произвольные поля записи

Если не указать ключ произвольного поля для функции, то она получит все поля сразу:

$metas = get_post_meta( 76 );
/*
Array
(
	[_edit_lock] => Array
		(
			[0] => 1517175359:1
		)

	[_edit_last] => Array
		(
			[0] => 1
		)

	[views] => Array
		(
			[0] => 10164
		)

	[_thumbnail_id] => Array
		(
			[0] => 9556
		)

	[photo] => Array
		(
			[0] => https://wp-kama.ru/wp-content/uploads/2010/03/Quicktags-API.png
			[1] => https://wp-kama.ru/wp-content/uploads/2017/07/image.png
		)

)
*/

#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;

В WordPress есть незадокументированная возможность получать метаполе записи так: $post->my_meta_key, где $post - объект WP_Post, а my_meta_key - название метаполя, которое нужно получить.

#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
}

7. Вывод всех произвольных полей всех записей

Этот пример показывает как одним запросом вывести все уникальные произвольные поля и посчитать сколько всего их используется в БД. Такой запрос может пригодится для профилирования произвольных полей записей:

global $wpdb;
$data = $wpdb->get_results("SELECT meta_key, count(*) as count FROM $wpdb->postmeta WHERE meta_key NOT LIKE '\_oembed%' GROUP BY meta_key");
print_r( $data );
/*
Array (
	[0] => stdClass Object (
			[meta_key] => _edit_lock
			[count] => 2300
		)

	[1] => stdClass Object (
			[meta_key] => _edit_last
			[count] => 2123
		)
	...
)
*/

Код get_post_meta: wp-includes/post.php VER 4.9.8

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

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

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

60 комментов
Полезные 1 Вопросы 2 Все
  • Княгиня cайт: webdevelopernotes.ru

    Такой вопросик: можно ли заставить вордпресс обрабатывать вставленные в произвольное поле шорткоды? К сожалению, он по умолчанию просто вываливает их как текст. Это навсегда или можно доработать?

    Ответить7 лет назад #
    • Kama6811

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

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

      Ответить7 лет назад #
  • Княгиня cайт: webdevelopernotes.ru

    Я согласна на индивидуальный, главное - чтобы я смогла осилить. smile

    Задача в том, чтобы на странице меток выводить не пост, а его анонс из произвольного поля, причём только при условии, что анонс вообще есть. Если анонса нет, то выводится, как и на страницах рубрик, кусок поста до тега more. (Поэтому использовать the_excerpt не вышло - не срабатывает проверка на "есть-нет".)

    Шорткоды я использую, чтобы вставлять видео с ютьюба и блок картинки с сопровождающим текстом. Шорткоды мной прописаны собственноручно в function.php. Например, для видео формат такой: [movie w="ширина" h="высота"]урл[/movie]. На выходе - встроенный видеоролик.

    Разумеется, если задача окажется неподъёмной, то в запасе обходной путь: писать пост так, чтобы не требовалось выводить видео через то поле. Но если задача решаема, то мой опыт явно станет ширше и полезнее. smile

    Ответить7 лет назад #
    • Kloobi cайт: kloobi.net

      Сдаётся мне, что задача решается применением к тексту поля тех же фильтров, что и к основному посту:
      $custom_content = apply_filters('the_content', $custom_field_content);

      Ответить6.6 лет назад #
      • Княгиня cайт: greatbattle.ru

        А где их приложить? То есть, буквально: в какой файл лезть?

        Ответить6.6 лет назад #
      • Княгиня cайт: greatbattle.ru

        Попробовала приложить этот фильтр в том месте, где должно выводиться значение - ничего не изменилось. Как шорткод вываливался набором тегов, так и вываливается. Обработки не происходит.

        Ответить6.6 лет назад #
  • Е

    Помогите плиз решить задачу. Думаю, будет интересно многим:

    Есть в файле сингл такой блок:

    Статью опубликовано в рубрике
    По умолчанию выводится ссылка на рубрику, в которой прикреплена статья и с тем названием (ключем), как ее назвали.

    Я же продвигаю рубрики по разным ключам и хотелось бы этот блок для перелинковки тоже с толком использовать. Как можно код прописать, чтобы задействовать произвольное поле?

    Статью опубликовано в рубрике

    Т.е. нужно мне прописать в поле ссылку не "новости города", а "городские новости", а когда не нужно нового ключа (например, хватит уже перелинковывать вручную) - чтобы выводилось автоматом то, как она и названа?

    Хочется произвольным полем. Предполагаю, например, чтобы назвать поле "pole" и в коде прописать
    ID, "pole", true); ?>

    НО как это соединить с пердыдущим кодом, чтобы если этот код не используется в статье (осталось поле "значение" пустым), то срабатывал первый код и выводилась ссылка по умолчанию?

    Ответить6.7 лет назад #
  • Павел

    Здравствуйте, Тимур. Спасибо за отличный сайт! Все очень качественно сделано. Частенько сюда захожу. Небольшая опечатка в этом посте "Если выставить параметр в ture, то функция вернет единственное значение в виде строки".

    ture - true.

    Ответить6.4 лет назад #
  • Сергей

    Привет всем.
    Помогите получить посты из wp_usermeta. Нужно в конце поста (single.php) вывести последних 5 постов автора этого поста. Есть разные готовые решения но! ниодно неработает. В таблице вп_узермета есть мета_кей user_posts где мета_валуе a:2:{i:0;s:4:"2113";i:1;s:4:"2112";} 2112,2113 id постов автора. Может знает кто, где есть инфа по этой белиберде?

    Ответить6.3 лет назад #
  • Евгений cайт: how-to-foto.ru

    Добрый день. Дурацкий вопрос: иногда в meta_value мне встречаются значение-строка такого вида a:1:{i:0;s:11:" 2001-3000";} . Я понимаю, что в этом значении, видимо, упакован массив данных. Есть ли какая-нибудь функция, чтобы распаковать эту строку в массив?

    Ответить6.2 лет назад #
    • Евгений cайт: how-to-foto.ru

      Вопрос действительно дурацкий - не мог сформулировать запрос в яндексе, чтобы найти ответ. А он заключается в описании функций serialize() и unserialize()

      Ответить6.2 лет назад #
  • Zuenf

    Опечатка - ture

    Если выставить параметр в ture, то функция вернет единственное значение в виде строки.

    Ответить6 лет назад #
  • артем

    УМОЛЯЮ помогите люди!! что не так!

    function wpca_init(){
    		$wpca_set = get_post_meta( get_the_ID(), 'wpca_set', true );
    	if($wpca_set == 'yes') {
    		return 'yes';
    	}
    		else {
    				return 'no';
    		}
    }
    add_action( 'init', 'wpca_init' );

    почему данная функция неработает? интересно что

    function wpca_init(){
    $wpca_set = get_post_meta( get_the_ID(), 'wpca_set', true );
    echo $wpca_set;
    }
    add_action( 'init', 'wpca_init' );

    так тоже не работает((
    а вот в мета боксе все работает((

    function display_wpca_box() {
    $wpca_set = get_post_meta( get_the_ID(), 'wpca_set', true );
    echo $wpca_set; 
    }
    add_meta_box( 'wpca_meta',
    		'Настройка WPCA',
    		'display_wpca_box',
    		'page', 'normal', 'high'
    	);

    прошу скажите в чем дело((

    Ответить5.5 лет назад #
  • Denis

    Может кто нашел решение такой проблемы - видел, что не один с ней столкнулся, но ответа нигде не нашел.

    Суть - Используется плагин для мультиязычности, например polylang.
    Есть рус версия страницы и англ версия.
    Используются метаполя.

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

    Ответить5.1 лет назад #
    • Denis

      И опять мне ваш сайт помог!!! )
      Я нашел решение - пока писал вопрос!
      Хотя до этого несколько дней убил на поиски решения - другие коды вывода метаполей, плагины различные для их вывода, менял код шаблона, все бесполезно было.

      А решение простое - просто в настройках плагина polylang отключить Синхронизацю для Пользовательских полей, хотя для остального она вроде нужна.
      Спасибо!)

      Ответить5.1 лет назад #
  • Илья

    Здравствуйте! Есть такой код

    <?
    /*
     * The template name: Список промокодов
     */
    ?>
    <style>
    
    .coupon {
    	clear: both;
    	overflow: hidden;
    	margin: 0 0 25px 0;
    	padding: 10px;
    	border: 1px dashed #b1b1b1;
    	border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px;
    }
    
    .coupon .get-price {
    	margin-top: 15px;
    }
    
    .coupon p {
    	margin: 0;
    }
    
    .coupon .get-more {
    	margin-top: 15px;
    }
    </style>
    <?php
    	if (!empty($_POST['post_id'])) { $post_id = $_POST['post_id']; }
    
    	// если мы получили id posta, то продолжаем
    	if($post_id) {
    		$offers_id = get_post_meta($post_id, 'wpcf-offers_id', true); // получаем id нужного оффера для нужного поста и подставляем значение в URL
    		$url = 'Полный путь до вашего XML файла с купонами'; // получили URL адрес для скачивания RSS фида с промокодами для нужного арендодателя
    
    		$xml = simplexml_load_file($url); // проверяем существование этого фида
    
    		// если RSS feed существует, то продолжаем
    		if($xml) {
    
    			// разбираем фид и извлекаем промокоды
    			foreach ($xml->xpath('coupons/coupon') as $coupon) {
    				if($coupon) {
    				// если удалось извлечь купоны, то записываем полученные данные в строку
    
    					if($coupon->advcampaign_id == $offers_id ) {
    						$coupon_str .= '<div class="coupon">';
    						$coupon_str .= '<h3><b>'.$coupon->short_name.': </b>'.$coupon->name.'</h3>';
    						$coupon_str .= '<img src="'.$coupon->logo.'">';
    						$coupon_str .= '<p>'.$coupon->description.'</p>';
    						$coupon_str .= '<p style="margin:15px 0;">Промокод: '.$coupon->promocode.'</p>';
    						$coupon_str .= '<a target="_blanck" rel="nofollow" class="get-price" href="'.$coupon->promolink.'">Использовать промокод</a>';
    						$coupon_str .= '<p style="color: #888; margin: 10px 0; text-align: right;">Срок действия до '.$coupon->date_end.'</p>';
    						$coupon_str .= '</div>';
    
    					} else { $e =''; $error = '<div style="padding: 50px; border: 1px dashed #888; margin: 25px 0;text-align: center;">Промокоды для этого магазина временно недоступны';}
    
    				} else {
    					$error = '<div style="text-align: center; width: 100%;padding: 15px;">Извините, промокоды для этого магазина временно отсутствуют</div>';
    				}           
    			} 
    		} else { $error = 'XML не получен';}
    			echo $coupon_str;
    	} else { echo 'POST_ID не получен';}
    ?>

    что нужно исправить в этом коде чтобы к одному посту можно было привязать 2 или больше произвольных полей? Это нужно для того чтобы в одну и ту же запись можно было бы подгрузить разных офферов

    Ответить4.8 года назад #
    • Kama6811

      Вы можете добавлять в одно поле несколько данных, они будут записываться в массив. Чтобы их потом получить, вам нужно не указывать третий параметр true, тогда функция get_post_meta вернет весь массив, а не только его первое значение. Вот пример, допустим мы добавили в поле с называнием mymeta 2 значение: значение 1 и значение 2:

      $metas = get_post_meta($post->ID, 'mymeta');
      foreach( $metas as $meta ){
      	echo "$meta <br>";
      }
      // вернет:
      // значение 1
      // значение 2
      Ответить4.8 года назад #
      • Илья

        Спасибо за ответ! Теперь выводится в записи цифры id оффера, а нужно чтобы сами купоны...

        Ответить4.8 года назад #
        • Kama6811

          Вот ваш код:

          <?
          /*
           * The template name: Список промокодов
           */
          ?>
          <style>
          
          .coupon {
          	clear: both;
          	overflow: hidden;
          	margin: 0 0 25px 0;
          	padding: 10px;
          	border: 1px dashed #b1b1b1;
          	border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px;
          }
          
          .coupon .get-price {
          	margin-top: 15px;
          }
          
          .coupon p {
          	margin: 0;
          }
          
          .coupon .get-more {
          	margin-top: 15px;
          }
          </style>
          <?php
          	if (!empty($_POST['post_id'])) { $post_id = $_POST['post_id']; }
          
          	// если мы получили id posta, то продолжаем
          	if( $post_id ) {
          		$url = 'Полный путь до вашего XML файла с купонами'; // получили URL адрес для скачивания RSS фида с промокодами для нужного арендодателя
          
          		$xml = simplexml_load_file($url); // проверяем существование этого фида
          
          		// если RSS feed существует, то продолжаем
          		if( $xml ){
          
          			// получаем id нужного оффера для нужного поста и подставляем значение в URL
          			$offers_ids = get_post_meta($post->ID, 'wpcf-offers_id');
          			foreach( $offers_ids as $offers_id ){
          				$coupon_str .= coupon_output( $xml, $offers_id );
          			}
          
          		} 
          		else
          			$error = 'XML не получен';
          
          		echo $coupon_str;
          	}
          	else 
          		echo 'POST_ID не получен';
          
          function coupon_output( $xml, $offers_id ){
          	// разбираем фид и извлекаем промокоды
          	foreach ($xml->xpath('coupons/coupon') as $coupon) {
          		if($coupon){
          
          			// если удалось извлечь купоны, то записываем полученные данные в строку
          			if($coupon->advcampaign_id == $offers_id ) {
          				$coupon_str .= '<div class="coupon">';
          				$coupon_str .= '<h3><b>'.$coupon->short_name.': </b>'.$coupon->name.'</h3>';
          				$coupon_str .= '<img src="'.$coupon->logo.'">';
          				$coupon_str .= '<p>'.$coupon->description.'</p>';
          				$coupon_str .= '<p style="margin:15px 0;">Промокод: '.$coupon->promocode.'</p>';
          				$coupon_str .= '<a target="_blanck" rel="nofollow" class="get-price" href="'.$coupon->promolink.'">Использовать промокод</a>';
          				$coupon_str .= '<p style="color: #888; margin: 10px 0; text-align: right;">Срок действия до '.$coupon->date_end.'</p>';
          				$coupon_str .= '</div>';
          
          			} 
          			else
          				$error .= '<div style="padding: 50px; border: 1px dashed #888; margin: 25px 0;text-align: center;">Промокоды для этого магазина временно недоступны</div>';
          
          		} else
          			$error .= '<div style="text-align: center; width: 100%;padding: 15px;">Извините, промокоды для этого магазина временно отсутствуют</div>';  
          	}
          
          	return $coupon_str . $error;
          }
          ?>
          Ответить4.8 года назад #
          • Илья

            и не вывелись купоны(

            Ответить4.8 года назад #
            • Kama6811

              Полный путь до вашего XML файла с купонами

              Заменили на путь до XML файла с купонами?

              Если до этого все работало, то и теперь должно. Если я там никаких синтаксических ошибок не допустил, в логике вроде все верно.

              Ответить4.8 года назад #
              • Илья

                да, конечно, заменил. да и ошибок там вроде и нет... изначально когда был тут true - $offers_id = get_post_meta($post_id, 'wpcf-offers_id', true); все работало, но подгружался в запись только один оффер а сейчас не чего не выходит... я пробывал и в одно произвольное поле несколько id в админке ставить, и 2 одинаковых поля создал с разными id... но не выходит... ммм реализация этого всего есть на этом блоге только скрипт там не доработанный

                Ответить4.8 года назад #
                • Kama6811

                  Странно, что вообще ничего не выводит, если один выводился, то должен и для нескольких выводиться. Все вроде по аналогии сделал. Вы точно все правильно сделали? Для этого кода, нужно задать 2 произвольных поля в админке с одинаковыми ключами wpcf-offers_id и разными значениями.

                  В общем, у меня никаких идей, все что смог сделал. Надо на деле смотреть.

                  Ответить4.8 года назад #
                  • Илья

                    Все равно спасибо большое! Как найду ответ сразу напишу сюда.

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