Функция позволяет получить значение мета-поля (произвольного поля) поста (записи, страницы или поста произвольного типа) с указанным ID. Значение функция получает из кэша или базы данных.
Функция возвращает:
$single
в функции установлен в значение true
.$key
(или пустой массив, если метаполя не существует) – если параметра $single
в функции установлен в значение false
.$key
.false
– если некорректно указан ID поста (например была передана какая-то текстовая строка),Кроме того, если значение мета-поля является например массивом и хранится в базе данных в сериализованном виде, то функция попытается его структурировать при помощи maybe_unserialize().
get_post_meta( $post_id, $key = '', $single = false )
meta_key
в базе данных в таблице wp_postmeta
.true
– вернёт значение самого первого метаполя с указанным ключом.false
– вернёт массив всех значений метаполей с указанным ключом. Чекайте стриншот из базы данных, чтобы точно всё стало понятно:
Давайте далеко не будем ходить и рассмотрим всё на примере этого скриншота:
$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, поэтому его значение будет отличаться.
Предположим, что мы хотим выводить 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-описание пользователи смогут указать.
В какой-то степени можно сказать, что и в предыдущем примере мы использовали функцию внутри цикла со всего лишь одним постом.
Смотрите кстати видеоурок про циклы.
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;
Довольно изишный пример, но прокомментирую его пожалуй:
<h2>
.$views
значение 0
, иначе – значение метаполя.Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
Функция the_meta() работает и выводит все произвольные поля на странице в том месте, где я указал ее в коде. А вот get_post_meta() ничего не выводит. Указываю id поста и название поля. Все так как у Вас в статье. Какова может быть причина что данная функция ничего не выводит? :(
get_post_meta()
должен бытьtrue
, у вас так?1 и 2 условия соблюдены. Вчера вечером решил вопрос - заработал вот такой код т.е. добавил echo, ну и true, конечно :)
Спасибо за ответ.
Когда вывожу посты через get_post_meta($post->ID,'',false) (мне нужны все поля со всеми ключами для всех постов), вордпресс выводит ключи, которые начинаются с нижнего подчёркивания вместе с их значениями (_edit_last, _edit_lock, _thumbnail_id). Подскажите, пожалуйста, как можно отменить их отображение
Юрий, попробуйте так:
Спасибо большое, помогли)
Как в данном примере обернуть dКак обернуть user_submit_name в div? Но только внутри php?
Большое спасибо!
Здравствуйте! Пожалуйста подскажите как упростить эту конструкцию
Здравствуйте,
Легко –
get_post_meta( $post->ID )
Здравствуйте. Есть пост с множеством произвольных полей-чекбоксов. Как собрать их в масив и вывести на странице в виде списка?
Здравствуйте Ростислав,
Зависит от того, что означают эти чекбоксы и в каком виде они у вас хранятся в базе данных.
Здравствуйте,
ошибка в описании параметров функции. Дважды озаглавили $post_id.
Здравствуйте, спасибо, поправил! с Новым Годом! 🎄