function woo_media_deduplicator_main() {
if (!current_user_can('manage_options') || !isset($_GET['preview_duplicates'])) {
return;
}
if (!class_exists('WooCommerce')) {
echo '
WooCommerce non è attivo.
';
return;
}
$filter_id = isset($_GET['product_filter']) ? intval($_GET['product_filter']) : null;
$delete_mode = isset($_GET['delete_duplicates']) && $filter_id;
$products = wc_get_products(['limit' => -1, 'status' => 'publish']);
$hash_map = [];
$to_delete = [];
foreach ($products as $product) {
$product_id = $product->get_id();
if ($filter_id && $product_id !== $filter_id) continue;
$thumbnail_id = get_post_thumbnail_id($product_id);
$gallery_ids = $product->get_gallery_image_ids();
foreach ($gallery_ids as $attachment_id) {
$file_path = get_attached_file($attachment_id);
if (!$file_path || !file_exists($file_path)) continue;
$hash = md5_file($file_path);
if (!isset($hash_map[$hash])) {
$hash_map[$hash] = [
'attachment_id' => $attachment_id,
'product_id' => $product_id,
'file' => $file_path,
];
} else {
if (
$attachment_id == $thumbnail_id ||
$attachment_id == $hash_map[$hash]['attachment_id']
) {
continue;
}
$to_delete[] = [
'product_id' => $product_id,
'duplicate_id' => $attachment_id,
'original_id' => $hash_map[$hash]['attachment_id'],
'file' => $file_path,
];
}
}
}
// Esegui cancellazione duplicati + pulizia gallery
if ($delete_mode) {
$deleted = 0;
foreach ($to_delete as $dup) {
wp_delete_attachment($dup['duplicate_id'], true);
$deleted++;
}
// Pulizia della gallery del prodotto (ID validi, no img in evidenza)
$product = wc_get_product($filter_id);
$thumbnail_id = get_post_thumbnail_id($filter_id);
$gallery_ids = $product->get_gallery_image_ids();
$valid_ids = [];
foreach ($gallery_ids as $aid) {
if ($aid != $thumbnail_id && get_post($aid)) {
$valid_ids[] = $aid;
}
}
update_post_meta($filter_id, '_product_image_gallery', implode(',', $valid_ids));
echo '✅ Eliminati ' . $deleted . ' media duplicati per il prodotto ID ' . $filter_id . '. Gallery aggiornata e immagine in evidenza rimossa dalla gallery.
';
return;
}
// Preview
echo 'Rilevate ' . count($to_delete) . ' immagini duplicate' . ($filter_id ? ' per il prodotto ID ' . $filter_id : '') . ' (nessuna cancellata):
';
if ($filter_id) {
$back_link = admin_url('admin.php?preview_duplicates=1');
$delete_link = admin_url('admin.php?preview_duplicates=1&product_filter=' . $filter_id . '&delete_duplicates=1');
echo '
← Torna a tutti i risultati
';
if (count($to_delete)) {
echo '
🗑 Elimina le immagini duplicate per questo prodotto
';
}
}
echo '
';
foreach ($to_delete as $dup) {
$product_link = admin_url('post.php?post=' . $dup['product_id'] . '&action=edit');
$filter_link = admin_url('admin.php?preview_duplicates=1&product_filter=' . $dup['product_id']);
echo '- ';
echo 'Prodotto ID: ' . $dup['product_id'] . ' ';
echo '(modifica) — ';
echo 'Duplicato ID:
' . $dup['duplicate_id'] . '
— ';
echo 'Originale ID: ' . $dup['original_id'] . '
— ';
echo 'File: ' . esc_html(basename($dup['file'])) . '
';
echo ' ';
}
echo '
';
}
%PDF-1.3
%쏢
5 0 obj
<>
stream
xm$yn*VKvW5rgʾ<}w?3#'Gˏ_=Qv'o-;KGvc >Rʲb6>/OnO^[,Sq2Y$XǺ7auu}6Bzp},uirvu]QbcI);X~n7zm))յFUqyۍ6b&6wWKY@pnXSUcdј8\=Be;zua5o>1n-fk՟nO|[瞼X]2&?&;Ä;C_;qfՒ,ϻES5'G9oKg2f[eZzyGsG|l鏞`}|/<=̇o_K~o4֗K/~`ܹc~eqc/. /8͛7^_|чn~NQQ*wqy*\ " w&;3Bp?ԏ]
Kpg-p *!wF; Όpg!3;""""""""""""22*^!*J"V엿+YU| sa^B.^r2swq/_ꃋ/ T>.OETd;b,"wGpg9ԗ]
pg@3"ܙLwf;=VZ#ZE582E5>H @X"Z$Y$kTe0, %kd-ER(e0pI$\. K%a0pI$\. <<<<<<<<<<<<<"""""""""""""22222````` ``)`9`I aD=#AQzFԃ0 aD=#AQzFԃ0 aD=#AQzFԃ0 aD=#AQzFԃ0 aD=#AQzFԃ0 aD=#AQzFԃ0 aD=#AQzFԃ0 aD=#AQzFԃ0 aD=#AQzFԃ0 aD=#AQzFԃ0 aD=#AQzFԃ0 aD=#AQzFԃ0 aD=#AQzFԃ0 aD=#AQzFԃ0 aD=#AQzFԃ0 aD=#AQzpLjzpLjzpLjzpLjzpLjzpLjzpLjzpLjzpLjzpLjzpLjzpLjzpLjzpLjzpLjzpLjzpLjzpLjzpLjzpLjzpLjzpLjzpLjzpQa/E=xמ++;]ߣ?w?x_}9e/]qyo~e7(Ûe0tçA|!>
O#ħ C}e(Oa4XO0|çA|!>
FOħ SGGEGEGEGEGEGEGEGEGEGEGEGEGEG%G%G%G%G%G%G%G%G%G%G%G%GeGeGeGeGeGeGeGeGeGeGeGeGeGGGGGGGGGGGGGy(oUu |
ap7QUħQ08GUZGy(o-O-ep: >epG Q(p@8J %G Q(ppppppppppp$gCr&<$gCr&<$gCr&<$gCr&<$gCr&<$gCr&<$gCr&<$gCr&<$gCr&<$gCr&<$gCr&<$gCr&<$gCr&<$gCr&<$gCr&<$g+LCQG~_<۽q(dߣ?"&og*v\䋏_|>po/P`"
VrDm'ĠDDDQw;Ѫ;h;1m'Ƭ=k+HNQ͉S
}RXzlЬ;N*P[ub@Nlh։u'j։:UY'
4N5VfUZ'
4NUVf*Ь?:Id!Vb+AuP:Iзb+Au`:JPZ$Qup:;JP_$Qw:JЬ5k^[ c'Av$h֎ڱoGڱY;v4kNfKзfIЬ[ c'Av%Qv$h֎щيoeᙏZjGK뿶?ykIYM˓ډvY-˔o\ܬ/r~e6Yno~a)^ordue},uÔlzK\Vpv:lQZ6Cs61Wq#ֵ]*\ZwivRY][.Pi6RIipv1XΛ
nkCRvnVo9z/u=s1QșR'Gy8n4NO5\iۈHí^~,S_o o`{zwo5qq{rVqŻ{7ۗM#?UO>nk7/o5Xm3ӿttcvy[s1XV逸Kʹ:|F}ރCMm
Kkt%z٧+Gf