default_(meta_type)_metadataхук-фильтрWP 5.5.0

Позволяет изменить значение по умолчанию для метаполя записи, термина таксономии, пользователя или комментария.

Динамическая часть имени хука, (meta_type) - это название типа объекта метаполя. Т.е. этот хук может иметь следующие названия:

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

add_filter( 'default_(meta_type)_metadata', 'wp_kama_default_meta_type_metadata_filter', 10, 5 );

/**
 * Function for `default_(meta_type)_metadata` filter-hook.
 * 
 * @param mixed  $value     The value to return, either a single metadata value or an array of
 *                          values depending on the value of `$single`.
 * @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`.
 * @param string $meta_type Type of object metadata is for. Accepts 'blog', 'post', 'comment',
 *                          'term', 'user', or any other object type with an associated meta table.
 *
 * @return mixed
 */
function wp_kama_default_meta_type_metadata_filter( $value, $object_id, $meta_key, $single, $meta_type ){
	// filter...
	return $value;
}
$value(разное)
Дефолтное значение, которое нужно вернуть. Может быть строкой или массивом, зависит от параметра $single.
$object_id(int)
ID объекта метаданных: ID поста, термина, комментария, юзера.
$meta_key(string)
Название метаполя (ключ метаполя).
$single(true|false)
Как было запрошено получение значений. См. аналогичный параметр в функции get_post_meta().
$meta_type(строка)
Тип объекта, к которому принадлежит метаполе. Может быть: post, comment, term, user или любой другой тип, если вы создавали поля для произвольной таблицы.

Примеры

#1 Укажем дефолтное значение просмотров, когда у поста еще нет просмотров

Допустим, количество просмотров поста хранится в метаполе views, и мы хотим, чтобы, когда у поста ещё нет ни одного просмотра, выводилось какое-то число, а не 0. Чтобы подогреть интерес читателей к статье.

Но при этом мы не хотим реально изменять значение поля views, то есть если просмотры есть, то выводятся они, а если их вообще нет, то нужно выводить, например, 10.

Мы можем тут использовать случайное число, чтобы у всех постов не было одинакового количества просмотров, но тогда это число всегда будет меняться — этого нам тоже не нужно. Поэтому давайте возьмём две последние цифры ID поста и будем выдавать их за количество просмотров.

# Укажем дефолтное значение просмотров, когда у поста еще нет просмотров
add_filter( 'default_post_metadata', 'default_post_views_meta_value', 10, 5 );

function default_post_views_meta_value( $value, $object_id, $meta_key, $single, $meta_type ){

	if( 'views' === $meta_key && 'post' === $meta_type ){

		// if 00 show 10
		$value = (int) substr( $object_id, -2 ) ?: 10;
	}

	return $value;
}

#2 Подстановка дефолтного изображения

Этот код добавляет поддержку дефолтного изображения для сборов в плагине Лейка, если пользователь не загрузил своё.

Используется ACF, в котором админ указывает эти дефолтные картинки для каждого типа сбора (день рождения, спорт и так далее).

Код вырван из контекста и показывает лишь возможности фильтра.

  1. Фильтр default_post_metadata

    • Срабатывает при получении метаданных поста.
    • Проверяет, что запрашивается именно _thumbnail_id (ID изображения).
    • Убедившись, что пост относится к типу leyka_campaign, получает его категорию (тип сбора).
    • Возвращает ID дефолтного изображения, соответствующего этой категории.
  2. Функция get_campaign_default_image_id()
    • Получает список дефолтных изображений, заданных администратором в ACF (поле global_default_campaign_images).
    • Если для нужного типа (birthday, masterclass, sport, other) задано изображение — возвращает его ID.
    • Если нет — возвращает 0.

Таким образом, если у сбора нет собственного изображения, будет использовано дефолтное, заданное в настройках.

add_filter( "default_post_metadata", function ( $value, $post_id, $meta_key, $single ) {
	if ( $meta_key !== '_thumbnail_id' ) {
		return $value;
	}

	if ( 'leyka_campaign' !== get_post_type( $post_id ) ) {
		return $value;
	}

	$type = get_campaign_type( 'key', $post_id );

	return get_campaign_default_image_id( $type );
}, 10, 4 );

/**
 * Получает ID дефолтного изображения сбора.
 * Дефолтные фото для этого указываются в админке в настройках.
 *
 * @param string $type Тип изображения (может быть birthday, masterclass, sport, other).
 *
 * @return int
 */
function get_campaign_default_image_id( string $type ): int {
	$image_ids = get_field( 'global_default_campaign_images', 'option' );

	if ( ! empty( $image_ids[ $type ] ) ) {
		return absint( $image_ids[ $type ] );
	}

	return 0;
}

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

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

Где вызывается хук

get_metadata_default()
default_(meta_type)_metadata
wp-includes/meta.php 743
$value = apply_filters( "default_{$meta_type}_metadata", $value, $object_id, $meta_key, $single, $meta_type );

Где используется хук в WordPress

wp-includes/meta.php 1551
add_filter( "default_{$object_type}_metadata", 'filter_default_metadata', 10, 5 );