WordPress как на ладони
wordpress jino

get_metadata() WP 2.9

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

Кэширует результат.

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

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

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

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

get_metadata( $meta_type, $object_id, $meta_key, $single );
$meta_type(строка) (обязательный)
Тип объекта, метаданные которого нужно получить. Может быть: post, page, comment, user и т.д.
По умолчанию: нет
$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);

Заметки

Код get_metadata: wp-includes/meta.php VER 4.9.8

<?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, 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 Object ID.
	 * @param string            $meta_key  Meta 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 ) );
		$meta_cache = $meta_cache[$object_id];
	}

	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 (метаданные)

6 комментов
  • николай

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

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

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

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

    Ответить2.6 года назад #
    • Kama6714

      Я не знаю такую функцию. Здесь проще обычным 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
      Ответить2.6 года назад #
  • александр cайт: piskarevskyhram.ru

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

    Ответить1.5 год назад #
    • Kama6714

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

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

      Ответить1.5 год назад #
      • александр cайт: piskarevskiyhram.ru

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

        Ответить1.5 год назад #
        • Kama6714

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

          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;
          }
          Ответить1.5 год назад #
Здравствуйте, !     Войти . Зарегистрироваться