Асинхронные поколения миниатюр WordPress только после сохранения сообщения ⇐ Php
-
Anonymous
Асинхронные поколения миниатюр WordPress только после сохранения сообщения
У меня есть сайт WordPress с WooCommerce, у каждого товара много изображений (10–15), а размер каждого исходного изображения составляет 1–2 МБ. эти размеры необходимы для целей данного раздела сайта.
Каждый раз, когда я создаю продукт, загрузка изображений занимает много времени (более 60 секунд), и это связано с тем, что для каждого изображения создаются миниатюры.
Моя идея заключалась в том, чтобы отключить генерацию миниатюр и запустить регенерацию в фоновом режиме после сохранения публикации. Таким образом, мне не придется ждать создания миниатюр для каждого сообщения.
Я считаю, что этот запрос может быть полезен многим другим людям, которые могут оказаться в аналогичной ситуации.
моей идеей было активировать регенерацию изображений через 5 секунд или сразу после завершения сохранения поста, я создал этот код, но с первой попытки он не работает:
// Расписание создания миниатюр после сохранения сообщения функция Schedule_thumbnail_generation ($ post_id) { // Устанавливаем временной интервал (в нашем случае 5 секунд) $delay_секунды = 5; // Вычисляем временную метку будущего события создания миниатюры $timestamp = time() + $delay_секунды; // Планируем событие с помощью WP-Cron wp_schedule_single_event ($ timestamp, 'generate_thumbnail_event', array ($ post_id)); } add_action('save_post', 'schedule_thumbnail_generation'); // Отключаем автоматическое создание миниатюр add_filter('intermediate_image_sizes_advanced', 'disable_thumbnail_generation'); функция отключена_thumbnail_generation($sizes) { вернуть массив(); } // Функция обратного вызова для создания миниатюр функцияgenerate_thumbnail_callback($post_id) { // Получаем все вложения к сообщению $attachments = get_posts(массив( 'post_type' => 'вложение', 'posts_per_page' => -1, 'post_parent' => $post_id, )); // Просматриваем вложения и генерируем миниатюры foreach ($attachments как $attachment) { $attachment_id = $attachment->ID; // Генерируем миниатюры для вложения $attachment_metadata = wp_generate_attachment_metadata($attachment_id, get_attached_file($attachment_id)); // Обновляем метаданные вложения вновь созданными миниатюрами wp_update_attachment_metadata ($attachment_id, $attachment_metadata); } } add_action('generate_thumbnail_event', 'generate_thumbnail_callback'); ОБНОВЛЕНИЕ: Решено добавлением этого кода в функциюgenerate_thumbnail_callback:
require_once(ABSPATH . 'wp-admin/includes/media.php'); require_once(ABSPATH. 'wp-admin/includes/file.php'); require_once(ABSPATH. 'wp-admin/includes/image.php');
У меня есть сайт WordPress с WooCommerce, у каждого товара много изображений (10–15), а размер каждого исходного изображения составляет 1–2 МБ. эти размеры необходимы для целей данного раздела сайта.
Каждый раз, когда я создаю продукт, загрузка изображений занимает много времени (более 60 секунд), и это связано с тем, что для каждого изображения создаются миниатюры.
Моя идея заключалась в том, чтобы отключить генерацию миниатюр и запустить регенерацию в фоновом режиме после сохранения публикации. Таким образом, мне не придется ждать создания миниатюр для каждого сообщения.
Я считаю, что этот запрос может быть полезен многим другим людям, которые могут оказаться в аналогичной ситуации.
моей идеей было активировать регенерацию изображений через 5 секунд или сразу после завершения сохранения поста, я создал этот код, но с первой попытки он не работает:
// Расписание создания миниатюр после сохранения сообщения функция Schedule_thumbnail_generation ($ post_id) { // Устанавливаем временной интервал (в нашем случае 5 секунд) $delay_секунды = 5; // Вычисляем временную метку будущего события создания миниатюры $timestamp = time() + $delay_секунды; // Планируем событие с помощью WP-Cron wp_schedule_single_event ($ timestamp, 'generate_thumbnail_event', array ($ post_id)); } add_action('save_post', 'schedule_thumbnail_generation'); // Отключаем автоматическое создание миниатюр add_filter('intermediate_image_sizes_advanced', 'disable_thumbnail_generation'); функция отключена_thumbnail_generation($sizes) { вернуть массив(); } // Функция обратного вызова для создания миниатюр функцияgenerate_thumbnail_callback($post_id) { // Получаем все вложения к сообщению $attachments = get_posts(массив( 'post_type' => 'вложение', 'posts_per_page' => -1, 'post_parent' => $post_id, )); // Просматриваем вложения и генерируем миниатюры foreach ($attachments как $attachment) { $attachment_id = $attachment->ID; // Генерируем миниатюры для вложения $attachment_metadata = wp_generate_attachment_metadata($attachment_id, get_attached_file($attachment_id)); // Обновляем метаданные вложения вновь созданными миниатюрами wp_update_attachment_metadata ($attachment_id, $attachment_metadata); } } add_action('generate_thumbnail_event', 'generate_thumbnail_callback'); ОБНОВЛЕНИЕ: Решено добавлением этого кода в функциюgenerate_thumbnail_callback:
require_once(ABSPATH . 'wp-admin/includes/media.php'); require_once(ABSPATH. 'wp-admin/includes/file.php'); require_once(ABSPATH. 'wp-admin/includes/image.php');
Мобильная версия