我有一个网站,外部 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;
}
}
好吧,我让它工作了...一些聪明的全局值来记住第一次运行 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;
}
}