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

get_metadata() WP 2.9

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

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

✈ 1 раз = 0.00013с = быстро | 50000 раз = 1.0с = очень быстро
Хуки из функции:
Возвращает

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

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

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

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.1

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

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

get_metadata 10 комментариев
  • николай

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

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

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

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

    Ответить2 года назад #
    • Kama4697

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

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

    • Kama4697

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

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

      • александр cайт: piskarevskiyhram.ru @

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

        • Kama4697

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

          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;
          }
          • александр cайт: piskarevskiyhram.ru @

            Спасибо, работает, это действительно очень круто, как вы разбираетесь!
            Короче,мне очень неудобно, что я сразу не написал, но надо ещё решить один вопрос

            я обернул все в option. Но к каждому тегу option у меня добавляется класс

            пример:

            <select class="filters-select">
            	  <option value="">имя</option>
            	  <option value=".avreli">Аврелий</option>
            	  <option value=".german">Герман</option>
            	  <option value=".sirin">Сирин</option>
            	</select>

            для value есть тоже метабокс

            так вот, как бы мне туда тоже вынимать значения метаполей

            Это для isotope, если знаете. Я могу конечно все вручную вбивать, но хочется автоматизироватьsmile)

            • Kama4697

              Не понял что откуда берется конкретно...

              • Так, по порядкуsmile
                есть тип поста аудиозаписи 'audiopage'
                у него есть два метабокса:
                Имя автора: 'author'
                Значение поля: 'value_author'

                И верстка, в которую должны подставляться эти значения:

                <select class="filters-select">
                	  <option value="">имя</option>
                	  <option value="value_author">author</option>
                	  <option value="value_author">author</option>
                	  <option value="value_author">author</option>
                	</select>

                Причем, важно. чтобы пары value_author и author должны быть из одного поста.

                Вот.

Здравствуйте, !

Ваш комментарий
Предпросмотр