如何在删除WooCommerce产品图片时同步删除文件系统中的图片
WooCommerce产品编辑时删除图片同步永久删除媒体库文件
问题背景
- 店铺通过外部API导入产品,部分产品包含大量图片,需手动进入产品编辑页面删除多余图片
- 已实现删除产品时同步删除关联图片,但存在漏洞:例如某产品初始有15张图片,删除5张后上架半年再删除产品,仅剩下的10张图片会被删除,长期积累大量无用图片
需求目标
在WooCommerce产品页面通过图片旁的叉号删除图片时,同时将其从媒体库和服务器文件系统中永久删除
实现过程
曾尝试使用save_post、woocommerce_update_product、post_updated钩子,计划通过对比更新前后的产品图片ID数组,用array_diff()找出需删除的图片ID,再调用wp_delete_attachment($delete, $force_delete = true)删除,但无法获取更新前后的两组值。
后来发现woocommerce_update_product钩子会执行两次,于是借助全局变量存储前后值,最终实现可行代码:
add_action( 'woocommerce_update_product', 'action_save_product_data', 10, 2); function action_save_product_data( $post_id, $product ) { // 指定仅在产品类型下执行 if ( 'product' == get_post_type() ) { global $previous_product_id; global $before; if($previous_product_id === $post_id) { $after = wc_get_product( $post_id )->gallery_image_ids; } if($previous_product_id !== $post_id) { $before = wc_get_product( $post_id )->gallery_image_ids; } if($previous_product_id === $post_id) { $images_to_be_deleted = array_diff($before, $after); foreach($images_to_be_deleted as $delete) { wp_delete_attachment( $delete, $force_delete = true ); } } $previous_product_id = $post_id; } }
内容的提问来源于stack exchange,提问作者Michael Bragt
相关产品推荐
相关产品推荐

