WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

get_metadata() WP 2.9

Получает метаданные указанного объекта (пост, комментарий, пользователь). Кэширует результат.

Это фундаментальная функция метаданных. Параметр $meta_type здесь отвечает за привязку к таблице базы данных, кэшу, хукам, а не к типу поста или чего-то еще. Поэтому для всех типов постов надо указывать post.

Не рекомендуется использовать эту функцию, если вы точно не знаете зачем используете именно её. У этой функции есть все необходимые обертки, в 99% случаев использовать нужно именно их:

Является основой для: get_term_meta(), get_user_meta(), get_comment_meta(), get_post_meta()
✈ 1 раз = 0.00013с = быстро | 50000 раз = 1.0с = очень быстро
Хуки из функции
Возвращает

Строку/массив.

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

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

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

get_metadata( $meta_type, $object_id, $meta_key, $single );
$meta_type(строка) (обязательный)

Тип объекта, метаданные которого нужно получить. Может быть:

  • post - для всех типов постов, таблица wp_postmeta.
  • comment - для всех типов комментариев, таблица wp_commentmeta.
  • user - для юзеров, таблица wp_usermeta.
  • custom_type - своя таблица метаданных.
$object_id(число) (обязательный)
ID типа объекта, указанного в $meta_type, метаданные которого нужно получить. Например, тут пишем ID поста, если тип post.
$meta_key(строка)
Название ключа метаполя. Если не указать этот параметр, будут возвращены все значения всех метаполей объекта.
По умолчанию: ''
$single(логический)

true — вернет значение метаполя в виде строки или массива (если в значении метаполя находится сериализованный массив). При наличии нескольких метаполей с одинаковым ключом, вернется значение первого метаполя.

false — будет возвращен массив со значениями всех метаполей указанного ключа. В этом случае все значения будет строками, даже когда в значении находится сериализованный массив (преобразовывать его в массив нужно будет вручную).
По умолчанию: false

Примеры

#1. Вывод метаданных постов

Несколько примеров, которыми можно вывести метаданные постов, пользователей и комментариев. Т.е. это альтернативы соответствующих функций ВП: get_post_meta(), get_user_meta(), get_comment_meta().

// получим произвольное поле поста 17, сразу в переменную
$post_meta = get_metadata( 'post', 17, 'robots', true );

// Получим Ник пользователя 14
$user_meta = get_metadata( 'user', 14, 'nickname', 1 );

// Получим все метаданные комментария 115, в виде массива.
$comment_meta = get_metadata( 'comment', 115 );

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

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

Код get metadata: wp-includes/meta.php WP 5.4.2

<?php
function get_metadata( $meta_type, $object_id, $meta_key = '', $single = false ) {
	if ( ! $meta_type || ! is_numeric( $object_id ) ) {
		return false;
	}

	$object_id = absint( $object_id );
	if ( ! $object_id ) {
		return false;
	}

	/**
	 * Filters whether to retrieve metadata of a specific type.
	 *
	 * The dynamic portion of the hook, `$meta_type`, refers to the meta
	 * object type (comment, post, term, or user). Returning a non-null value
	 * will effectively short-circuit the function.
	 *
	 * @since 3.1.0
	 *
	 * @param null|array|string $value     The value get_metadata() should return - a single metadata value,
	 *                                     or an array of values.
	 * @param int               $object_id ID of the object metadata is for.
	 * @param string            $meta_key  Metadata key.
	 * @param bool              $single    Whether to return only the first value of the specified $meta_key.
	 */
	$check = apply_filters( "get_{$meta_type}_metadata", null, $object_id, $meta_key, $single );
	if ( null !== $check ) {
		if ( $single && is_array( $check ) ) {
			return $check[0];
		} else {
			return $check;
		}
	}

	$meta_cache = wp_cache_get( $object_id, $meta_type . '_meta' );

	if ( ! $meta_cache ) {
		$meta_cache = update_meta_cache( $meta_type, array( $object_id ) );
		if ( isset( $meta_cache[ $object_id ] ) ) {
			$meta_cache = $meta_cache[ $object_id ];
		} else {
			$meta_cache = null;
		}
	}

	if ( ! $meta_key ) {
		return $meta_cache;
	}

	if ( isset( $meta_cache[ $meta_key ] ) ) {
		if ( $single ) {
			return maybe_unserialize( $meta_cache[ $meta_key ][0] );
		} else {
			return array_map( 'maybe_unserialize', $meta_cache[ $meta_key ] );
		}
	}

	if ( $single ) {
		return '';
	} else {
		return array();
	}
}

Cвязанные функции

Из метки: metadata (метаданные)

Еще из раздела: Метаданные

11 комментов
Полезные 2 Все
  • николай

    Добрый день. Функция get_user_meta() получает метаданные указанного пользователя. Есть ли какая нибудь функция , которая получает все существующие метаполя по ключу поля без привязки к пользователю. У меня есть пользователи, у некоторых пользователей есть определенные метаполя. Как выбрать эти мета поля с учетом того, что их может быть по несколько на одного пользователя?

    Пробовал через wp_user_query и meta_query. Выбирал role=>contributor,

    meta_query=>array('key' =>'url_zap', 'compare' =>'EXIST')

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

    Ответить25.Ноя.2015 00:58 #
    • Kama7752

      Я не знаю такую функцию. Здесь проще обычным sql запросом так:

      global $wpdb;
      $metas = $wpdb->get_results("SELECT * FROM $wpdb->usermeta WHERE meta_key = 'wp_user_level' ORDER BY user_id DESC");
      
      $collect = array();
      foreach( $metas as $arr )
      	$collect[ $arr->user_id ][] = $arr->meta_value;
      
      print_r( $collect );
      1
      Ответить25.Ноя.2015 01:41 #
  • александр piskarevskyhram.ru

    Добрый день! У меня такая задача, есть произвольное поле, для каждого поста, на отдельном типе странице "audiopage" id поля "author"
    Как мне на этой странице, вне цикла вордпресс вывести значения со всех постов из этого поля. Грубо говоря, мне нужно в виде html списка вывести всех авторов.

    Ответить6.Фев.2017 17:08 #
    • Kama7752

      Функции для этого в ВП нет... Тут наверное лучше сделать отдельный запрос в таблицу wp_postmeta и получить все данные по полю meta_key='author' - это будет наиболее быстрый запрос...

      Другой вариант это через wp_query получить все посты с таким полем, потом пройтись по всем постам и с помощью get_post_meta() вывести все значения этих полей...

      Ответить6.Фев.2017 17:28 #
      • александр piskarevskiyhram.ru

        Тимур, помогите, пожалуйста, написать такой запрос в БД. Моих знаний , к сожалению, пока не хватает. Самое главное, результаты должны оборачиваться в тег

        Ответить7.Фев.2017 01:39 #
        • Kama7752

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

          global $wpdb;
          $res = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->postmeta WHERE meta_key = %s", 'author') );
          
          // соберем значения
          $authors = wp_list_pluck( $res, 'meta_value' );
          
          // выводим значения в UL
          echo '<ul><li>'. implode('</li><li>', $authors) .'</li></ul>';
          
          // -------------------------------
          
          // более понятный вариант для обработки $res
          foreach( $res as $data ){
          	echo $data->meta_value;
          }
          Ответить7.Фев.2017 03:32 #
  • Валерий

    Для типа записей "page" функция возвращает NULL. Как так? Передаю только тип записи и её id.

    Ответить7.Май.2020 22:43 #
    • Валерий

      Тип записей 'page' функцией не поддерживается: https://developer.wordpress.org/reference/functions/get_metadata/

      Ответить8.Май.2020 17:03 #
      • Валерий

        Забыли добавить поддержку? Иначе логики не вижу...

        Ответить8.Май.2020 17:07 #
        • Валерий

          Оказалось для записей типа 'page' в функцию нужно передавать тип 'post' и тогда функция работает.

          Ответить8.Май.2020 17:17 #
          • Kama7752

            Блин, в описании к параметру $meta_type был в качестве примера тип page, не знаю чего он там забыл, поправил описание.

            Вообще это фундаментальная функция метаданных, и тип тут означает привязку к таблице базы данных, а не к типу поста или чего-то еще. Поэтому для всех типов постов надо указывать $meta_type = post.

            Но тебе, нужно использовать обертку этой функции для работы с метаданными записей, а не её саму: get_post_meta().

            1
            Ответить8.Май.2020 20:12 #