Wp delete attachment (PHP-API)

Uit De Vliegende Brigade
Ga naar: navigatie, zoeken

Vermoedelijk is dit de standaard-routine om attachments te verwijderen. De officiële documentatie [1] is mij niet helemaal duidelijk:

When an attachment is permanently deleted, the file will also be removed. Deletion removes all 
post meta fields, taxonomy, comments, etc. associated with the attachment (except the main post).

The attachment is moved to the Trash instead of permanently deleted unless Trash for media is 
disabled, item is already in the Trash, or $force_delete is true.

Wat ik dankzij de voorbeelden/tests hieronder heb achterhaald:

  • Dit commando heeft niets met WooCommerce-producten te maken. Het opereert uitsluitend op attachments (afbeeldingen in mijn geval). De acties van dit commando hebben daarom ook niets met WooCommerce-producten te maken
  • Wat dit commando doet: Alsof je zelf in de media-bibliotheek bestanden verwijderd (en die tevens op een nette manier verwijderd van de posts of objecten waarmee deze zijn geassocieerd)
  • Als je $force_delete = True meegeeft, worden de bestanden verwijderd. Anders blijven ze behouden
  • Ik weet niet wat er bedoeld wordt met de uitleg (except the main post)

Voorbeeld (1)

Voor een bestaand product gebruik ik wp_attachment_delete om de bijbehorende thumbnail-afbeelding weg te toveren.

Oude situatie

Product met post-ID 13198 met een thumbnail-afbeelding en een gallerij-afbeelding
Verrassend: Ik kan het post-ID van de afbeelding/attachment niet achterhalen door op de afbeelding te klikken. Omgekeerd kan ik in de media-bibliotheek deze afbeelding ook niet terugvinden aan de hand van het product-post-id
Ahh: Ik kan de afbeeldingen/attachments terugvinden op product-SKU in de media-bibliotheek. De eerste afbeelding is de thumbnail-afbeelding. De tweede afbeelding is de gallerij-afbeelding. Post-ID van de thumbnail-afbeelding: 39019

Code

<?php
#
# Test wp_delete_attachment()
################################################################################
#
$site_path = "/var/www/knl.s1";
require_once($site_path . "/wp-load.php");

wp_delete_attachment(39019);

Nieuwe situatie

Media-bibliotheek: Attachment is verdwenen. Dit is dezelfde pagina als in de oude situatie. Na executie van de code heb ik de pagina ververst
Hmm, de afbeelding staat er nog steeds. Heeft misschien met transients of met regenerate (of hoe dat ook al weer heette) te maken
Transients verwijderd & regenerate toegepast (ook al voelde dat niet logisch), maar de afbeelding is er nog steeds
Media-bibliotheek: Als ik zoek op SKU, krijg ik nu nog maar één regel - Terecht: de gallerij-afbeelding is nog over
Het raadsel opgelost: De gallerij-afbeelding is nu thumbnail-afbeelding geworden (of ik heb me ergens vergist)!
Bestand zijn niet verwijderd. Waarschijnlijk logisch, want de afbeelding is niet verwijderd maar verhuisd naar de prullenbak. Deze truuk om de trash-button zichtmaar te maken binnen de media-bibliotheek werkte niet. Sois

Voorbeeld (2)

  • Nu zowel de thumbnail- als gallerij-afbeelding van een product verwijderen
  • Direct verwijderen - Zonder prullenpak.

Oude situatie

Dit wordt 'm: Product met SKU ca-m-408, sku-vermeld-in-de-titel 27919 en post-ID 53499 met een thumbnail-afbeelding en maar liefst drie gallerij-afbeeldingen
Ik kan de attachment-ID's niet achterhalen via de interface. Gelukkig lukt dat wel in SQL: 54858, 54859, 54860 & 54861
Alle afbeelding-bestanden

Code om de afbeeling-ID's te achterhalen:

use knl_s1;

select
   wp_posts.ID		 as product_id,
   wp_posts.post_title   as product_title,
   wp_postmeta.*
from 
   wp_postmeta
join 
   wp_posts 
   on 
   wp_postmeta.post_id = wp_posts.ID 
where 
   wp_posts.post_type like 'product'
   and
   wp_posts.post_title like "%27919%"
   and
   (
      wp_postmeta.meta_key like '_thumbnail_id'
      or
      wp_postmeta.meta_key like '_product_image_gallery'
   )

Code

<?php
#
# Test wp_delete_attachment()
################################################################################
#
# * Both thumbnail & gallery images
# * Sidepass trash
# * Image file: http://knl.s1/wp-content/uploads/2020/09/4956_logo_01.jpg
# * First gallery file: http://knl.s1/wp-content/uploads/2020/09/4956_logo_02.jpg
#
$site_path = "/var/www/knl.s1";
require_once($site_path . "/wp-load.php");

wp_delete_attachment(54858, True);
wp_delete_attachment(54859, True);
wp_delete_attachment(54860, True);
wp_delete_attachment(54861, True);

Nieuwe situatie

Alle afbeeldingen zijn verdwenen van de productbewerkpagina
De bestanden zijn verwijderd, op twee na. Daar zal wel een reden voor zijn - Ga ik me nu niet druk om maken
De database-query laat zien dat de afbeeldingen écht verdwenen zijn. Het veld meta_value is namelijk leeg

Bronnen