wp_generate_attachment_metadata() WP 2.1.0
Генерирует метаданные для картинки-вложения и создает промежуточные копии изображения - миниатюры всех зарегистрированных размеров.
Промежуточные размеры указываются в «Настройках медиафайлов» (миниатюра, средний, большой), также они могут быть созданы функцией add_image_size() в теме или плагине.
Функция не обновляет метаданные вложения, а только создает их и все нужные размеры картинок. Обычно после работы функции, нужно еще обновить метаданные с помощью wp_update_attachment_metadata().
Функция обновляет метаполе записи _thumbnail_id
связанные с миниатюрой записи.
Эту функцию можно использовать, чтобы пересоздать миниатюру картинки-вложения и все её промежуточные размеры, после того, как размеры были изменены в «Настройках медиафайлов». Но эта функция не удаляет уже созданные промежуточные размеры, а создает новые в дополнении к имеющимся.
Миниатюра и промежуточные размеры картинки, и элемент массива ["sizes"] возвращается функцией, только в случае, когда создаваемый размер меньше оригинального размера картинки, в других случаях промежуточный размер просто не создается.
Функция не определена во фронт-энде, поэтому для использования, например, в шорткоде, вам нужно подключить её, добавив такую строку в код:
require ABSPATH . 'wp-admin/includes/image.php';
Возвращает
Разное. Метаданные вложения.
Использование
wp_generate_attachment_metadata( $attachment_id, $file );
- $attachment_id(число) (обязательный)
- ID картинки-вложения, метаданные которой нужно получить.
- $file(строка) (обязательный)
- Полный путь до оригинала картинки-вложения.
Примеры
#1 Демонстрация работы
Допустим у нас есть вложение с ID 75 и картинка уже загружена и находится в папке uploads. Теперь давайте создадим все её промежуточные размеры:
$id = 75;
$file = 'var/www/site.ru/wp-content/uploads/2016/06/wordpress1.jpg';
$metadata = wp_generate_attachment_metadata( $id, $file );
$metadata будет содержать такой массив:
Array
(
[width] => 574
[height] => 159
[file] => 2016/06/wordpress1.jpg
[sizes] => Array
(
[thumbnail] => Array
(
[file] => wordpress1-80x80.jpg
[width] => 80
[height] => 80
[mime-type] => image/jpeg
)
[medium] => Array
(
[file] => wordpress1-120x33.jpg
[width] => 120
[height] => 33
[mime-type] => image/jpeg
)
)
[image_meta] => Array
(
[aperture] => 0
[credit] =>
[camera] =>
=>
[created_timestamp] => 0
[copyright] =>
[focal_length] => 0
[iso] => 0
[shutter_speed] => 0
[title] =>
[orientation] => 0
[keywords] => Array
(
)
)
)
#2 Загрузим вложение на сервер и добавим его к записи.
Рабочий пример, показывает как можно загрузить картинку в папку uploads, прикрепить её к записи 37 и создать миниатюру и все промежуточные размеры этой картинки.
// файл должен находиться в директории загрузок WP.
$filename = '/path/to/uploads/2013/03/filname.jpg';
// ID поста, к которому прикрепим вложение.
$parent_post_id = 37;
// Проверим тип поста, который мы будем использовать в поле 'post_mime_type'.
$filetype = wp_check_filetype( basename( $filename ), null );
// Получим путь до директории загрузок.
$wp_upload_dir = wp_upload_dir();
// Подготовим массив с необходимыми данными для вложения.
$attachment = array(
'guid' => $wp_upload_dir['url'] . '/' . basename( $filename ),
'post_mime_type' => $filetype['type'],
'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ),
'post_content' => '',
'post_status' => 'inherit'
);
// Вставляем запись в базу данных.
$attach_id = wp_insert_attachment( $attachment, $filename, $parent_post_id );
// Подключим нужный файл, если он еще не подключен
// wp_generate_attachment_metadata() зависит от этого файла.
require_once( ABSPATH . 'wp-admin/includes/image.php' );
// Создадим метаданные для вложения и обновим запись в базе данных.
$attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
wp_update_attachment_metadata( $attach_id, $attach_data );
Список изменений
Код wp_generate_attachment_metadata() wp generate attachment metadata
WP 5.6
<?php
function wp_generate_attachment_metadata( $attachment_id, $file ) {
$attachment = get_post( $attachment_id );
$metadata = array();
$support = false;
$mime_type = get_post_mime_type( $attachment );
if ( preg_match( '!^image/!', $mime_type ) && file_is_displayable_image( $file ) ) {
// Make thumbnails and other intermediate sizes.
$metadata = wp_create_image_subsizes( $file, $attachment_id );
} elseif ( wp_attachment_is( 'video', $attachment ) ) {
$metadata = wp_read_video_metadata( $file );
$support = current_theme_supports( 'post-thumbnails', 'attachment:video' ) || post_type_supports( 'attachment:video', 'thumbnail' );
} elseif ( wp_attachment_is( 'audio', $attachment ) ) {
$metadata = wp_read_audio_metadata( $file );
$support = current_theme_supports( 'post-thumbnails', 'attachment:audio' ) || post_type_supports( 'attachment:audio', 'thumbnail' );
}
if ( $support && ! empty( $metadata['image']['data'] ) ) {
// Check for existing cover.
$hash = md5( $metadata['image']['data'] );
$posts = get_posts(
array(
'fields' => 'ids',
'post_type' => 'attachment',
'post_mime_type' => $metadata['image']['mime'],
'post_status' => 'inherit',
'posts_per_page' => 1,
'meta_key' => '_cover_hash',
'meta_value' => $hash,
)
);
$exists = reset( $posts );
if ( ! empty( $exists ) ) {
update_post_meta( $attachment_id, '_thumbnail_id', $exists );
} else {
$ext = '.jpg';
switch ( $metadata['image']['mime'] ) {
case 'image/gif':
$ext = '.gif';
break;
case 'image/png':
$ext = '.png';
break;
}
$basename = str_replace( '.', '-', wp_basename( $file ) ) . '-image' . $ext;
$uploaded = wp_upload_bits( $basename, '', $metadata['image']['data'] );
if ( false === $uploaded['error'] ) {
$image_attachment = array(
'post_mime_type' => $metadata['image']['mime'],
'post_type' => 'attachment',
'post_content' => '',
);
/**
* Filters the parameters for the attachment thumbnail creation.
*
* @since 3.9.0
*
* @param array $image_attachment An array of parameters to create the thumbnail.
* @param array $metadata Current attachment metadata.
* @param array $uploaded {
* Information about the newly-uploaded file.
*
* @type string $file Filename of the newly-uploaded file.
* @type string $url URL of the uploaded file.
* @type string $type File type.
* }
*/
$image_attachment = apply_filters( 'attachment_thumbnail_args', $image_attachment, $metadata, $uploaded );
$sub_attachment_id = wp_insert_attachment( $image_attachment, $uploaded['file'] );
add_post_meta( $sub_attachment_id, '_cover_hash', $hash );
$attach_data = wp_generate_attachment_metadata( $sub_attachment_id, $uploaded['file'] );
wp_update_attachment_metadata( $sub_attachment_id, $attach_data );
update_post_meta( $attachment_id, '_thumbnail_id', $sub_attachment_id );
}
}
} elseif ( 'application/pdf' === $mime_type ) {
// Try to create image thumbnails for PDFs.
$fallback_sizes = array(
'thumbnail',
'medium',
'large',
);
/**
* Filters the image sizes generated for non-image mime types.
*
* @since 4.7.0
*
* @param string[] $fallback_sizes An array of image size names.
* @param array $metadata Current attachment metadata.
*/
$fallback_sizes = apply_filters( 'fallback_intermediate_image_sizes', $fallback_sizes, $metadata );
$registered_sizes = wp_get_registered_image_subsizes();
$merged_sizes = array_intersect_key( $registered_sizes, array_flip( $fallback_sizes ) );
// Force thumbnails to be soft crops.
if ( isset( $merged_sizes['thumbnail'] ) && is_array( $merged_sizes['thumbnail'] ) ) {
$merged_sizes['thumbnail']['crop'] = false;
}
// Only load PDFs in an image editor if we're processing sizes.
if ( ! empty( $merged_sizes ) ) {
$editor = wp_get_image_editor( $file );
if ( ! is_wp_error( $editor ) ) { // No support for this type of file.
/*
* PDFs may have the same file filename as JPEGs.
* Ensure the PDF preview image does not overwrite any JPEG images that already exist.
*/
$dirname = dirname( $file ) . '/';
$ext = '.' . pathinfo( $file, PATHINFO_EXTENSION );
$preview_file = $dirname . wp_unique_filename( $dirname, wp_basename( $file, $ext ) . '-pdf.jpg' );
$uploaded = $editor->save( $preview_file, 'image/jpeg' );
unset( $editor );
// Resize based on the full size image, rather than the source.
if ( ! is_wp_error( $uploaded ) ) {
$image_file = $uploaded['path'];
unset( $uploaded['path'] );
$metadata['sizes'] = array(
'full' => $uploaded,
);
// Save the meta data before any image post-processing errors could happen.
wp_update_attachment_metadata( $attachment_id, $metadata );
// Create sub-sizes saving the image meta after each.
$metadata = _wp_make_subsizes( $merged_sizes, $image_file, $metadata, $attachment_id );
}
}
}
}
// Remove the blob of binary data from the array.
if ( $metadata ) {
unset( $metadata['image']['data'] );
}
/**
* Filters the generated attachment meta data.
*
* @since 2.1.0
* @since 5.3.0 The `$context` parameter was added.
*
* @param array $metadata An array of attachment meta data.
* @param int $attachment_id Current attachment ID.
* @param string $context Additional context. Can be 'create' when metadata was initially created for new attachment
* or 'update' when the metadata was updated.
*/
return apply_filters( 'wp_generate_attachment_metadata', $metadata, $attachment_id, 'create' );
}
Cвязанные функции