如何实现WordPress WooCommerce保存商品后异步生成缩略图?
解决WooCommerce商品缩略图生成耗时过长的异步处理方案
我有一个基于WordPress搭建的WooCommerce站点,每个商品需上传10-15张原始图片,单张大小为1-2MB,该尺寸符合站点所属行业需求。但每次创建商品时,图片上传后自动生成缩略图的过程耗时超60秒,等待时间过长,严重影响操作效率。
我计划禁用自动缩略图生成,改为在商品保存后通过后台异步任务执行缩略图再生操作,无需等待生成完成即可继续其他操作。我编写了相关代码,但首次测试时无法运行,后续通过在回调函数中添加指定文件引用解决了问题。
初始代码
// 安排文章保存后生成缩略图 function schedule_thumbnail_generation($post_id) { // 设置延迟时间(此处为5秒) $delay_seconds = 5; // 计算未来执行缩略图生成事件的时间戳 $timestamp = time() + $delay_seconds; // 使用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'); function disable_thumbnail_generation($sizes) { return array(); } // 缩略图生成回调函数 function generate_thumbnail_callback($post_id) { // 获取文章的所有附件 $attachments = get_posts(array( 'post_type' => 'attachment', 'posts_per_page' => -1, 'post_parent' => $post_id, )); // 遍历附件并生成缩略图 foreach ($attachments as $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');
修正后的完整回调函数如下:
// 缩略图生成回调函数 function generate_thumbnail_callback($post_id) { // 引入必要的WordPress后台文件 require_once(ABSPATH . 'wp-admin/includes/media.php'); require_once(ABSPATH . 'wp-admin/includes/file.php'); require_once(ABSPATH . 'wp-admin/includes/image.php'); // 获取文章的所有附件 $attachments = get_posts(array( 'post_type' => 'attachment', 'posts_per_page' => -1, 'post_parent' => $post_id, )); // 遍历附件并生成缩略图 foreach ($attachments as $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');
内容的提问来源于stack exchange,提问作者gassiopea
相关产品推荐
相关产品推荐

