🎯 Selamat: plugin WordPress Anda baru saja menjadi fitur "inti"
Karena WP REST API sudah disertakan dalam inti WordPress, saya sering menyarankan untuk menghindari GraphQL, dan cukup menggunakan REST API untuk menyuplai data ke plugin WordPress dan blok Gutenberg kita.
Tidak lagi. WordPress 6.5 baru saja dirilis, termasuk fitur baru yang luar biasa: Plugin Dependencies.
Dengan Plugin Dependencies, plugin WordPress mana pun yang tersedia di direktori plugin dapat didefinisikan sebagai dependensi untuk plugin kita, dan WordPress akan menginstal dependensi tersebut tepat sebelum menginstal plugin kita.
Akibatnya, setiap plugin dalam direktori pada dasarnya menjadi fitur "inti", karena akan diinstal secara implisit kapan pun dibutuhkan oleh plugin lain.
Beberapa penerapan sudah jelas dan sebenarnya tidak terlalu diperlukan, seperti add-on WooCommerce yang mendeklarasikan dependensi pada WooCommerce, karena pemilik situs kemungkinan besar sudah menggunakan WooCommerce.
Namun ketika plugin yang dibutuhkan menyediakan "alat bantu" untuk plugin lain, dan kita tidak bisa mengharapkan pemilik situs sudah menginstal plugin tersebut sebelumnya (atau bahkan mengetahui keberadaannya), hasilnya bisa sangat berdampak.
Itulah yang terjadi dengan GraphQL, dan Gato GraphQL.
GraphQL menjadi fitur "inti" di WordPress
GraphQL adalah antarmuka untuk mengambil, memodifikasi, dan menyimpan kembali data apa pun dari situs WordPress. Plugin mana pun yang perlu berinteraksi dengan data (dan hampir semuanya melakukan itu) berpotensi menggunakan GraphQL untuk memenuhi kebutuhannya.
GraphQL adalah "alat bantu". Dan Gato GraphQL adalah penyedia alat bantu tersebut.
Dengan membuat plugin Anda mendeklarasikan dependensi pada Gato GraphQL, server GraphQL akan segera tersedia untuk digunakan oleh plugin Anda sendiri.
Misalnya, Anda kemudian dapat menggunakan GraphQL untuk mengambil data untuk blok Gutenberg plugin Anda, dan menghindari pembuatan (dan pemeliharaan) REST controller.
Untuk pertama kalinya, pengembang plugin kini dapat mempertimbangkan GraphQL sebagai alternatif nyata dari WP REST API.
Apakah dependensi plugin bisa menjadi masalah?
Karena plugin yang diinstal sebagai dependensi akan muncul di wp-admin, pemilik situs yang tidak mengetahuinya mungkin dengan wajar bertanya-tanya: "Dari mana itu berasal? Apakah saya diretas? Apakah ini spam? Apa yang sedang terjadi?"
Jika pemilik situs merasa terganggu, itu akan menjadi masalah karena tidak ada plugin yang bisa memusuhi penggunanya (setidaknya, sampai mereka memahami apa yang terjadi, dan menyambut solusinya).
Situasi ini juga bisa ditingkatkan, bahkan sepenuhnya dihindari. Misalnya, dengan mempertimbangkan Gato GraphQL sebagai dependensi plugin, Gato GraphQL juga bisa memiliki plugin versi Lite, yang cukup menginstal server GraphQL untuk konsumsi internal saja, tidak terlihat melalui UI. (Tugas lain untuk daftar TODO saya! 🤷🏻♂️)
Pertanyaan yang lebih penting untuk Gato GraphQL (dan plugin lainnya juga) adalah: Apakah situs baru akan menjadi kurang aman?
Khususnya untuk Gato GraphQL: Apakah endpoint GraphQL publik akan mengekspos data yang dapat diakses oleh pengunjung mana pun, dan yang mungkin secara tidak sengaja mengekspos data privat?
Jawabannya tidak. Gato GraphQL secara default tidak mengaktifkan single endpoint publik, sehingga dapat diinstal tanpa khawatir akan risiko keamanan.
Menambahkan Gato GraphQL sebagai dependensi plugin
Mari kita mulai dan bermain dengan fitur baru yang luar biasa ini.
Untuk dapat menggunakan GraphQL di plugin Anda, Anda perlu mendeklarasikan gatographql sebagai dependensi plugin di header plugin:
/**
* Plugin Name: Blocks for cooking recipes
* Requires Plugins: gatographql
*/Kemudian plugin Anda dapat mengakses data melalui endpoint internal blockEditor, yang tersedia di bawah konstanta JavaScript GATOGRAPHQL_BLOCK_EDITOR_ADMIN_ENDPOINT di wp-admin, yang mengarah ke URL ini:
https://mysite.com/wp-admin/edit.php?page=gatographql&action=run_query&endpoint_group=blockEditorMisalnya, blok dapat mengambil data menggunakan kode JavaScript seperti ini:
(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));
}
})();Jika Anda ingin dapat menggunakan nested mutations dalam queries GraphQL Anda, Anda juga dapat membuat endpoint internal yang eksklusif untuk plugin Anda, dan mengonfigurasinya sesuai kebutuhan.