通过WooCommerce REST API v3删除产品时自动删除关联图片的问题咨询
通过WooCommerce REST API v3删除产品时自动删除关联图片的问题咨询
嘿,我来帮你捋捋这个问题!首先得戳中核心:你是通过REST API删除产品的,但你写的代码挂的是before_delete_post钩子——这个钩子只在WP后台手动删除产品或者用WP原生删除动作时才会触发,通过WooCommerce API删产品的话,这个钩子根本不会被调用,这就是代码没生效的原因!
那怎么适配API删除的场景呢?给你两个可行的解决方案:
方案一:监听WooCommerce API专属的产品删除钩子
WooCommerce REST API在删除产品时会触发woocommerce_rest_delete_product这个专属钩子,我们把图片删除逻辑挂到这个钩子上,API删产品时就能自动触发了。修改后的代码如下:
add_action( 'woocommerce_rest_delete_product', 'delete_product_images_on_api_remove', 10, 2 ); function delete_product_images_on_api_remove( $product, $request ) { $post_id = $product->get_id(); // 复用你原来的图片删除逻辑 // 获取产品图库图片ID $product_gallery_ids = get_post_meta( $post_id, '_product_image_gallery', true ); $product_gallery_ids = explode( ',', $product_gallery_ids ); // 获取特色图ID $featured_image_id = get_post_thumbnail_id( $post_id ); // 删除特色图 if ( $featured_image_id ) { wp_delete_attachment( $featured_image_id, true ); } // 删除图库图片(跳过空值避免报错) if ( is_array( $product_gallery_ids ) && !empty( $product_gallery_ids[0] ) ) { foreach ( $product_gallery_ids as $image_id ) { if ( $image_id ) { wp_delete_attachment( $image_id, true ); } } } }
要是你同时需要支持后台手动删除和API删除,可以把图片删除逻辑抽成公共函数,同时挂到两个钩子上:
// 公共图片删除逻辑 function delete_associated_product_images( $post_id ) { $product_gallery_ids = get_post_meta( $post_id, '_product_image_gallery', true ); $product_gallery_ids = explode( ',', $product_gallery_ids ); $featured_image_id = get_post_thumbnail_id( $post_id ); if ( $featured_image_id ) { wp_delete_attachment( $featured_image_id, true ); } if ( is_array( $product_gallery_ids ) && !empty( $product_gallery_ids[0] ) ) { foreach ( $product_gallery_ids as $image_id ) { if ( $image_id ) { wp_delete_attachment( $image_id, true ); } } } } // 后台手动删除时触发 add_action( 'before_delete_post', 'delete_product_images_on_manual_remove' ); function delete_product_images_on_manual_remove( $post_id ) { if ( get_post_type( $post_id ) === 'product' ) { delete_associated_product_images( $post_id ); } } // API删除时触发 add_action( 'woocommerce_rest_delete_product', 'delete_product_images_on_api_remove', 10, 2 ); function delete_product_images_on_api_remove( $product, $request ) { delete_associated_product_images( $product->get_id() ); }
额外要注意的细节
- 务必先备份!
wp_delete_attachment( $id, true )里的true参数会直接永久删除文件(不是移到回收站),测试前一定要在 staging 环境跑一遍,确认没问题再上生产! - 如果你用了图片优化、CDN类插件,要确认它们不会拦截
wp_delete_attachment的执行逻辑,避免删图不彻底。 - 代码片段插件要确保是激活状态,你原来的代码里的西班牙语注释不影响运行,但要保证整个代码段没有语法错误。
试试看上面的方案,应该就能解决API删产品不自动删图片的问题了!
备注:内容来源于stack exchange,提问作者JOrtega
相关产品推荐
相关产品推荐

