De mogelijkheid om metadata aan relaties tussen posts toe te voegen

De mogelijkheid om relaties tussen posts aan te brengen is de basis van de ORM die het Wpx framework aan WordPress toevoegt. Het principe is héél eenvoudig namelijk door aan een bepaalde post als metadata toe te voegen waarbij de meta_value naar het ID van een andere post verwijst als foreign key. De systematiek is even simpel als doeltreffend.

Op dit moment wordt de relatie tussen twee posts alleen bepaald door de verwijzing vanuit de metadata van één post naar een andere post. De relatie zelf, die met een bepaalde reden bestaat, is alles wat we weten over de relatie. Of te wel het feit dat er een relatie bestaat tussen bijvoorbeeld “company” en “hostingbase” betekent dat het de hostingbase van een bepaalde company is.

Wanneer we naar autorisaties kijken waarbij de “user” die eigenaar is van een bepaalde “company” post de daaraan gekoppelde “hostingbase” posts mag bewerken dan is het eenvoudig om te controleren of een bepaalde “user” geautoriseerd is. Stel echter dat de “company” gebruik maakt van een bepaald “datacenter” en ook daaraan gekoppeld is, dan is het mogelijk de “company” dat ruimte huurt als ook dat het zelf de eigenaar/exploitant ervan is.

Ook dit probleem is simpel en doeltreffend op te lossen. Je maakt namelijk een relatie aan voor huurders én de eigenaar. Het soort relatie vertelt dan of dat de bewuste “company” eigenaar of huurder is. Het enige serieuze nadeel hiervan is dat er twee aparte relaties zijn tussen de beide posts. Het al dan niet aanwezig zijn van één of beide relaties vertelt dan iets over de relatie.

Hetzelfde probleem als hierboven zou je kunnen hebben wanneer je gebruikers hebt met verschillende autorisaties. Het gaat dan om een user-post relatie al komt het verder op hetzelfde neer. Dan is het handig als je aan de relatie een bepaalde hoedanigheid of autorisaties kan toevoegen zodat meer fine-grained kan worden bepaald of een bepaalde “user” voor bepaalde zaken geautoriseerd is.

De uitdaging die ik zie is om het toevoegen van metadata aan relaties tussen posts én tussen posts en users toe te voegen met het enkele gebruik van de native mogelijkheden die WordPress biedt. Ik wil dus nadrukkelijk géén eigen tables aan de WordPress database toevoegen of code die om de WordPress Core API’s heengaat.

Het opslaan van de relatie tussen twee objecten (posts en/of users) is op twee plaatsen mogelijk: in de metadata van objecten (Metadata API) en in via de Options API. Het gebruik van de Metadata API betekent dat er altijd aan één bepaald object wordt gekoppeld. Daarnaast biedt de Metadata API ook de mogelijkheid om WP_Query en WP_Meta_Query te gebruiken. De Options API biedt enkel een héél simpele CRUD interface en koppelt data niet aan bepaald object.

De Options API is daarom vooral interessant wanneer er héél veel werk zelf wordt gedaan, waarbij ook SQL-statements zelf zullen moeten worden opgebouwd. Dat lijkt er daarom op neer te komen dat de WordPress Core API’s feitelijk toch worden omzeild en dan is het waarschijnlijk zelfs verstandiger om eigen tabellen aan de WordPress database toe te voegen.

Dan blijft de optie om gebruik te maken van de Metadata API. Hierbij wordt de metadata over de relatie aan een bepaalde post toegevoegd. Dat is in lijn met hoe de ORM van het Wpx framework werkt. De relatie zelf wordt immers ook gedefinieerd als een verwijzing vanuit de metadata vanuit één van de posts.

De vraag is daarom vooral hoe metadata over de relatie op te slaan in de metadata van een bepaalde post. Het meest eenvoudige is om één bepaalde meta key/value toe te voegen waarin alle data staat die is gedefinieerd. Dat is makkelijk te maken en alleen wanneer je met behulp van de WordPress Core API’s een query wilt uitvoeren op die data dan werkt dat niet of zijn er complexe (custom) SQL-statements nodig om dat te laten werken.

Daarom is mijn denkrichting om de relatie tussen posts in de metadata van de post die naar de andere posts verwijst op te op te slaan. Daarbij zou er voor elk individueel stuk metadata over de relatie zoveel mogelijk eigen meta key/value paren moeten worden gebruikt zodat die zo simpel en doeltreffend mogelijk kunnen worden gebruikt met WP_Query en WP_Meta_Query.

De complexiteit zal er voor in zitten om een dergelijke oplossing te bouwen. Dat is ook het idee achter een framework. Het framework moet de ontwikkeling op applicatieniveau vereenvoudigen en doet de “heavy lifting” voor de programmeur op applicatieniveau. Het is nu de kunst om daar oplossingen voor te vinden.