通过 API 删除 WooComerce 产品时也删除图像

问题描述 投票:0回答:1

我有一个通过 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 );
            }
        }
    }
}
php wordpress woocommerce product
1个回答
0
投票

在查看产品删除功能时,WooCommerce REST API 似乎使用 WordPress

wp_delete_post()
功能,因此
before_delete_post
似乎是正确的钩子。

尝试以下使用 WC_Product 方法的代码:

add_action( 'before_delete_post', 'delete_product_images_on_remove', 20, 1 );
function delete_product_images_on_remove( $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;
                $image_ids = array_unique($image_ids);
            }
        } elseif ( !$image_id && $gallery_ids ) {
            $image_ids = $gallery_ids;
        }

        if ( $image_ids ) {
            foreach ( $image_ids as $attachment_id ) {
                wp_delete_attachment( $attachment_id, true );
            }
        }
    }
}

它可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.