Attribuut-taxonomieën verwijderen (WooCommerce)

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
Dit zijn de tabellen die veranderen als je een attribuut-taxonomie verwijderd (wp_options verandert altijd, zelfs als je niets doet, dus dat zegt weinig)

Hoe kun je alle attribuut-taxonomieën compleet verwijderen? Dus inclusief

  • Definities (aka. hoofdtaxons)
  • Taxons (aka. subtaxons)
  • Labeling.

Voor een beetje serieuse site, is het geen optie om dit handmatig te doen. Dit artikel gaat daarom over het automatisch verwijderen van attribuut-taxonomieën.

Taxons zijn vrij gemakkelijk te verwijderen, en de labeling kun je desgewenst negeren want het zit niet in de weg. Alleen verwijderen van definities, wil maar niet lukken. Daar gaat dit artikel voornamelijk over.

Taxons verwijderen

Dit script verwijdert alle WooCommerce-gerelateerde taxons, inclusief product_cat-taxons:

function dvb_delete_all_woocommerce_taxonomical_data()
{
	global $wpdb;

	###################################################################################
	# Delete all category & attribute taxons
	###################################################################################
	#
	# * This SQL script deletes taxons, not the taxonomies themselves
	# * It works at the db-level. It doesn't use any API calls (except for db-access)
	# * Is uses a temporary table "taxon_tmp" to hold intermediate results.
	#   As this is a temporary table, it doesn't need to be explicitly deleted
	#
	$sql_01 = "drop table if exists taxon_tmp;";
	$sql_02 = "create temporary table taxon_tmp select term_id from ".$wpdb->prefix."term_taxonomy where taxonomy like 'product_cat' or taxonomy like 'pa%';";
	$sql_03 = "delete ".$wpdb->prefix."termmeta from ".$wpdb->prefix."termmeta where meta_key like 'product_count_product_cat';";
	$sql_04 = "delete ".$wpdb->prefix."termmeta from ".$wpdb->prefix."termmeta join taxon_tmp on wp_termmeta.term_id = taxon_tmp.term_id;";
	$sql_05 = "delete ".$wpdb->prefix."term_relationships from ".$wpdb->prefix."term_relationships join taxon_tmp on ".$wpdb->prefix."term_relationships.term_taxonomy_id = taxon_tmp.term_id;";
	$sql_06 = "delete ".$wpdb->prefix."term_taxonomy from ".$wpdb->prefix."term_taxonomy where taxonomy like 'product_cat';";
	$sql_07 = "delete ".$wpdb->prefix."term_taxonomy from ".$wpdb->prefix."term_taxonomy where taxonomy like 'pa_%';";
	$sql_08 = "delete ".$wpdb->prefix."terms from ".$wpdb->prefix."terms join taxon_tmp on ".$wpdb->prefix."terms.term_id = taxon_tmp.term_id;";

	# Ready to go?
	######################################
	#
	// echo "\nsql_01: ".$sql_01;
	// echo "\nsql_02: ".$sql_02;
	// echo "\nsql_03: ".$sql_03;
	// echo "\nsql_04: ".$sql_04."\n";

	 
	try
	{
	    $wpdb->query($sql_01);
	    $wpdb->query($sql_02);
	    $wpdb->query($sql_03);
	    $wpdb->query($sql_04);
	    $wpdb->query($sql_05);
	    $wpdb->query($sql_06);
	    $wpdb->query($sql_07);
	    $wpdb->query($sql_08);	    
	}
	catch(Exception $e){}
}

Definities verwijderen

Soms lukt het ook niet meer via de interface

Op het moment dat ik erg m'n best heb gedaan om alles te verwijderen uit de db, wat ook maar in de buurt komt van de definities, staan ze nog steeds in de UI, maar ik kan ze ook niet meer handmatig verwijderen. Misschien dat dit alleen nog een gecachte versie is van de achterliggende gegevens?

Gaat het om de juiste volgorde?

Misschien is de crux, om onderdelen in de juiste volgorde te verwijderen. Een impressie:

select * from wp_term_relationships;		     # Taxons <-> Objecten - Vroeg verwijderen
select * from wp_termmeta;			     # Metadata <-> Taxons - Vroeg verwijderen
select * from wp_term_taxonomy;			     # Taxons <-> Taxonomy - Laat verwijderen
select * from wp_terms;				     # Taxons              - Laat verwijderen
select * from wp_woocommerce_attribute_taxonomies;   # Hoofdtaxons         - Als laatste verwijderen

Niet (alleen) wp_woocommerce_attribute_taxonomies?

De tabel wp_woocommerce_attribute_taxonomies lijkt niet te maken te hebben met deze attributen: Als ik de inhoud verwijder, verandert er niets:

Beschikbare attribuut-taxonomieëm - Voor en na verwijderen van wp_woocommerce_attribute_taxonomies
Tabel wp_woocommerce_attribute_taxonomies - Voor ik 'm verwijderde

Niet alleen wp_options - _transient_wc_attribute_taxonomies

select * from wp_options where option_value like "transient_wc_attribute_taxonomies"

geeft interessante data:

a:11:{i:0;O:8:"stdClass":6:{s:12:"attribute_id";s:2:"10";s:14:"attribute_name";s:8:"apparaat";s:15:"attribute_label";s:8:"Apparaat";s:14:"attribute_type";s:6:"select";s:17:"attribute_orderby";s:10:"menu_order";s:16:"attribute_public";s:1:"1";}i:1;O:8:"stdClass":6:{s:12:"attribute_id";s:1:"5";s:14:"attribute_name";s:17:"automatische_stop";s:15:"attribute_label";s:17:"Automatische stop";s:14:"attribute_type";s:6:"select";s:17:"attribute_orderby";s:10:"menu_order";s:16:"attribute_public";s:1:"1";}i:2;O:8:"stdClass":6:{s:12:"attribute_id";s:1:"1";s:14:"attribute_name";s:7:"breedte";s:15:"attribute_label";s:7:"Breedte";s:14:"attribute_type";s:4:"text";s:17:"attribute_orderby";s:10:"menu_order";s:16:"attribute_public";s:1:"1";}i:3;O:8:"stdClass":6:{s:12:"attribute_id";s:1:"7";s:14:"attribute_name";s:9:"connector";s:15:"attribute_label";s:9:"Connector";s:14:"attribute_type";s:6:"select";s:17:"attribute_orderby";s:10:"menu_order";s:16:"attribute_public";s:1:"1";}i:4;O:8:"stdClass":6:{s:12:"attribute_id";s:1:"4";s:14:"attribute_name";s:7:"diagram";s:15:"attribute_label";s:7:"Diagram";s:14:"attribute_type";s:4:"text";s:17:"attribute_orderby";s:10:"menu_order";s:16:"attribute_public";s:1:"1";}i:5;O:8:"stdClass":6:{s:12:"attribute_id";s:1:"2";s:14:"attribute_name";s:6:"diepte";s:15:"attribute_label";s:6:"Diepte";s:14:"attribute_type";s:4:"text";s:17:"attribute_orderby";s:10:"menu_order";s:16:"attribute_public";s:1:"1";}i:6;O:8:"stdClass":6:{s:12:"attribute_id";s:1:"3";s:14:"attribute_name";s:6:"lengte";s:15:"attribute_label";s:6:"Lengte";s:14:"attribute_type";s:4:"text";s:17:"attribute_orderby";s:10:"menu_order";s:16:"attribute_public";s:1:"1";}i:7;O:8:"stdClass":6:{s:12:"attribute_id";s:1:"9";s:14:"attribute_name";s:4:"merk";s:15:"attribute_label";s:4:"Merk";s:14:"attribute_type";s:6:"select";s:17:"attribute_orderby";s:10:"menu_order";s:16:"attribute_public";s:1:"1";}i:8;O:8:"stdClass":6:{s:12:"attribute_id";s:2:"11";s:14:"attribute_name";s:21:"originele koolborstel";s:15:"attribute_label";s:21:"Originele Koolborstel";s:14:"attribute_type";s:6:"select";s:17:"attribute_orderby";s:10:"menu_order";s:16:"attribute_public";s:1:"1";}i:9;O:8:"stdClass":6:{s:12:"attribute_id";s:1:"6";s:14:"attribute_name";s:11:"stroomdraad";s:15:"attribute_label";s:11:"Stroomdraad";s:14:"attribute_type";s:6:"select";s:17:"attribute_orderby";s:10:"menu_order";s:16:"attribute_public";s:1:"1";}i:10;O:8:"stdClass":6:{s:12:"attribute_id";s:1:"8";s:14:"attribute_name";s:4:"veer";s:15:"attribute_label";s:4:"Veer";s:14:"attribute_type";s:6:"select";s:17:"attribute_orderby";s:10:"menu_order";s:16:"attribute_public";s:1:"1";}}

maar ook alleen dit verwijderen, is niet de oplossing:

De waarde van het veld option_value verwijderd - De definities zijn verdwenen, maar WooCommerce is het er niet mee eens
Het hele record verwijderd - Da's beter. Dus zoiets als delete from wp_options where option_name like "_transient_wc_attribute_taxonomies";

In code, toegevoegd aan de code eerder in dit hoofdstuk:

	###################################################################################
	# Delete attribute-taxonomie-definities
	###################################################################################
	#
	$sql_01 = "delete from ".$wpdb->prefix."wp_options where option_name like '_transient_wc_attribute_taxonomies';";

	try
	{
	    $wpdb->query($sql_01);
	}
	catch(Exception $e){}

Zie ook