Attribuut-taxonomieën (WooCommerce): verschil tussen versies
Regel 39: | Regel 39: | ||
110 110 pa_breedte Breedte-taxon 0 0 | 110 110 pa_breedte Breedte-taxon 0 0 | ||
</pre> | </pre> | ||
+ | |||
+ | === wp_term_relationships == | ||
+ | |||
+ | Tabel <code>wp_term_relationships</code> verbindt taxons met WordPress-objecten. | ||
=== wp_termmeta === | === wp_termmeta === |
Versie van 29 mei 2019 18:37
WooCommerce's Attributes (Kenmerken) zijn een bijzondere variant van het algemene Categorie'-taxonomie-systeem. Ze komen in twee smaken:
- Predefined Attributes
- Custom Attributes.
Dit hoofdstuk gaat voornamelijk over deze eerste variant.
Database-model
wp_woocommerce_attribute_taxonomies
Tabel wp_woocommerce_attribute_taxonomies
bevat alleen beschrijvingen van de taxonomieën. Da's ca. hetzelfde als de 'hoofd-taxons'. Voorbeeld:
SELECT * FROM kbo3.wp_woocommerce_attribute_taxonomies; attribute_id attribute_name attribute_label attribute_type attribute_orderby attribute_public ------------ -------------- ----------------- -------------- ----------------- ---------------- 5 breedte Breedte text name_num 1 6 diepte Diepte text name_num 1 7 lengte Lengte text name_num 1 8 automatische_stop Automatische stop text name 1
wp_terms
Subtaxons verschijnen gewoon in wp_terms
. Dat maakt het gemakkelijk om met subtaxons te werken, want het werkt hetzelfde als voor gewone categorieën.
wp_term_taxonomy
Tabel wp_term_taxonomy
verbindt taxons met taxonomieën. Hier kun je zien dat WooCommerce 'onder water' losse taxonomieën defineert voor alle attributen. Je herkent ze aan de prefix pa_
. Merk op dat parent=0
: Er wordt niet gebruik gemaakt van hierarchie! Ook niet zo vreemd, omdat je bij attributen max. twee lagen hebt. Voorbeeld:
SELECT * FROM kbo3.wp_term_taxonomy where taxonomy like "pa_%"; term_taxonomy_id term_id taxonomy description parent count ---------------- ------- ---------- ------------- ------ ----- 110 110 pa_breedte Breedte-taxon 0 0
= wp_term_relationships
Tabel wp_term_relationships
verbindt taxons met WordPress-objecten.
wp_termmeta
Tabel wp_termmeta
lijkt metadata te bevatten: Als je nog iets extra's kwijt wilt over een taxon, kun je dat hier doen. WooCommerce maakt hier velden aan, om de count per hoofdtaxon in op te slaan.
Velden
Dit zijn de velden die ik zoal tegenkom. Ze zijn inconsistent en niet-intuïtief
Name - attribute_name
Shown on the front-end
Slug - attribute_label
Max. 28 karakters.
attribute_type
Het soort control dat gebruikt wordt als interface??? Bv.:
select
- Beperkt aantal keuzes, zoals een lookup-tabel of voor Boolese waardentext
- Tekstveld, lijkt me.
Enable Archives
Dus dat je een 'taxon-pagina' hebt. Altijd doen. Voor Attributes-taxonomieën kun je helaas geen afbeelding of tekst toevoegen (itt. gewone Categorieën) [1]
Custom ordering - attribute_orderby
Niet zo spannend:
menu_order
name
- etc.
attribute_public
Taxonomieën worden binnen een WordPress-site veelvuldig gebruikt voor interne aangelegenheden. Bv. om vertalingen bij te houden. Vandaar dat je er voor kunt kiezen om attribuut-taxonomieën verborgen te houden voor gebruikers.
Hoofdtaxon toevoegen
Nieuwe hoofdtaxons toevoegen, doe je mbv. wp_insert_term
. Aangezien Attributes een speciaal geval is van een categorie, zou je verwachten dat dit werkt. Maar dat doet het niet. Gelukkig kun je dit op een meer low-level fixen mbv. $wpdb
. Daar gebruik ik deze functies voor. Deze staat in één van m'n libraries (niet in functions.php
). Geïnspireerd op [2]:
function dvb_add_attribute_taxonomy($attribute) { # Add a WooCommerce Attribute-taxonomy ####################################################################################################### # # * Somehow, the usual function register_taxonomy doesn't work for WooCommerce Attributes, hence the # lower-level approach in this function # * Based on the example https://wordpress.stackexchange.com/questions/244335/creating-custom-woocommerce-attribute-taxonomies-from-a-plugin # * Jeroen Strompf, De Vliegende Brigade - April 2019 # * To be included in functions.php where appropriate ####################################################################################################### # Get acces to $wpdb class ####################################################################################################### # global $wpdb; ####################################################################################################### # Verify input ####################################################################################################### # if (empty($attribute['attribute_type'])) { $attribute['attribute_type'] = 'text';} if (empty($attribute['attribute_orderby'])) { $attribute['attribute_orderby'] = 'menu_order';} if (empty($attribute['attribute_public'])) { $attribute['attribute_public'] = 0;} if (empty( $attribute['attribute_name'] ) || empty( $attribute['attribute_label'] ) ) { return new WP_Error( 'error', __( 'Attribute name and/and slug is missing.', 'woocommerce' ) ); } elseif ( ( $valid_attribute_name = dvb_check_attribute_name( $attribute['attribute_name'] ) ) && is_wp_error( $valid_attribute_name ) ) { return $valid_attribute_name; } elseif ( taxonomy_exists( wc_attribute_taxonomy_name( $attribute['attribute_name'] ) ) ) { return new WP_Error( 'error', sprintf( __( 'Slug "%s" already in use', 'woocommerce' ), sanitize_title( $attribute['attribute_name'] ) ) ); } ####################################################################################################### # Insert into WordPress ####################################################################################################### # $wpdb->insert( $wpdb->prefix . 'woocommerce_attribute_taxonomies', $attribute ); do_action( 'woocommerce_attribute_added', $wpdb->insert_id, $attribute ); flush_rewrite_rules(); delete_transient( 'wc_attribute_taxonomies' ); return true; }; function dvb_check_attribute_name( $attribute_name ) { # Check if a given attribute name is valid ####################################################################################################### # # * Based on the example https://wordpress.stackexchange.com/questions/244335/creating-custom-woocommerce-attribute-taxonomies-from-a-plugin # * Jeroen Strompf, De Vliegende Brigade - April 2019 # * To be included in functions.php where appropriate if ( strlen( $attribute_name ) >= 28 ) { return new WP_Error( 'error', sprintf( __( 'Slug "%s" is longer than 28 characters)', 'woocommerce' ), sanitize_title( $attribute_name ) ) ); } elseif ( wc_check_if_attribute_name_is_reserved( $attribute_name ) ) { return new WP_Error( 'error', sprintf( __( 'Slug "%s" is not allowed because it is a reserved term.', 'woocommerce' ), sanitize_title( $attribute_name ) ) ); } return true; };
Voorbeeld van een aanroep:
<?php ############################################################### # Call require_once ############################################################### # # Functions "dvb_add_attribute_taxonomy" and # "dvb_check_attribute_name" have been included in functions.php. # They become available through this "require_once" command # require_once("/home/strompf/www/kbo3.dvb/wp-load.php"); ############################################################### # Define new attribute-taxonomy ############################################################### # $attribute_definition = array ( 'attribute_name' => 'attribute-naam (2)', 'attribute_label' => 'attribute-plakker (2)', 'attribute_type' => 'text', 'attribute_orderby' => 'menu_order', 'attribute_public' => false ); ############################################################### # Create this new attribute-taxonomy ############################################################### # dvb_add_attribute_taxonomy($attribute_definition);
Subtaxons toevoegen
- Attribuut-taxonomieën zijn niet-hiërarchisch, en zitten iets anders in elkaar dan product_cat-taxonomieën:
- Subtaxons toevoegen, gaat op dezelfde manier als voor product_cat-taxonomieën, met één verschil: De naam van de taxonomie, is de naam, voorafgegaan door
pa_
.
Voorbeeld uit een SQL-script, waarbij pa_breedte
de betreffende taxonomie is:
# Create table ############## # create table dim1_taxons_tmp select distinct dim1, concat ( "wp_insert_term('", replace(dim1, ".", ","),"'", ", 'pa_breedte',", " array('description' => 'Alle koolborstels met een breedte van ",replace(dim1, ".", ",")," mm',", " 'parent' => 0, 'slug' => 'breedte-",replace(dim1, "," ,""),"' ));" ) as dim1_php from root_tmp;
Je weet de 'pa-naam' pas met zekerheid, nadat er subtaxons zijn aangemaakt. Dan vind je 'm terug met zoiets als dit (in SQL):
SELECT distinct taxonomy FROM kbo3.wp_term_taxonomy;
Mochten er nog geen taxons zijn toegevoegd:
- Voeg er eentje handmatig toe, om het te testen
- Gebruik je gezond verstand om uit te vogelen wat de naam zou zijn.
Nog één voorbeeld:
<?php require_once("/var/www/kbo3.dvb/wp-load.php"); wp_insert_term ( 'Met automatische stop' , 'pa_automatische_stop', array ( 'description' => 'Alle koolborstels met automatische stop', 'parent' => 0, 'slug' => 'met-automatische-stop' ) ); wp_insert_term ( 'Zonder automatische stop' , 'pa_automatische_stop', array ( 'description' => 'Alle koolborstels zonder automatische stop', 'parent' => 0, 'slug' => 'zonder-automatische-stop' ) );
Verwijderen
Hoe kun je alle attribuut-taxonomieën compleet verwijderen? Dus inclusief hoofdtaxons, subtaxons, en koppelen met objecten? Voor een beetje serieuse site, is het geen optie om dit handmatig te doen, vandaar.
Ik kwam geen kant-en-klare code tegen, dus lekker zelf doen! De uitdaging is, om de onderdelen in de juiste volgorde te verwijderen, zodat je weet wat-wat is. Als ik bv. terms als laatste verwijder, is er een kans dat ik niet meer weet bij welke taxonomie ze horen.