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';

Працює на основі:
get_intermediate_image_sizes()

Повертає

Массив. Метадані вкладення.

Використання

wp_generate_attachment_metadata($attachment_id, $file);
$attachment_id
(число) (обов’язковий)
ID картинки-вкладення, метадані якої потрібно отримати.
$file
(рядок) (обов’язковий)
Повний шлях до оригіналу картинки-вкладення.

Приклади

0

#1 Демонстрація роботи

Допустимо, у нас є вкладення з ID 75 і картинка вже завантажена і знаходиться в папці uploads. Тепер давайте створимо всі її проміжні розміри:

$ id = 75;
$file = 'var/www/example.com/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
				(
				)

		)

)
0

#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 );

список змін

З версії 2.1.0Введено.

Код wp_generate_attachment_metadata() WP 6.0.2

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 інші 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' );
	}

	/*
	 * wp_read_video_metadata() and wp_read_audio_metadata() return `false`
	 * if the attachment does not exist in the local filesystem,
	 * So make sure to convert the value to an array.
	 */
	if (! is_array($metadata)) {
		$metadata = array();
	}

	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;
				case 'image/webp':
					$ext = '.webp';
					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 parameters for attachment thumbnail creation.
				 *
				 * @ Since 3.9.0
				 *
				 * @param array $image_attachment На array of parameters to create the thumbnail.
				 * @param array $metadata Current attachment metadata.
				 * @param array $uploaded {
				 * Інформація про нові-завантажений файл.
				 *
				 * @type string $file Filename of the newly-uploaded file.
				 * @type string $url URL з завантаженого файлу.
				 * @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 image sizes generated for non-image mime types.
		 *
		 * @ Since 4.7.0
		 *
		 * @param string[] $fallback_sizes На 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;
		}

		// Тільки load PDFs в 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 може мати той самий файл filename як JPEGs.
				 * Використовуйте PDF-перегляд зображення, що не завантажується будь-який JPEG зображення, що існує.
				 */
				$ 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, therther than the source.
				if ( ! is_wp_error( $uploaded ) ) {
					$image_file = $uploaded['path'];
					unset($uploaded['path']);

					$metadata['sizes'] = array(
						'full' => $uploaded,
					);

					// Зберегти metadata перед будь-яким зображенням 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 blob of binary data from the array.
	unset( $metadata['image']['data'] );

	// Capture file size for cases where it not been captured yet, such as PDFs.
	if ( ! isset( $metadata['filesize'] ) && file_exists( $file ) ) {
		$metadata['filesize'] = wp_filesize($file);
	}

	/**
	 * Filters 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' );
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *