WC-CLI (WordPress)
WooCommerce heeft z'n eigen CLI-commando's (command line interface). Het ziet er veelbelovend uit (april 2019) en is onder andere geschikt om in bulk producten aan te maken. De uitdaging op dit moment: Gebrek aan documentatie tav. de preciese parameters en de formattering.
Tot en met WooCommerce 2.6, was de WooCommerce WP-CLI-layer (WC-CLI) een stand-alone project. Sinds WooCommerce 2.7, is de WC-CLI gebaseerd op de REST-API [1]. Soms is er geen aparte documentatie voor WP-CLI, en moet je het doen met de documentatie voor de REST-API. Op zich geen ramp.
Productimport - Simpel voorbeeld
#!/bin/bash # Simple import ########################################## # cd /var/www/rt_tmp.dvb wp wc product create \ --name="Widget-wiel 40x50x10" \ --description="Widget-wiel voor Smurf-systemen. Afmetingen: ..." \ --short_description="Widget-wiel met afmetingen 40x50x10 (mm) voor Smurf-systemen" \ --sku="wheel_40x050x10" \ --regular_price="7.5" \ --user="Jeroen Strompf" # --images="Widget-wiel-40x50x10-Smurf-wheel-rad.jpg"
Opmerkingen:
- Prijs met punt als decimaalscheidingsteken, ook al is Nederlands de standaardtaal voor deze taal
--user
was nodig: Anders autorisatie-foutmelding--images
gaf foutmeldingen- De slug wordt automatisch gegenereerd - Heel goed!
- Als ik het commando opnieuw uitvoer, krijg ik een foutmelding: Error: Ongeldige of dubbele SKU. {"status":400,"resource_id":1362}
Productimport & afbeeldingen
Hoe specificeer je afbeeldingen bij een product?
Dit werkt in ieder geval niet: --images="Widget-wiel-40x50x10-Smurf-wheel-rad.jpg"
. Uitleg (zonder verdere toelichting, helaas) [2]:
Images is an array in which element can be set by specifying its index: * images * images.size * images.0.id * images.0.created_at * images.0.updated_at * images.0.src * images.0.title * images.0.alt * images.0.position
Argumenten en syntaxis van de WC-CLI zijn afkomstig van de REST-API. Dit is wat de REST-API-documentatie omtrent images zegt [3]:
Attribute Type Description ----------------- --------- ----------------------------------------------------------------------- id integer Image ID. date_created date-time The date the image was created, in the site's timezone. READ-ONLY date_created_gmt date-time The date the image was created, as GMT. READ-ONLY date_modified date-time The date the image was last modified, in the site's timezone. READ-ONLY date_modified_gmt date-time The date the image was last modified, as GMT. READ-ONLY src string Image URL name string Image name alt string Image alternative text
Simpel voorbeeld
cd /var/www/rt_tmp.dvb wp wc product create \ --name="Widget-wiel 40x50x10" \ --description="Widget-wiel voor Smurf-systemen. Afmetingen: ..." \ --short_description="Widget-wiel met afmetingen 40x50x10 (mm) voor Smurf-systemen" \ --sku="wheel_40x050x10_5" \ --regular_price="7.5" \ --user="Jeroen Strompf" \ --images='[{"src": "http://demo.woothemes.com/woocommerce/wp-content/uploads/sites/56/2013/06/T_2_front.jpg"}]'
Meerdere afbeeldingen + inspringen
cd /var/www/rt_tmp.dvb wp wc product create \ --name="Widget-wiel 40x50x10" \ --description="Widget-wiel voor Smurf-systemen. Afmetingen: ..." \ --short_description="Widget-wiel met afmetingen 40x50x10 (mm) voor Smurf-systemen" \ --sku="wheel_40x050x10_11" \ --regular_price="7.5" \ --user="Jeroen Strompf" \ --images='[ { "src": "http://demo.woothemes.com/woocommerce/wp-content/uploads/sites/56/2013/06/T_2_front.jpg" }, { "src": "http://demo.woothemes.com/woocommerce/wp-content/uploads/sites/56/2013/06/T_2_back.jpg" }]'
- Attributen en waardes zijn gescheiden met een ":"
- Numerieke waardes hoeven niet binnen dubbele haakjes
- Records worden van elkaar gescheiden door { en } (en een komma)
- De array als geheel is omhuld door [ en ]
- De apostrophes rondom [ en ] kun je niet weglaten.
Extreem inspringen
Dit is ongeveer de limiet:
cd /var/www/rt_tmp.dvb wp wc product create \ --name="Widget-wiel 40x50x10" \ --description="Widget-wiel voor Smurf-systemen. Afmetingen: ..." \ --short_description="Widget-wiel met afmetingen 40x50x10 (mm) voor Smurf-systemen" \ --sku="wheel_40x050x10_14" \ --regular_price="7.5" \ --user="Jeroen Strompf" \ --images='[ { "src": "http://demo.woothemes.com/woocommerce/wp-content/uploads/sites/56/2013/06/T_2_front.jpg" }, { "src": "http://demo.woothemes.com/woocommerce/wp-content/uploads/sites/56/2013/06/T_2_back.jpg" } ]'
Meerdere attributen
cd /var/www/rt_tmp.dvb wp wc product create \ --name="Widget-wiel 40x50x10" \ --description="Widget-wiel voor Smurf-systemen. Afmetingen: ..." \ --short_description="Widget-wiel met afmetingen 40x50x10 (mm) voor Smurf-systemen" \ --sku="wheel_40x050x10_18" \ --regular_price="7.5" \ --user="Jeroen Strompf" \ --images='[ { "src": "http://demo.woothemes.com/woocommerce/wp-content/uploads/sites/56/2013/06/T_2_front.jpg", "name": "Voorkant van het t-shirt", "alt": "Voorkant van t-shirt met SKU 40x50_01, te koop op example.com" }, { "src": "http://demo.woothemes.com/woocommerce/wp-content/uploads/sites/56/2013/06/T_2_back.jpg", "name": "Achterkant van het t-shirt" } ]'
Als je de komma na zo'n eigenschap-waarde-paar weglaat, weet de interpreter niet meer waar zo'n paar begint of eindigt. Je krijgt geen foutmeldingen, maar ook geen afbeeldingen.
Afbeeldingen worden gedupliceerd
Als je zo'n script als hierboven opnieuw uitvoert, maar nu met een andere SKU, dan krijg je uiteraard een tweede product. Helaas wordt de afbeelding daarbij opnieuw geïmporteerd (met een numerieke suffix aan de naam). Da's geen enkel probleem: In de praktijk zak er heus wel iets andere zijn aan dat andere product, en daarom zal de titel van de afbeelding ook anders zijn (dus meer geoptimaliseerd!)
Producten in bulk verwijderen
- Verwijderen van producten gaat via
wp wc product delete
- Het verwijderen van gewone posts, gaat via
wp post delete
- De help-pagina van
wp post delete
heeft een interessant voorbeeld hoe je dit in bulk kunt doen:wp post delete $(wp post list --post_type='page' --format=ids)
- Vertaald naar
wp wc product delete
zou ik denken dat je zoiets krijgt:wp wc product delete $(wp wc product list --user="Jeroen Strompf" --format="ids")
- Helaas geeft dit een foutmelding - Dit werkt wel:
wp wc product delete 1399 --user="Jeroen Strompf"
- Dit werkt wel, als er nog maar 1 product over is:
wp wc product delete $(wp wc product list --user="Jeroen Strompf" --format="ids") --user="Jeroen Strompf"
Wordt vervolgd. Is typisch iets om een eigen script voor te schrijven.
Productimport & taal
Hoe specificeer je de taal waarin een object is geschreven bij import in meertalige websites? Waar zou je zoiets specificeren? Binnen de WC-CLI? Binnen de taalplugin-CLI? Ergens tussenin?
- Ik gebruik de CLI. Niet de REST-API
- De gebruikte taalplugin is Polylang (PLL) en Polylang for WooCommerce
- Polylang lijkt deze mogelijkheid alleen te bieden in Polylang Pro [4]. Dit is hoe je de taal zou specificeren: ‘lang’: contains the language code (generally 2 letter ISO code) of the queried post or term.. Ik heb de controle hierop verwijdert uit de module [5] (
wp-content/plugins/polylang/frontend/frontend.php
- regels 85-93), maar dit maakt geen verschil: Let op: Ik gebruik de CLI en niet de REST-API wp wc product create
heeft geen standaardveld voor taal. Wellicht dat deze opties kunnen helpen:
[--attributes=<attributes>] List of attributes. [--default_attributes=<default_attributes>] Defaults variation attributes.
- Iemand heeft een eigen CLI geschreven voor PLL: https://github.com/diggy/polylang-cli
Probeersel
Dit werkt helaas niet ("EN" ipv. "en" maakt ook niet uit). Producten worden nog steeds geïmporteerd in de standaardtaal:
#!/bin/bash cd /var/www/rt_tmp.dvb wp wc product create \ --sku="test-03" \ --user="Jeroen Strompf" \ --attributes='[{"lang": "en"}]'
Metadata
meta_data is een array [6]. Het veld heet meta_data
. Er is niet zoiets als 'product-meta-data':
Attribute Type Description --------- ------- ------ id integer Meta ID. READ-ONLY key string Meta key value string Meta value
Ik krijg het helaas nog niet aan de praat:
#!/bin/bash cd /var/www/rt_tmp.dvb wp wc product create \ --sku="test-05" \ --name="test-name" \ --description="Widget-wiel voor Smurf-systemen. Afmetingen: ..." \ --short_description="Widget-wiel met afmetingen 40x50x10 (mm) voor Smurf-systemen" \ --regular_price="7.5" \ --user="Jeroen Strompf" \ --images='[{ "src": "http://demo.woothemes.com/woocommerce/wp-content/uploads/sites/56/2013/06/T_2_front.jpg", "name": "Voorkant van het t-shirt", "alt": "Voorkant van t-shirt met SKU 40x50_01, te koop op example.com" }]' \ --meta_data='[ { "description": "Dit is de meta-data-description", "meta_description": "Dit is de meta-data-description", "keywords": "Dit zijn de keywords-metags", "seo_title" "SEO-titel" }]' \ --attributes='[ { "description": "Dit is de meta-data-description", "meta_description": "Dit is de meta-data-description", "keywords": "Dit zijn de keywords-metags", "seo_title" "SEO-titel" }]'
Ideeën
- Als ik kan exporteren, kan ik wellicht de velden zien
- Overstappen op REST-API, en niet meer met CLI werken
- https://stackoverflow.com/questions/43364143/yoast-seo-plugin-data-into-wp-rest-api-json
- https://developer.wordpress.org/rest-api/extending-the-rest-api/modifying-responses/
Zie ook
Bronnen
Algemeen
- https://github.com/woocommerce/woocommerce/wiki - WooCommerce Developer Wiki
- https://github.com/woocommerce/woocommerce/wiki/WC-CLI-Overview
- https://woocommerce.wordpress.com/2016/12/12/2-7-a-new-cli-for-woocommerce/
- https://woocommerce.github.io/woocommerce-rest-api-docs - REST-API-documentatie
- https://docs.woocommerce.com/wc-apidocs/index.html - WC-API-documentatie (dus de 'gewone' WC-API)
- https://docs.woocommerce.com/ - Gebruikers-documentatie
- https://github.com/woocommerce/woocommerce/wiki/Database-Description - Database-model
Images
- https://nicola.blog/2016/03/10/managing-products-woocommerce-cli/ - Inclusief voorbeelden. Hoopvol!
- https://github.com/woocommerce/woocommerce/wiki/Legacy-CLI-commands-(v2.6-and-below) - Goed overzicht van alle parameters. Ongeveer laatste kwart van de pagina. Uitleg is waardeloos
- https://github.com/woocommerce/woocommerce/issues/18964
- https://woocommerce.github.io/woocommerce-rest-api-docs/#create-a-product - DIT IS 'M! Hiermee kon ik de afbeeldingen uiteindelijk doen.
- https://woocommerce.github.io/woocommerce-rest-api-docs/#product-images-properties - Uitleg images-properties
Metadata
- https://www.w3schools.com/tags/tag_meta.asp
- https://stackoverflow.com/questions/47962893/create-a-product-with-custom-fields-via-woocommerce-rest-api