默认woocommerce删除产品的时候,产品图片是不会被删除的。为了节省服务器空间,我们有时候希望在删除产品的时候也能同时把产品图片删除。
方法是在functions里添加如下代码:
// Automatically Delete Woocommerce Images After Deleting a Product
add_action( 'before_delete_post', 'delete_product_images', 10, 1 );
function delete_product_images( $post_id ) {
// Check if user has the capability to delete products
if ( !current_user_can( 'delete_products' ) ) {
return;
}
$product = wc_get_product( $post_id );
if ( !$product ) {
return;
}
$featured_image_id = $product->get_image_id();
$image_galleries_id = $product->get_gallery_image_ids();
if( !empty( $featured_image_id ) ) {
$is_featured_image_used = is_image_used( $featured_image_id, $post_id );
if ( !$is_featured_image_used ) {
wp_delete_attachment( $featured_image_id, true );
}
}
if( !empty( $image_galleries_id ) ) {
foreach( $image_galleries_id as $single_image_id ) {
$is_image_used = is_image_used( $single_image_id, $post_id );
if ( !$is_image_used ) {
wp_delete_attachment( $single_image_id, true );
}
}
}
}
function is_image_used( $image_id, $current_product_id ) {
$query = new WP_Query( array(
'post_type' => 'product',
'post_status' => 'publish',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => '_thumbnail_id',
'value' => $image_id,
'compare' => '='
),
array(
'key' => '_product_image_gallery',
'value' => '"'.$image_id.'"',
'compare' => 'LIKE'
)
),
'post__not_in' => array( $current_product_id ),
'fields' => 'ids',
'posts_per_page' => -1
) );
return ( $query->have_posts() );
}