🎯 Gefeliciteerd: Je WordPress-plugin is zojuist een "core"-functie geworden
Omdat de WP REST API al is opgenomen in WordPress core, heb ik vaak aangeraden om GraphQL te vermijden en gewoon de REST API te gebruiken om data te leveren aan onze WordPress-plugins en Gutenberg-blokken.
Dat is nu voorbij. WordPress 6.5 is zojuist uitgebracht, inclusief een geweldige nieuwe functie: Plugin Dependencies.
Met Plugin Dependencies kan elke WordPress-plugin die beschikbaar is in de plugindirectory worden gedefinieerd als een afhankelijkheid voor onze plugin, en WordPress installeert die afhankelijkheid vlak voordat onze plugin wordt geïnstalleerd.
Als gevolg hiervan wordt elke plugin in de directory in wezen een "core"-functie, omdat deze impliciet wordt geïnstalleerd wanneer een andere plugin er om vraagt.
Sommige toepassingen zijn zowel voor de hand liggend als niet echt nodig, zoals een WooCommerce-add-on die een afhankelijkheid van WooCommerce declareert, aangezien de website-eigenaar WooCommerce vrijwel zeker al gebruikt.
Maar wanneer de vereiste plugin "tooling" biedt voor een andere plugin, en we niet kunnen verwachten dat de website-eigenaar die plugin al geïnstalleerd heeft (of zelfs maar van het bestaan ervan weet), kan het resultaat echt ingrijpend zijn.
Dat is het geval met GraphQL en Gato GraphQL.
GraphQL wordt een "core"-functie in WordPress
GraphQL is een interface om willekeurige data van de WordPress-site op te halen, te wijzigen en opnieuw op te slaan. Elke plugin die met data moet werken (en vrijwel alle doen dat) kan potentieel GraphQL gebruiken om in zijn behoeften te voorzien.
GraphQL is "tooling". En Gato GraphQL is de tooling-provider.
Door je plugin een afhankelijkheid van Gato GraphQL te laten declareren, is de GraphQL-server onmiddellijk beschikbaar voor gebruik door jouw plugin.
Je kunt GraphQL dan bijvoorbeeld gebruiken om data op te halen voor de Gutenberg-blokken van je plugin, en zo het aanmaken (en onderhouden) van REST-controllers vermijden.
Voor het eerst kunnen plugin-ontwikkelaars GraphQL nu beschouwen als een echt alternatief voor de WP REST API.
Kan de plugin-afhankelijkheid een probleem worden?
Omdat de plugin die als afhankelijkheid wordt geïnstalleerd zichtbaar wordt in het wp-admin, kan de onwetende website-eigenaar terecht afvragen: "Waar komt dat vandaan? Ben ik gehackt? Is dit spam? Wat is hier aan de hand?"
Als de website-eigenaar geïrriteerd zou raken, is dat zorgwekkend, want geen enkele plugin kan het zich veroorloven zijn gebruikers van zich te vervreemden (althans niet totdat ze begrijpen wat er aan de hand is en de oplossing verwelkomen).
Deze situatie kan ook worden verbeterd, en zelfs volledig worden vermeden. Als we Gato GraphQL als plugin-afhankelijkheid nemen, zou Gato GraphQL ook een Lite-versie kunnen hebben die simpelweg een GraphQL-server installeert voor intern gebruik, niet zichtbaar via de UI. (Nog een taak voor mijn to-do-lijst! 🤷🏻♂️)
Een belangrijkere vraag voor Gato GraphQL (en ook andere plugins) is: Zou de nieuwe site minder veilig worden?
Specifiek voor Gato GraphQL: Zal een publiek GraphQL-endpoint data blootstellen die elke bezoeker kan raadplegen, en die onbedoeld privégegevens kan onthullen?
Het antwoord is nee. Gato GraphQL schakelt standaard het publieke single endpoint niet in, zodat het geïnstalleerd kan worden zonder vrees voor beveiligingsrisico's.
Gato GraphQL toevoegen als plugin-afhankelijkheid
Laten we aan de slag gaan en spelen met deze geweldige nieuwe functie.
Om GraphQL in je plugin te kunnen gebruiken, moet je gatographql declareren als plugin-afhankelijkheid in de plugin-header:
/**
* Plugin Name: Blocks for cooking recipes
* Requires Plugins: gatographql
*/Je plugin kan dan data ophalen via het interne blockEditor-endpoint, beschikbaar via de JavaScript-constante GATOGRAPHQL_BLOCK_EDITOR_ADMIN_ENDPOINT in het wp-admin, die verwijst naar deze URL:
https://mysite.com/wp-admin/edit.php?page=gatographql&action=run_query&endpoint_group=blockEditorHet blok kan bijvoorbeeld data ophalen met JavaScript-code zoals deze:
(async function () {
const data = {
query: `
query GetCookingRecipeBlockData($limit: Int) {
posts(pagination: { limit: $limit }) {
id
title
author {
id
name
}
}
}
`,
variables: {
limit: 3
},
};
const response = await fetch(
GATOGRAPHQL_BLOCK_EDITOR_ADMIN_ENDPOINT,
{
method: 'post',
body: JSON.stringify(data),
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
'Content-Length': data.length,
},
credentials: 'include',
}
);
/**
* Execute the query, and await the response
*/
const json = await response.json();
/**
* Check if the query produced errors, otherwise use the results
*/
if (json.errors) {
console.log(JSON.stringify(json.errors));
} else {
console.log(JSON.stringify(json.data));
}
})();Als je geneste mutaties wilt gebruiken in je GraphQL-queries, kun je ook een intern endpoint aanmaken dat exclusief is voor je plugin en dit naar wens configureren.