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

Владислав Белецкий
Владислав Белецкий .
Категория:
Комментариев: 0

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

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

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

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

Параметры

$post_id
(целое число) ID поста, значения мета-полей которого нужно получить.
$post_id
(целое число) Ключ, название произвольного поля. Совпадает с названием колонки meta_key в базе данных в таблице wp_postmeta.
$single
(логическое)

  • true – вернёт значение самого первого метаполя с указанным ключом.
  • false – вернёт массив всех значений метаполей с указанным ключом. Чекайте стриншот из базы данных, чтобы точно всё стало понятно:
    таблица wp-postmeta в pHpmyadmin

Примеры

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

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

$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() для проверки свойства.

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;

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

Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии