Wordpress Woocommerce 在产品中删除图像时如何从文件系统中删除图像

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

我有一个网站,外部 API 为我的 Woocommerce 商店获取产品,并且 API 发送了某些产品的许多图像,因此我手动进入产品帖子并删除其中一些图像。

如何实现,当我这样做时,这些图像将从媒体库和文件夹中删除?

我已经想好了如何在删除产品时删除它们...

问题是,例如,我会创建一个具有 15 个图像的产品,然后删除其中 5 个,将该产品在我的商店中放置半年,然后删除该产品,但只有 10 个图像仍然链接到该产品被删除,随着时间的推移,我最终会拥有许多未使用的图像......

那么当我通过 Woocommerce 中的产品页面删除图像时,如何永久删除图像..(图像上的小十字)

希望这是有道理的:-)

更新: 我所研究的是获取产品图片库id

尝试

add_action ('save_post', 'my_function')
add_action ('woocommerce_update_product', 'my_function')
add_action ('post_updated', 'my_function')

我的推理是在更新之前和更新之后从图像库中获取一系列产品图像 ID,然后对这些图像执行

array_diff()
,然后执行
wp_delete_attachment( $delete, $force_delete = true );
在这些上,我已经获得了图片库 ID,但似乎无法同时拥有旧值和新值。

工作

在某处读到挂钩 woocommerce_update_product 实际上运行了两次,所以受到另一篇聪明的小帖子的启发,我使用全局值来存储之前和之后的值:-)

    add_action( 'woocommerce_update_product', 'action_save_product_data', 10, 2);
    function action_save_product_data( $post_id, $product ) {
         
       // Specify the post type on which to run
       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) {
             null;
           }
          else {
             $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;
          }
    }
wordpress image woocommerce product
1个回答
0
投票

好吧,我让它工作了...一些聪明的全局值来记住第一次运行 woocommerce_update_product 时的值,因为在其他地方了解到它实际上运行了两次...

这是我要工作的代码:-)

add_action( 'woocommerce_update_product', 'action_save_product_data', 10, 2); 函数 action_save_product_data( $post_id, $product ) {

   // Specify the post type on which to run
   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) {
         null;
       }
      else {
         $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;
      }
}
© www.soinside.com 2019 - 2024. All rights reserved.