Blog

🎯 Parabéns: seu plugin WordPress acabou de se tornar um recurso "core"

Leonardo Losoviz
Por Leonardo Losoviz ·

Como a WP REST API já vem incluída no core do WordPress, eu costumava recomendar evitar o GraphQL e simplesmente usar a REST API para alimentar nossos plugins WordPress e blocos Gutenberg com dados.

Não mais. O WordPress 6.5 acabou de ser lançado, incluindo um recurso novo e incrível: Plugin Dependencies.

Com o Plugin Dependencies, qualquer plugin WordPress disponível no diretório de plugins pode ser definido como uma dependência do nosso plugin, e o WordPress instalará essa dependência logo antes de instalar o nosso plugin.

Como consequência, todo plugin no diretório se torna essencialmente um recurso "core", pois será instalado implicitamente sempre que outro plugin o exigir.

Algumas aplicações são ao mesmo tempo óbvias e não realmente necessárias, como um add-on de WooCommerce declarar dependência do WooCommerce, já que o dono do site quase certamente já usa o WooCommerce.

Mas quando o plugin exigido fornece "ferramental" para outro plugin, e não podemos esperar que o dono do site já tenha esse plugin instalado (ou sequer conheça sua existência), o resultado pode ser bastante impactante.

É exatamente o caso do GraphQL e do Gato GraphQL.

GraphQL se torna um recurso "core" no WordPress

GraphQL é uma interface para buscar, modificar e armazenar novamente qualquer dado do site WordPress. Qualquer plugin que precise interagir com dados (e praticamente todos o fazem) pode potencialmente usar GraphQL para atender às suas necessidades.

GraphQL é "ferramental". E o Gato GraphQL é o provedor desse ferramental.

Ao fazer seu plugin declarar dependência do Gato GraphQL, o servidor GraphQL estará imediatamente disponível para uso do seu plugin.

Por exemplo, você pode usar GraphQL para buscar dados para os blocos Gutenberg do seu plugin e evitar criar (e manter) controllers REST.

Pela primeira vez, desenvolvedores de plugins podem agora considerar o GraphQL como uma alternativa real à WP REST API.

A dependência do plugin pode se tornar um problema?

Como o plugin instalado como dependência aparecerá no wp-admin, o dono do site desavisado pode legitimamente se perguntar: "De onde veio isso? Fui hackeado? É spam? O que está acontecendo aqui?"

Se o dono do site ficar incomodado, isso seria preocupante, pois nenhum plugin pode se dar ao luxo de antagonizar seus usuários (pelo menos até que entendam o que está acontecendo e aceitem a solução).

Essa situação também poderia ser melhorada, e até completamente evitada. Por exemplo, considerando o Gato GraphQL como dependência do plugin, o Gato GraphQL poderia ter também um plugin na versão Lite, que simplesmente instala um servidor GraphQL para uso interno apenas, não visível pela interface. (Mais uma tarefa para minha lista de afazeres! 🤷🏻‍♂️)

Uma questão mais importante para o Gato GraphQL (e outros plugins também) é: o novo site ficaria menos seguro?

Em particular para o Gato GraphQL: um endpoint GraphQL público vai expor dados que qualquer visitante pode acessar e que podem inadvertidamente expor dados privados?

A resposta é não. O Gato GraphQL por padrão não habilita o endpoint único público, portanto pode ser instalado sem medo de riscos de segurança.

Adicionando o Gato GraphQL como dependência de plugin

Vamos agora arregaçar as mangas e experimentar esse novo recurso incrível.

Para poder usar GraphQL no seu plugin, você precisará declarar gatographql como dependência de plugin no cabeçalho do plugin:

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

Seu plugin poderá então acessar dados através do endpoint interno blockEditor, disponível sob a constante JavaScript GATOGRAPHQL_BLOCK_EDITOR_ADMIN_ENDPOINT no wp-admin, que aponta para esta URL:

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

Por exemplo, o bloco pode buscar dados usando código JavaScript como este:

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

Se você quiser usar mutations aninhadas nas suas queries GraphQL, pode também criar um endpoint interno exclusivo para o seu plugin e configurá-lo adequadamente.


Assine nossa newsletter

Fique por dentro de todas as atualizações do Gato GraphQL.