Automatisering (WordPress)

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen

Processen die ik vaak doorloop, automatiseer ik graag. Dat maakt die processen herhaalbaar, verifiëerbaar, optimaliseerbaar en schaalbaar. Rondom WordPress zijn er twee specifieke gevallen waarop ik automatisering toepas:

In dit artikel worden plugins buiten beschouwing gelaten: Ik vind ze vaak te beperkt of te onhandig.

Wat ik zoal wil automatiseren

Ik wil graag de volgende objecten in WordPress in bulk importeren en aan elkaar koppelen.

Productgegevens importeren

Hoe kan ik WooCommerce Productgegevens in bulk importeren? En dan zo compleet mogelijk, inclusief bv. taal.

Afbeeldingen importeren

Gewoon de afbeeldingen

Afbeelding-metadata importeren

Als het gaat om optimalisatie van productgegevens, dan speelt optimalisatie van afbeelding-metadata een belangrijke rol. Zie de afbeelding hiernaast voor een overzicht van de betreffende velden. Dit wil ik heel graag automatisch kunnen importeren. De afbeeldingen zelf, kan ik desgewenst handmatig doen, zolang de koppeling met de metadata min-of-meer automatisch gaat.

Afbeeldingen & producten koppelen

Dit betreft twee casussen:

  • Primaire product-afbeelding → PHP-API: set_post_thumbnail
  • Gallery-afbeeldingen.

Taxonomieën importeren

Dit geldt voor zowel de taxonomie-definitie (wat vaak hetzelfde is als het hoofd-taxon) als voor de (sub)-taxons:

  • Product_cat-catalog-taxonomieën
  • Product-attribute-taxonomieën
  • Generieke catalog-taxonomieën
  • tags?

Taxonomieën & producten koppelen

Posts importeren

Met posts bedoel ik hier 'gewone' pagina's. In de zomer van 2019 heb ik voor het eerst in een site zo'n 200 pagina's automatisch geïmporteerd. Dat betrof een site met js_composer & Hoshi - Om het nog wat complexer te maken.

Zie Posts importeren (WordPress).

API's

Naast plugins (die ik hier buiten beschouwing laat) zijn er verrassend veel mogelijkheden:

  • PHP-API
  • WP-CLI
  • $wpdb-klasse
  • REST-API
  • XML-RPC

Deze worden in de volgende hoofdstukken behandeld.

Shortlist (begin april 2019)

  1. REST-API
  2. WP-CLI
  3. Db.bulk

Shortlist (16 april 2019)

  1. PHP-API - Goede kans dat dit mijn standaard-aanpak wordt: Efficiënt + redelijk veel controle
  2. Db.bulk - Altijd handig als uitweikmogelijkheid: Veel controle + in-efficiënt
  3. WP-CLI - Alleen voor incidenteel gebruik.

Shortlist (mei 2019)

  1. PHP-API - Als het ergens mee kan, is het met de gebruikelije PHP-API. Daarnaast blijkt dit verbazend eenvoudig te zijn
  2. Overstappen op Django (of een ander python-framework) - Wat ik zoek is namelijk een framework en niet een CMS. Om dit met WordPress te doen, is eigenlijk het paard achter de wagen spannen.

PHP-API

WordPress is geschreven in PHP, en alle functionaliteit is ondergebracht in een verzameling API's. Dit is waartegen je programmeert als je bv. een plugin schrijft. Waarschijnlijk is dit de krachtigste methode om WordPress naar je hand te zetten. Er bestaan een paar Python-wrappers zodat je sommige API's via Python kunt benaderen, maar in de praktijk moet je het gewoon in PHP doen. Dat kan zowel in de vorm als plugins, maar ook in de vorm van losse scripts. Tot op heden (april 2019) gebruik ik deze laatste mogelijkheid.

Een impressie van de API's die tezamen de WordPress API vormen:

  • Dashboard Widgets API
  • Database API: Bestaand uit drie API's, niet te verwarren met de $wpdb-klasse
  • HTTP API
  • File Header API
  • Filesystem API
  • Metadata API
  • Options API
  • Plugin API
  • Quicktags API
  • Rewrite API
  • Settings API
  • Shortcode API
  • Theme Modification API
  • Theme Customization API
  • Transients API
  • Widgets API

Na enige experimenten met de overige automatiseringsmogelijkheden, leek de PHP-API de beste kandidaat om dingen te automatiseren (april 2019).

Algemeen

Zie PHP-API (WordPress)

Afbeeldingen

Zie Afbeeldingen & API's (WordPress).

Productgegevens

Zie WooCommerce Producten & PHP-API - Komt nog!

Taxonomieën

Zie Taxonomieën (WordPress)

$wpdb

Onderdeel van PHP-API is de klasse $wpdb. Hiermee kun je op een 'lager niveau' interacteren met de database, dan middelde gebruikelijke API-calls. Zie Taxonomieën (WordPress) voor een voorbeeld.

Db.bulk

Ik vind het altijd aanlokkelijk om automatiseringsproblemen op te lossen door zelf iets te programmeren op db-niveau, omdat ik dan controle heb. Keer op keer stuit ik echter op een paar flinke problemen:

  • Complex & tijdrovend: Reverse-engineeren van het datamodel kost veel tijd. Programmeren kost al snel veel tijd, vooral als je te maken krijgt met subrecords, en dat is vaak nogal snel
  • Niet-robuust: Op deze manier ga ik voorbij aan de API met alle checks en controles van dien. Een kleine fout, en ik richt een ravage aan. En als WordPress of een relevante plugin iets verandert aan het datamodel, is dat ook tricky.

En toch: Nadat ik me zo'n 10 uur in REST-API heb verdiept, wordt deze optie alweer een stuk aantrekkelijk: Want ik heb ten minste controle: Ik weet zeker dat ik het voor elkaar kan krijgen. Met andere manieren moet ik me nogal aanpassen aan de interface, en dat kost veel tijd.

Db.bulk (WordPress)

REST-API

De WordPress REST-API gebruikt JSON en is taalonafhankelijk. Het is bedoeld voor interactie met een site over HTTP. De REST-API is om meerdere redenen een interessante optie:

  • Compleet: Ik heb de indruk dat deze API 'compleet' is. Oftewel: Je kunt er 'alles' mee bepalen rondom WordPress Core. Hetzelfde geldt voor WooCommerce. Vermoedelijk zijn er zat plugins die niet gedekt worden door de REST-API, maar dat is van minder belang
  • Python: Taalonafhankelijk, dus ik kan vanuit Python werken.

Belangrijkste nadelen:

  • Remote: Dit protocol gaat over HTTP en vereist authenticatie. Ook voor een locale ontwikkelsite (wat bedoel ik hiermee???)
  • Leercurve: Het kost vrij veel tijd om dit goed onder de knie te krijgen. Bv. achterhalen van de beschikbare opties in commando's. Ander voorbeeld: Ik moet JSON (enigszins) leren
  • Documentatie? Misschien een beginnersfout, maar ik kan geen goede documentatie vinden.

WordPress REST-API

XML-RPC

WordPress beschikt over een XML-RPC-interface, een taal-onafhankelijke API. Er bestaan clients in verschillende talen, waaronder Python. In theorie kan ik op deze manier vanuit Python gebruik maken van de API, maar in de praktijk valt dit tegen: De mogelijkheden van de 'core-API' zijn beperkt, en de beschikbaarheid van XML-RPC-API's voor andere plugins (bv. WooCommerce), is beperkt.

XML-RPC, WordPress & Python

WP-CLI

WordPress heeft een eigen CLI (command line interface), waar je verbazend veel mee kunt (maar niet alles!). Diverse plugins hebben hun eigen uitbreiding op de CLI.

Mogelijkheden voor bulkimport

  • Posts: Weet ik niet
  • Afbeelding-metadata: Het lijkt erop (april 2019) dat de WP-CLI meerdere oplossingen heeft voor metadata van afbeeldingenWp media import (WP-CLI) & WC-CLI (WordPress)
  • Productgegevens: Het lijkt erop (april 2019) dat WooCommerce' eigen CLI (WC-CLI) goed productgegevens kan importeren, inclusief afbeeldingen en bijbehorende metadata. Het integreert ook goed met mijn bestaande werkwijze, itt. gebruik van plugins → WC-CLI (WordPress)

Voordelen

  • Eenvoudig
  • Vanuit Bash-scripts, en dat is een manier van werken die ik al jaren hanteer.

Nadelen

  • Niet compleet: Het lijkt z'n beperkingen te hebben
  • Incomplete documentatie: De documentatie voor WC-CLI (WooCommerce-CLI) lijkt nogal beperkt te zijn

Zie ook

Bronnen

Python & WordPress API

XML-RPC