Blog

🎯 Chúc mừng: Plugin WordPress của bạn vừa trở thành tính năng "core"

Leonardo Losoviz
Bởi Leonardo Losoviz ·

Vì WP REST API đã được tích hợp sẵn trong WordPress core, tôi thường khuyên nên tránh dùng GraphQL và chỉ cần sử dụng REST API để cung cấp dữ liệu cho các plugin WordPress và các khối Gutenberg của chúng ta.

Điều đó nay đã thay đổi. WordPress 6.5 vừa được phát hành, bao gồm một tính năng mới tuyệt vời: Plugin Dependencies.

Với Plugin Dependencies, bất kỳ plugin WordPress nào có sẵn trong thư mục plugin đều có thể được khai báo là phụ thuộc của plugin của chúng ta, và WordPress sẽ cài đặt phụ thuộc đó ngay trước khi cài đặt plugin của chúng ta.

Kết quả là, mọi plugin trong thư mục về cơ bản đều trở thành tính năng "core", vì nó sẽ được cài đặt ngầm định bất cứ khi nào một plugin khác yêu cầu.

Một số ứng dụng vừa rõ ràng vừa không thực sự cần thiết, chẳng hạn như một add-on của WooCommerce khai báo phụ thuộc vào WooCommerce, vì chủ website chắc chắn đã sử dụng WooCommerce rồi.

Nhưng khi plugin được yêu cầu cung cấp "công cụ" cho một plugin khác, và chúng ta không thể kỳ vọng chủ website đã cài đặt plugin đó từ trước (hay thậm chí biết đến sự tồn tại của nó), kết quả có thể thực sự có tác động lớn.

Đó chính là trường hợp của GraphQL và Gato GraphQL.

GraphQL trở thành tính năng "core" trong WordPress

GraphQL là một giao diện để lấy, chỉnh sửa và lưu lại bất kỳ dữ liệu nào từ website WordPress. Bất kỳ plugin nào cần tương tác với dữ liệu (và hầu hết tất cả đều như vậy) đều có thể sử dụng GraphQL để đáp ứng nhu cầu của mình.

GraphQL là "công cụ". Và Gato GraphQL là nhà cung cấp công cụ đó.

Bằng cách để plugin của bạn khai báo phụ thuộc vào Gato GraphQL, máy chủ GraphQL sẽ ngay lập tức sẵn sàng để plugin của bạn sử dụng.

Ví dụ, bạn có thể dùng GraphQL để lấy dữ liệu cho các khối Gutenberg của plugin và tránh phải tạo (và bảo trì) các REST controller.

Lần đầu tiên trong lịch sử, các nhà phát triển plugin có thể coi GraphQL như một giải pháp thay thế thực sự cho WP REST API.

Phụ thuộc plugin có thể trở thành vấn đề không?

Vì plugin được cài đặt như một phụ thuộc sẽ xuất hiện trong wp-admin, chủ website không biết điều này có thể đặt câu hỏi một cách chính đáng: "Cái này từ đâu ra vậy? Tôi có bị hack không? Đây có phải spam không? Chuyện gì đang xảy ra vậy?"

Nếu chủ website cảm thấy khó chịu, điều đó thực sự đáng lo ngại vì không plugin nào có thể đủ khả năng gây khó chịu cho người dùng của mình (ít nhất là cho đến khi họ hiểu chuyện gì đang xảy ra và chấp nhận giải pháp).

Tình huống này cũng có thể được cải thiện, thậm chí tránh hoàn toàn. Ví dụ, coi Gato GraphQL là phụ thuộc plugin, Gato GraphQL cũng có thể có plugin phiên bản Lite, chỉ đơn giản cài đặt máy chủ GraphQL để sử dụng nội bộ mà thôi, không hiển thị qua giao diện người dùng. (Thêm một nhiệm vụ nữa cho danh sách TODO của tôi! 🤷🏻‍♂️)

Một câu hỏi quan trọng hơn cho Gato GraphQL (và các plugin khác ngoài kia) là: Liệu website mới có trở nên kém bảo mật hơn không?

Đặc biệt với Gato GraphQL: Liệu một endpoint GraphQL công khai có lộ dữ liệu mà bất kỳ khách thăm nào cũng có thể truy cập, và có thể vô tình lộ dữ liệu riêng tư không?

Câu trả lời là không. Gato GraphQL theo mặc định không bật endpoint đơn công khai, vì vậy nó có thể được cài đặt mà không lo ngại rủi ro bảo mật.

Thêm Gato GraphQL như một phụ thuộc plugin

Hãy cùng bắt tay vào thực hành và khám phá tính năng mới tuyệt vời này.

Để có thể sử dụng GraphQL trong plugin của bạn, bạn cần khai báo gatographql như một phụ thuộc plugin trong phần header của plugin:

/**
 * Plugin Name: Blocks for cooking recipes
 * Requires Plugins: gatographql
 */

Sau đó, plugin của bạn có thể truy cập dữ liệu thông qua endpoint nội bộ blockEditor, có sẵn dưới hằng số JavaScript GATOGRAPHQL_BLOCK_EDITOR_ADMIN_ENDPOINT trong wp-admin, trỏ đến URL này:

https://mysite.com/wp-admin/edit.php?page=gatographql&action=run_query&endpoint_group=blockEditor

Ví dụ, khối có thể lấy dữ liệu bằng code JavaScript như sau:

(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));
  }
})();

Nếu bạn muốn có thể sử dụng nested mutations trong các queries GraphQL của mình, bạn cũng có thể tạo một endpoint nội bộ dành riêng cho plugin của bạn và cấu hình nó cho phù hợp.


Đăng ký nhận bản tin của chúng tôi

Cập nhật tất cả những điều mới từ Gato GraphQL.