🎯 Gratulacje: Twój plugin WordPress właśnie stał się funkcją "core"
Ponieważ WP REST API jest już wbudowane w rdzeń WordPressa, często zalecałem unikanie GraphQL i po prostu używanie REST API do dostarczania danych do naszych wtyczek WordPress i bloków Gutenberga.
Już nie. WordPress 6.5 został właśnie wydany, zawierając niesamowitą nową funkcję: Plugin Dependencies.
Dzięki Plugin Dependencies, każda wtyczka WordPress dostępna w katalogu wtyczek może zostać zdefiniowana jako zależność naszej wtyczki, a WordPress zainstaluje tę zależność tuż przed zainstalowaniem naszej wtyczki.
W konsekwencji każda wtyczka w katalogu staje się w zasadzie funkcją "core", ponieważ będzie instalowana niejawnie zawsze, gdy wymagana przez inną wtyczkę.
Niektóre zastosowania są oczywiste i niekoniecznie potrzebne — na przykład dodatek do WooCommerce deklarujący zależność od WooCommerce, ponieważ właściciel witryny z całą pewnością już używa WooCommerce.
Jednak gdy wymagana wtyczka dostarcza "narzędzia" dla innej wtyczki, a nie możemy oczekiwać, że właściciel witryny ma już tę wtyczkę zainstalowaną (lub w ogóle zna jej istnienie), rezultat może być naprawdę znaczący.
Właśnie tak jest w przypadku GraphQL i Gato GraphQL.
GraphQL staje się funkcją "core" w WordPress
GraphQL to interfejs do pobierania, modyfikowania i ponownego zapisywania dowolnych danych z witryny WordPress. Każda wtyczka, która musi operować na danych (a praktycznie wszystkie to robią), może potencjalnie używać GraphQL do zaspokojenia swoich potrzeb.
GraphQL to "narzędzia". A Gato GraphQL jest dostawcą tych narzędzi.
Deklarując zależność Twojej wtyczki od Gato GraphQL, serwer GraphQL będzie natychmiast dostępny do użytku Twojej wtyczki.
Na przykład możesz wtedy używać GraphQL, aby pobierać dane dla bloków Gutenberga Twojej wtyczki i unikać tworzenia (i utrzymywania) kontrolerów REST.
Po raz pierwszy twórcy wtyczek mogą teraz traktować GraphQL jako realną alternatywę dla WP REST API.
Czy zależność od wtyczki może stać się problemem?
Ponieważ wtyczka zainstalowana jako zależność pojawi się w wp-admin, nieświadomy właściciel witryny może słusznie zapytać: "Skąd to się wzięło? Czy zostałem zhakowany? Czy to spam? Co tu się dzieje?"
Gdyby właściciel witryny był zirytowany, byłoby to niepokojące, ponieważ żadna wtyczka nie może sobie pozwolić na antagonizowanie swoich użytkowników (przynajmniej dopóki nie zrozumieją, co się dzieje, i nie zaakceptują rozwiązania).
Tę sytuację można by również poprawić, a nawet całkowicie uniknąć. Na przykład, biorąc pod uwagę Gato GraphQL jako zależność wtyczki, Gato GraphQL mógłby mieć również wtyczkę w wersji Lite, która po prostu instaluje serwer GraphQL wyłącznie do użytku wewnętrznego, niewidoczny przez interfejs użytkownika. (Kolejne zadanie na mojej liście rzeczy do zrobienia! 🤷🏻♂️)
Ważniejsze pytanie dla Gato GraphQL (i innych wtyczek) brzmi: czy nowa witryna stałaby się mniej bezpieczna?
W szczególności dla Gato GraphQL: czy publiczny endpoint GraphQL ujawni dane, do których może uzyskać dostęp każdy odwiedzający, i które mogą nieumyślnie ujawnić prywatne dane?
Odpowiedź brzmi: nie. Gato GraphQL domyślnie nie włącza publicznego pojedynczego endpointu, więc można go zainstalować bez obawy przed zagrożeniami bezpieczeństwa.
Dodawanie Gato GraphQL jako zależności wtyczki
Zacznijmy działać i pobawmy się tą niesamowitą nową funkcją.
Aby móc używać GraphQL w Twojej wtyczce, musisz zadeklarować gatographql jako zależność wtyczki w nagłówku wtyczki:
/**
* Plugin Name: Blocks for cooking recipes
* Requires Plugins: gatographql
*/Twoja wtyczka może wtedy uzyskiwać dostęp do danych przez wewnętrzny endpoint blockEditor, dostępny pod stałą JavaScript GATOGRAPHQL_BLOCK_EDITOR_ADMIN_ENDPOINT w wp-admin, która wskazuje na ten URL:
https://mysite.com/wp-admin/edit.php?page=gatographql&action=run_query&endpoint_group=blockEditorNa przykład blok może pobierać dane za pomocą kodu JavaScript takiego jak ten:
(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));
}
})();Jeśli chcesz używać zagnieżdżonych mutacji w swoich queries GraphQL, możesz również utworzyć wewnętrzny endpoint wyłączny dla swojej wtyczki i skonfigurować go odpowiednio.