Π‘Π»ΠΎΠ³

πŸ₯³ Gato GraphQL v0.9 Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½!

Leonardo Losoviz
Автор: Leonardo Losoviz Β·

Бпустя ΠΏΠΎΡ‡Ρ‚ΠΈ 1,5 Π³ΠΎΠ΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ Π±ΠΎΠ»Π΅Π΅ 16000 ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ², Π½Π°ΠΊΠΎΠ½Π΅Ρ†-Ρ‚ΠΎ Π²Ρ‹ΡˆΠ»Π° новая вСрсия Gato GraphQL! πŸ₯³

ВСрсия 0.9 β€” ΠΊΡ€ΡƒΠΏΠ½Π΅ΠΉΡˆΠΈΠΉ Ρ€Π΅Π»ΠΈΠ· Π·Π° всю ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΏΠ»Π°Π³ΠΈΠ½Π°. Π’ΠΎΡ‚ changelog, Π° здСсь β€” ΠΏΠΎΠ»Π½Ρ‹ΠΉ Ρ€Π°Π·Π±ΠΎΡ€ всСх Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй:

github.com/GatoGraphQL/GatoGraphQL/releases/tag/0.9.3

Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ довольно ΠΎΠ±ΡŠΡ‘ΠΌΠ½Ρ‹ΠΉ (Π±ΠΎΠ»Π΅Π΅ 40 ΠΌΠΈΠ½ΡƒΡ‚ чтСния!), поэтому Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½ TL;DR с самыми Π²Π°ΠΆΠ½Ρ‹ΠΌΠΈ измСнСниями.

Π—Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π° GraphQL-схСма

МодСль Π΄Π°Π½Π½Ρ‹Ρ… WordPress Π±Ρ‹Π»Π° Π² Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π° Π² GraphQL-схСму.

GraphQL schema

Π’ частности, схСма ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ:

  • Запрос Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· любого CPT, Π² Ρ‚ΠΎΠΌ числС ΠΈΠ· любой Ρ‚Π΅ΠΌΡ‹ ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Π°
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… таксономий (Ρ‚Π΅Π³ΠΈ ΠΈ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ)
  • Π‘ΠΎΠ·Π΄Π°Π½Ρ‹ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ подходящиС GraphQL-Ρ‚ΠΈΠΏΡ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: HTML, URL, DateTime)
  • Field args ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ‡Π΅Ρ€Π΅Π· input objects
  • ИспользованиС oneof input objects для Π²Ρ‹Π±ΠΎΡ€Π° сущности ΠΏΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ свойствам (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: id, slug)
  • Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ payloads ΠΌΡƒΡ‚Π°Ρ†ΠΈΠΉ
  • Запрос настроСк (ΠΈΠ· wp_options) ΠΈ ΠΌΠ΅Ρ‚Π°-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ (для постов, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΈ таксономий)

Custom scalars

Π’ GraphQL-сСрвСр Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… скалярных Ρ‚ΠΈΠΏΠΎΠ². Custom scalars ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ваши Π΄Π°Π½Π½Ρ‹Π΅ β€” ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ поля, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΈ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ настраиваСмого Π²Ρ‹Π²ΠΎΠ΄Π° Π² ΠΎΡ‚Π²Π΅Ρ‚Π΅.

Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ нСсколько стандартных ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… скалярных Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сразу Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ использованию Π² вашСй GraphQL-схСмС:

  • Date
  • DateTime
  • Email
  • HTML
  • URL
  • URLAbsolutePath

Custom enums

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ enum. Enums β€” это особый Π²ΠΈΠ΄ скаляра, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ допустимых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π­Ρ‚ΠΎ позволяСт:

  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ любой Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· допустимых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ
  • Π‘ΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· систСму Ρ‚ΠΈΠΏΠΎΠ², Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ нСсколько Ρ‚ΠΈΠΏΠΎΠ² enum, примСняСмых Ρ‚Π°ΠΌ, Π³Π΄Π΅ это умСстно, Π² GraphQL-схСмС, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ:

  • CommentOrderByEnum
  • CommentStatusEnum
  • CommentTypeEnum
  • CustomPostOrderByEnum
  • CustomPostStatusEnum
  • MediaItemOrderByEnum
  • MenuOrderByEnum
  • TaxonomyOrderByEnum
  • UserOrderByEnum

Input Objects

GraphQL-сСрвСр Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ input types, ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ собствСнныС input objects Π² GraphQL-схСму. Input objects ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ слоТныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… полям, Ρ‡Ρ‚ΠΎ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для ΠΌΡƒΡ‚Π°Ρ†ΠΈΠΉ.

Π’ схСму Π² подходящих мСстах Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ нСсколько input objects. НапримСр, поля для запроса Π΄Π°Π½Π½Ρ‹Ρ… (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ posts, users, comments ΠΈ Ρ‚. Π΄.) ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ слоТныС input objects Ρ‡Π΅Ρ€Π΅Π· field args filter, sort ΠΈ pagination, Π° поля, ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ createPost, addCommentToCustomPost ΠΈ Ρ‚. Π΄.), ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ input object Ρ‡Π΅Ρ€Π΅Π· field arg input.

Oneof Input Objects

Β«OneofΒ» input object β€” это особый Ρ‚ΠΈΠΏ input object, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ прСдоставлСно Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС возвращаСтся ошибка Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ. Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ для Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

НапримСр, ΠΏΠΎΠ»Π΅ Root.post Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ field argument by, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ oneof input object, Ρ‡Ρ‚ΠΎ позволяСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ запись ΠΏΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ свойствам β€” ΠΏΠΎ id ΠΈΠ»ΠΈ ΠΏΠΎ slug:

{
  postByID: post(by: {
    id: 1
  }) {
    id
    title
  }
 
  postBySlug: post(by: {
    slug: "hello-world"
  }) {
    id
    title
  }
}

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ»Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ сцСнарии использования, избавляя ΠΎΡ‚ нСобходимости ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ случая (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, postByID, postBySlug ΠΈ Ρ‚. Π΄.) β€” GraphQL-схСма становится Ρ‡ΠΈΡ‰Π΅ ΠΈ элСгантнСС.

РСализовано нСсколько Oneof Input Objects:

  • Root.customPost(by:)
  • Root.mediaItem(by:)
  • Root.menu(by:)
  • Root.page(by:)
  • Root.postCategory(by:)
  • Root.postTag(by:)
  • Root.post(by:)
  • Root.user(by:)

Operation Directives

GraphQL-ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ query ΠΈ mutation) Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹.

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΏΠΎΠ»Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ полям ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. НапримСр, Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° @strUpperCase, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰Π°Ρ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля Π² Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ рСгистр, ΠΈΠΌΠ΅Π΅Ρ‚ смысл Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΏΠΎΠ»Π΅ΠΉ Ρ‚ΠΈΠΏΠ° String, Π½ΠΎ Π½Π΅ для Int, Float ΠΈΠ»ΠΈ Boolean. Π­Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Π² directive resolver.

Π’Ρ‹Π²ΠΎΠ΄ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ ΠΊ ΡƒΠ·Π»Ρƒ GraphQL-запроса, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌΡƒ ошибки

ΠžΡ‚Π²Π΅Ρ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ содСрТит ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ ΡƒΠ·Π»Π°ΠΌ GraphQL-запроса, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ (Π² ΠΏΠΎΠ΄ΠΏΠΎΠ»Π΅ extensions.path), Ρ‡Ρ‚ΠΎ ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ поиск источника ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

НапримСр, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ запросС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° @nonExisting Π½Π΅ сущСствуСт:

query {
  myField @nonExisting
}

ΠžΡ‚Π²Π΅Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

{
  "errors": [
    {
      "message": "There is no directive with name 'nonExisting'",
      "locations": [
        {
          "line": 2,
          "column": 7
        }
      ],
      "extensions": {
        "type": "QueryRoot",
        "field": "myField @nonExisting",
        "path": [
          "@nonExisting",
          "myField @nonExisting",
          "query { ... }"
        ],
        "code": "PoP\\ComponentModel\\e20"
      }
    }
  ],
  "data": {
    "id": "root"
  }
}

Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ нСбСзопасных настроСк ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

Gato GraphQL прСдоставляСт бСзопасныС настройки ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:

  • ЕдинствСнный endpoint ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Ρ‘Π½
  • Β«Π§ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅Β» элСмСнты Π΄Π°Π½Π½Ρ‹Ρ… Π² GraphQL-схСмС (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ User.roles ΠΈΠ»ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ постов ΠΏΠΎ status) Π½Π΅ Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ
  • Π—Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ лишь ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ настроСк ΠΈ ΠΌΠ΅Ρ‚Π°-ΠΊΠ»ΡŽΡ‡Π΅ΠΉ (для постов, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ Ρ‚. Π΄.)
  • ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ сущностСй, Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ (для постов, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ Ρ‚. Π΄.)

Π­Ρ‚ΠΈ бСзопасныС настройки ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ Β«ΠΆΠΈΠ²Ρ‹Ρ…Β» сайтов ΠΎΡ‚ врСдоносных Π°Ρ‚Π°ΠΊ. Однако ΠΎΠ½ΠΈ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ ΠΏΡ€ΠΈ сборкС «статичСских» сайтов, Π³Π΄Π΅ сайт WordPress Π½Π΅ уязвим для Π°Ρ‚Π°ΠΊ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° это сайт Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π° Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠ΅, Π·Π°Ρ‰ΠΈΡ‰Ρ‘Π½Π½Ρ‹ΠΉ Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΌ Ρ„Π°ΠΉΡ€Π²ΠΎΠ»ΠΎΠΌ, ΠΈΠ»ΠΈ Π½Π΅ доступный ΠΈΠ· ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π° Π² Ρ†Π΅Π»ΠΎΠΌ).

Начиная с v0.9, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ нСбСзопасныС настройки ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π² wp-config.php:

define( 'GRAPHQL_API_ENABLE_UNSAFE_DEFAULTS', true );

Как Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚Ρƒ ΠΆΠ΅ ΠΏΠ°Ρ€Ρƒ ΠΊΠ»ΡŽΡ‡/Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния.

ΠŸΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ нСбСзопасных настроСк ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  • ЕдинствСнный endpoint Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½
  • Β«Π§ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅Β» элСмСнты Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² GraphQL-схСмС
  • МоТно Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ настройки ΠΈ ΠΌΠ΅Ρ‚Π°-ΠΊΠ»ΡŽΡ‡ΠΈ
  • ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ сущностСй, Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ

ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ Custom Endpoints ΠΈ Persisted Queries ΠΏΠΎ катСгориям

ΠŸΡ€ΠΈ создании Custom Endpoint ΠΈΠ»ΠΈ Persisted Query ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ Β«GraphQL endpoint categoryΒ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΡ‚ΡŒ всС свои endpoints:

ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ endpoint ΠΏΡ€ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Custom Endpoint

НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ для управлСния endpoints ΠΏΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΈΠ»ΠΈ Π»ΡŽΠ±ΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΡƒ:

Бписок ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ endpoint

Π’ спискС Custom Endpoints ΠΈ Persisted Queries ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΈΡ… ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ; ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° ссылку ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ использовании Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° Π²Π²Π΅Ρ€Ρ…Ρƒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ записи этой ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ.

Бписок Custom Endpoints с ΠΈΡ… катСгориями

Запрос schema extensions Ρ‡Π΅Ρ€Π΅Π· ΠΈΠ½Ρ‚Ρ€ΠΎΡΠΏΠ΅ΠΊΡ†ΠΈΡŽ

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Ρ‘Π½Π½Ρ‹Π΅ ΠΊ элСмСнтам схСмы, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΠ»Π΅ extensions.

ВсС элСмСнты интроспСкции схСмы Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹ΠΌ ΠΏΠΎΠ»Π΅ΠΌ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ° Β«ExtensionsΒ», Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ свойства этого элСмСнта.

# Using "_" instead of "__" in introspection type name to avoid errors in graphql-js
type _SchemaExtensions {
  # Is the schema being namespaced?
  isNamespaced: Boolean!
}
 
extend type __Schema {
  extensions: _SchemaExtensions!
}
 
type _NamedTypeExtensions {
  # The type name
  elementName: String!
 
  # The "namespaced" type name
  namespacedName: String!
 
  # Enum-like "possible values" for EnumString type resolvers, `null` otherwise
  possibleValues: [String!]
 
  # OneOf Input Objects are a special variant of Input Objects where the type system asserts that exactly one of the fields must be set and non-null, all others being omitted.
  isOneOf: Boolean!
}
 
extend type __Type {
  # Non-null for named types, null for wrapping types (Non-Null and List)
  extensions: _NamedTypeExtensions
}
 
type _DirectiveExtensions {
  # If no objects are returned in the field (eg: because they failed validation), does the directive still need to be executed?
  needsDataToExecute: Boolean!
 
  # Names or descriptions of the types the field directives is restricted to, or `null` if it supports any type (i.e. it defines no restrictions)
  fieldDirectiveSupportedTypeNamesOrDescriptions: [String!]
}
 
extend type __Directive {
  extensions: _DirectiveExtensions!
}
 
type _FieldExtensions {
  isGlobal: Boolean!
 
  # Useful for nested mutations
  isMutation: Boolean!
 
  # `true` => Only exposed when "Expose "sensitive" data elements" is enabled
  isSensitiveDataElement: Boolean!
}
 
extend type __Field {
  extensions: _FieldExtensions!
}
 
type _InputValueExtensions {
  isSensitiveDataElement: Boolean!
}
 
extend type __InputValue {
  extensions: _InputValueExtensions!
}
 
type _EnumValueExtensions {
  isSensitiveDataElement: Boolean!
}
 
extend type __EnumValue {
  extensions: _EnumValueExtensions!
}

Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ ΠΎΡ‚Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° GraphQL-сСрвСра ΠΎΡ‚ WordPress

Π›Π΅ΠΆΠ°Ρ‰ΠΈΠΉ Π² основС ΠΏΠ»Π°Π³ΠΈΠ½Π° GraphQL-сСрвСр Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ PHP-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ нСзависимо ΠΎΡ‚ WordPress.

Π­Ρ‚ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ возмоТности для использования Gato GraphQL с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Laravel) ΠΈ Π² любой PHP-срСдС β€” Π²Π½Π΅ зависимости ΠΎΡ‚ наличия WordPress (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ Continuous Integration).

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Schema Configuration, Custom Endpoint ΠΈ Persisted Query

ВсС Π±Π»ΠΎΠΊΠΈ, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Schema Configuration, Custom Endpoint ΠΈ Persisted Query, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ содСрТат ΠΊΠ½ΠΎΠΏΠΊΡƒ Β«infoΒ», ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ докумСнтация открываСтся Π² модальном ΠΎΠΊΠ½Π΅.

НаТатиС Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ 'info'...

...ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ модальноС ΠΎΠΊΠ½ΠΎ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ

И ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎΠ±ΠΎ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π½ΠΎΠ²Ρ‹Ρ… возмоТностях, ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с ΠΏΠΎΠ»Π½Ρ‹ΠΌ описаниСм Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ€Π΅Π»ΠΈΠ·Π° ΠΈΠ»ΠΈ просмотритС changelog.

И скачайтС ΠΏΠ»Π°Π³ΠΈΠ½ здСсь.

Если Π²Π°ΠΌ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»ΠΎΡΡŒ, поТалуйста, ΠΏΠΎΠΌΠΎΠ³ΠΈΡ‚Π΅ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ❀️


ΠŸΠΎΠ΄ΠΏΠΈΡˆΠΈΡ‚Π΅ΡΡŒ Π½Π° Π½Π°ΡˆΡƒ рассылку

Π‘ΡƒΠ΄ΡŒΡ‚Π΅ Π² курсС всСх ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ Gato GraphQL.