WordPress как на ладони
rgbcode is looking for WordPress developers.

get_post_meta()WP 1.5.0

Получает значение произвольного поля записи (поста). Позволяет также получить все метаполя.

Для того, чтобы получить значение всех произвольных полей определенного поста, нужно оставить пустым параметр $key. Также для этого можно воспользоваться функцией get_post_custom().

Если в данных содержится сериализованный массив (serialize), то он автоматом будет обработан функцией unserialize(), т.е. чтобы получить сериализованные данные их не нужно отдельно обрабатывать функцией unserialize().

Работает на основе: get_metadata()
1 раз — 0.0007429 сек (медленно) | 50000 раз — 0.12 сек (очень быстро) | PHP 7.4.25, WP 6.0

Хуков нет.

Возвращает

Разное.

Если в значении метаполя хранится число оно будет возвращено в виде строки, например, "54"...

  • Вернет false, когда неправильно передан параметр $post_id (не-numeric, 0 или отрицательное значение).

  • При $single = true
    • строка/массив — когда метаполе есть.
    • '' — когда метаполя нет.
  • При $single = false
    • массив значений метаполей — когда метаполе есть.
    • array() — когда метаполя нет.

Использование

$meta_values = get_post_meta( $post_id, $key, $single );
$post_id(число) (обязательный)
ID поста, произвольные поля которого нужно получить.
$key(строка)
Название произвольного поля, значение которого нужно получить. Если оставить поле пустым, будут получены все произвольные поля поста.
По умолчанию: ''
$single(логический)

true - вернет значение метаполя (если полей несколько то вернет значение первого метаполя).
false - вернет массив всех значений мета полей с указанным ключом.

Если в значении произвольного поля находится сериализованный массив, то значение true вернет, нормальный массив, а если указать false, то вернется массив, где в ключе "[0]" будет лежать тот же сериализованный массив.

Этот параметр раотает только если указан параметр $key!

По умолчанию: false

Примеры

5

#1 Использования функций произвольных полей на примере авторской функции

/**
 * Эта функция обрабатывает два мета тега (произвольных поля): `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;

			break;

		default :
			return false;

			break;

	} // Конец проверки switch

}
3

#2 Пример использования get_post_meta() внутри Цикла WordPress.

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

<?php 
$thumb = get_post_meta( $post->ID, 'thumb', true );

if ( $thumb ) {
	?>
	<a href="<?php the_permalink() ?>" rel="bookmark">
		<img class="thumb" src="<?php echo $thumb ?>" alt="<?php the_title(); ?>" />
	</a>
	<?php
}
?>
3

#3 Проверим существование указанного метаполя

Когда нужно проверить существует ли поле, с любым значением: пустая строка или 0:

$metas = get_post_meta( $post->ID );
if( isset( $metas['key_name'] ) ){
	echo 'Мета поле "key_name" существует, не важно какое там значение.';
}
1

#4 Подсчет кол-ва всех произвольных полей всех записей

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

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
		)
	...
)
*/
0

#5 Получим массив значений произвольных полей

Получим значения полей поста 76, ключ которых равен key_1, подразумевается что у поста несколько произвольных полей с ключом key_1:

$values = get_post_meta( 76, 'key_1' );
/*
Array
(
	[0] => значение 1
	[1] => значение 2
)
*/
0

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

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

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

$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
		)

	[serialized_value] => Array
		(
			[0] => a:2:{s:4:"name";s:6:"hexlet";s:4:"type";s:5:"admin";}
		)

)
*/
0

#7 Получим только одно произвольное поле

Чтобы получить только первое (или единственное) значение произвольного поля в виде строки, используем такой вызов функции:

$value = get_post_meta( 76, 'key_1', true ); //> значение 1
0

#8 Объединение всех метаполей в объект

Этот пример показывает как можно удобно объединить все произвольные поля записи.

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

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

// соберем все метаполя в объект $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 - название метаполя, которое нужно получить.

0

#9 Проверка, что мета-поле существует

// для single значения
$value = get_post_meta( 76, 'key_1', true );

if( '' !== $value ){
	// мета-поле есть
}

// для multiple значения
$value = get_post_meta( 76, 'key_1' );

if( [] !== $value ){
	// мета-поле есть
}

Список изменений

С версии 1.5.0 Введена.

Код get_post_meta() WP 6.6.2

function get_post_meta( $post_id, $key = '', $single = false ) {
	return get_metadata( 'post', $post_id, $key, $single );
}
59 комментариев
Полезные 2Вопросы 5 Все
    Войти