我有一个通过 API 从 WooCommerce 创建和删除产品的日常流程。然而,当删除产品时,其关联的图像并没有被删除,从而导致大量未使用的图像。当产品被删除时,如何自动删除这些图像?
我在代码片段中尝试过使用此脚本,但没有成功。好像脚本没有被执行。
add_action( 'before_delete_post', 'delete_product_images_on_remove' );
function delete_product_images_on_remove( $post_id ) {
// Verifica si el post es un producto de WooCommerce
if ( get_post_type( $post_id ) === 'product' ) {
// Obtiene las imágenes de la galería de productos
$product_gallery_ids = get_post_meta( $post_id, '_product_image_gallery', true );
$product_gallery_ids = explode( ',', $product_gallery_ids );
// Obtiene la imagen destacada del producto
$featured_image_id = get_post_thumbnail_id( $post_id );
// Borra la imagen destacada si existe
if ( $featured_image_id ) {
wp_delete_attachment( $featured_image_id, true );
}
// Borra cada imagen de la galería
if ( is_array( $product_gallery_ids ) ) {
foreach ( $product_gallery_ids as $image_id ) {
wp_delete_attachment( $image_id, true );
}
}
}
}
在查看产品删除功能时,WooCommerce REST API 似乎使用 WordPress
wp_delete_post()
功能,因此 before_delete_post
似乎是正确的钩子。
尝试以下使用 WC_Product 方法的代码:
add_action( 'before_delete_post', 'remove_images_on_product_delete', 20, 1 );
function remove_images_on_product_delete( $product_id ) {
if ( in_array( get_post_type( $product_id ), ['product', 'product_variation'] ) ) {
$product = wc_get_product( $product_id ); // Get he product object
$image_id = $product->get_image_id(); // Get main image ID
$gallery_ids = $product->get_gallery_image_ids(); // Get gallery image IDS
$image_ids = array(); // Initialize
if ( $image_id ) {
if ( $gallery_ids ) {
$image_ids = array_merge( array($image_id), $gallery_ids );
} else {
$image_ids[] = $image_id;
}
} elseif ( !$image_id && $gallery_ids ) {
$image_ids = $gallery_ids;
}
if ( $image_ids ) {
$image_ids = array_unique($image_ids);
// Loop through image attachment IDs
foreach ( $image_ids as $attachment_id ) {
wp_delete_attachment( $attachment_id, true );
}
}
}
}
它可以工作。