Функция позволяет получить значение мета-поля (произвольного поля) поста (записи, страницы или поста произвольного типа) с указанным ID. Значение функция получает из кэша или базы данных.
Функция возвращает:
Кроме того, если значение мета-поля является например массивом и хранится в базе данных в сериализованном виде, то функция попытается его структурировать при помощи maybe_unserialize().
get_post_meta( $post_id, $key = '', $single = false )
Параметры
- $post_id
- (целое число) ID поста, значения мета-полей которого нужно получить.
- $post_id
- (целое число) Ключ, название произвольного поля. Совпадает с названием колонки
meta_key
в базе данных в таблицеwp_postmeta
. - $single
- (логическое)
true
– вернёт значение самого первого метаполя с указанным ключом.false
– вернёт массив всех значений метаполей с указанным ключом. Чекайте стриншот из базы данных, чтобы точно всё стало понятно:
Примеры
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;
Довольно изишный пример, но прокомментирую его пожалуй: