get_post_meta() – получает значение мета-поля поста

Функция позволяет получить значение мета-поля (произвольного поля) поста (записи, страницы или поста произвольного типа) с указанным ID. Значение функция получает из кэша или базы данных.

Функция возвращает:

  • Значение метаполя (или пустую строку, если метаполя не существует) – если параметр $single в функции установлен в значение true.
  • Массив всех значений метаполей с указанным ключом $key (или пустой массив, если метаполя не существует) – если параметра $single в функции установлен в значение false.
  • Массив всех существующих метаполей поста, если не указан параметр $key.
  • false – если некорректно указан ID поста (например была передана какая-то текстовая строка),
  • пустую строку, если поста с указанным ID не существует на сайте.

Кроме того, если значение мета-поля является например массивом и хранится в базе данных в сериализованном виде, то функция попытается его структурировать при помощи maybe_unserialize().

get_post_meta( $post_id, $key = '', $single = false )

Параметры

$post_id
(целое число) ID поста, значения мета-полей которого нужно получить.
$key
(целое число) Ключ, название произвольного поля. Совпадает с названием колонки meta_key в базе данных в таблице wp_postmeta.
$single
(логическое)
  • true – вернёт значение самого первого метаполя с указанным ключом.
  • false – вернёт массив всех значений метаполей с указанным ключом. Чекайте стриншот из базы данных, чтобы точно всё стало понятно: таблица wp-postmeta в pHpmyadmin

Примеры

1. Основы использования

Давайте далеко не будем ходить и рассмотрим всё на примере этого скриншота:

таблица wp-postmeta в pHpmyadmin
На скриншоте видны три метаполя, два из них с одинаковым ключом position, а ещё одно _edit_lockзащищённое, но это нам не помешает сейчас.
$position = get_post_meta( 11, 'position', true );
echo $position;
// получим значение "unnormal"
 
$position = get_post_meta( 9987, '_edit_lock', true );
echo $position;
// получим значение 1545207592:1
 
$position = get_post_meta( 11, 'position' ); // третий параметр по умолчанию равен false
print_r( $position );
/* получим:
Array
(
	[0] => unnormal
	[1] => normal
)
*/
 
$meta = get_post_meta( 11 );
print_r( $meta );
/*
Array
(
	[_edit_lock] => Array
		(
			[0] => 1545207592:1
		)
 
	[position] => Array
		(
			[0] => unnormal
			[1] => normal
		)
 
)
*/

Но в последнем примере есть подвох – безусловно, у поста с ID=11 тоже есть поле _edit_lock, но на скриншоте оно принадлежит другому посту – с ID=9987, поэтому его значение будет отличаться.

2. Реальный пример

Предположим, что мы хотим выводить SEO-описание (тег мета дескрипшн), если оно задано в мета-поле поста.

$seo_description = get_post_meta( $post_id, 'seo_description', true );
 
if( $seo_description ) {
	echo '<meta name="description" value="' . esc_attr( $seo_description ) . '" />';
}

Не забываем про очистку значения поля, потому что в админке пользователь вполне может указать что-то, что не поддерживается в HTML-атрибуте и страница может сломаться.

Более расширенный вариант, уже рабочий, с использованием хука wp_head:

add_action( 'wp_head', 'true_print_description' );
 
function true_print_description() {
 
	if( ! is_single() ) {
		return;
	}
 
	$seo_description = get_post_meta( get_the_ID(), 'seo_description', true );
 
	if( $seo_description ) {
		echo '<meta name="description" value="' . esc_attr( $seo_description ) . '" />';
	}
}

В этом примере мы также использовали функцию get_the_ID() для получения ID текущего поста в цикле и is_single(), чтобы проверить, что мы выполняем данный код именно на странице записи.

Не могу не упомянуть здесь, что с версии WordPress 3.5 мы также можем обратиться к метаполю как к свойству объекта WP_Post $post->seo_description, оно будет эквивалентно функции get_post_meta() с параметром $single равным true. Попробуем!

global $post;
 
if( $post->seo_description ) {
	echo '<meta name="description" value="' . esc_attr( $post->seo_description ) . '" />';
}

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

Остаётся лишь один вопрос – в админке нужно создать какой-нибудь метабокс, где это SEO-описание пользователи смогут указать.

3. Использование внутри цикла WordPress

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

Смотрите кстати видеоурок про циклы.

while( have_posts() ) : the_post();
 
	the_title( '<h2>', '</h2>' );
 
	$views = ( $views = get_post_meta( get_the_ID(), 'views', true ) ) ? absint( $views ) : 0;
	echo 'Просмотров: ' . $views;
 
endwhile;

Довольно изишный пример, но прокомментирую его пожалуй:

  • Прежде всего мы вывели заголовок поста функцией the_title() и обернули его в теги <h2>.
  • На строчке 5 – это шортхэнд-условие, записанное в одну строчку, в котором, если метаполя не существует, то оно записывает в переменную $views значение 0, иначе – значение метаполя.
  • Кроме того, как вы возможно догадались, значение количества просмотров может быть только положительным целым числом, поэтому очищаем функцией absint().
  • Ну и конечно функция get_the_ID() возвращает ID текущего поста в цикле.
  • И не забывайте, что очень многое будет зависеть от того, где вы используете этот код, но это уже подробнее в уроке про циклы.
пример использования функции get_post_meta()

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Пишите, если нужна помощь с сайтом или разработка с нуля.

Комментарии — 15

Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.

Миша Рудрастых и WordPress

Полезности из мира WordPress и жизни студии.

Мой телеграм-канал