บล็อก

🚀 เปิดตัว Gato GraphQL v1.2 (พร้อม Persisted Queries ใหม่)

Leonardo Losoviz
โดย Leonardo Losoviz ·

Gato GraphQL เวอร์ชัน 1.2 ได้เปิดตัวแล้ว! 🎉

นี่คือคำอธิบายของการเปลี่ยนแปลงทั้งหมด

เพิ่ม Persisted Queries ที่กำหนดไว้ล่วงหน้าหลายรายการ

Persisted Queries ต่อไปนี้สำหรับงานจัดการทั่วไปได้รับการเพิ่มเข้ามาแล้ว:

แปลเนื้อหาจาก URL

เมื่อระบุ URL เป็น input พร้อมภาษาต้นทางและภาษาปลายทาง queries นี้จะดึงเนื้อหาจาก URL และทำการแปลโดยใช้ Google Translate:

query TranslateContent(
  $url: URL!
  $fromLang: String!
  $toLang: String!
) {
  _sendHTTPRequest(input: {
    url: $url,
    method: GET
  }) {
    body
    translated: body @strTranslate(
      from: $fromLang
      to: $toLang
    )
  }
}

ตัวอย่างเช่น การส่ง URL ของไฟล์ Markdown ใน GitHub repository พร้อมรหัสภาษา "es":

{
  "url": "https://raw.githubusercontent.com/GatoGraphQL/GatoGraphQL/c870d8906ae1aec3c81acc039c53acc7aab5dff0/layers/GatoGraphQLForWP/plugins/gatographql/docs/modules/single-endpoint/en.md",
  "fromLang": "en",
  "toLang": "es"
}

...จะแปลเนื้อหา Markdown เป็นภาษาสเปน:

{
  "data": {
    "_sendHTTPRequest": {
      "body": "# Single Endpoint\n\nExecute queries against the GraphQL server through the public single endpoint.\n\nBy default the endpoint is `/graphql/`, and the path can be configured through the Settings.\n\n![Single endpoint in Settings](/assets/guides/upstream/settings-single-endpoint.webp \"Single endpoint in Settings\")\n\nThe GraphQL single endpoint can be configured by assigning a Schema Configuration to it. To do this, on section \"Schema Configuration\" select the desired entry from the dropdown for \"Schema Configuration for the Single Endpoint\":\n\n<div class=\"img-width-1024\" markdown="1">\n\n![Settings for the Schema Configuration for the Single Endpoint](/assets/guides/upstream/settings-schema-configuration-for-single-endpoint.webp)\n\n</div>\n\n## Clients\n\nInteract with the single endpoint via the available clients.\n\n### GraphiQL\n\nIf module \"GraphiQL for Single Endpoint\" is enabled, then the single endpoint's GraphiQL client becomes publicly available.\n\nTo open it, click on link \"🟢 GraphiQL (public)\" on the plugin's menu:\n\n<div class=\"img-width-1024\" markdown="1">\n\n![Single endpoint's link to the GraphiQL client](/assets/guides/upstream/single-endpoint-graphiql-link.webp)\n\n</div>\n\nBy default, the client is exposed under `/graphiql/`. This path can be modified on the Settings, under tab \"GraphiQL for Single Endpoint\":\n\n<div class=\"img-width-1024\" markdown="1">\n\n![Path to GraphiQL client](/assets/guides/upstream/settings-graphiql-for-single-endpoint.webp)\n\n</div>\n\n### Interactive Schema (Voyager)\n\nIf module \"Interactive Schema for Single Endpoint\" is enabled, then the single endpoint's Voyager client becomes publicly available.\n\nTo open it, click on link \"🟢 Schema (public)\" on the plugin's menu:\n\n<div class=\"img-width-1024\" markdown="1">\n\n![Single endpoint's link to the Interactive Schema client](/assets/guides/upstream/single-endpoint-interactive-schema-link.webp)\n\n</div>\n\nBy default, the client is exposed under `/schema/`. This path can be modified on the Settings, under tab \"Interactive Schema for Single Endpoint\":\n\n<div class=\"img-width-1024\" markdown="1">\n\n![Path to Voyager client](/assets/guides/upstream/settings-interactive-schema-for-single-endpoint.webp)\n\n</div>\n",
      "translated": "# Punto final único\n\nEjecute consultas en el servidor GraphQL a través del punto final único público.\n\nDe forma predeterminada, el punto final es `/graphql/` y la ruta se puede configurar a través de Configuración.\n\n![Punto final único en Configuración](/assets/guides/upstream/settings-single-endpoint.webp \"Punto final único en Configuración\")\n\nEl punto final único GraphQL se puede configurar asignándole una configuración de esquema. Para hacer esto, en la sección \"Configuración del esquema\", seleccione la entrada deseada del menú desplegable para \"Configuración del esquema para el punto final único\":\n\n<div class=\"img-width-1024\" descuento=1>\n\n![Configuración del esquema para el punto final único](/assets/guides/upstream/settings-schema-configuration-for-single-endpoint.webp)\n\n</div>\n\n## Clientes\n\nInteractúe con el punto final único a través de los clientes disponibles.\n\n### GrafiQL\n\nSi el módulo \"GraphiQL para punto final único\" está habilitado, el cliente GraphiQL del punto final único estará disponible públicamente.\n\nPara abrirlo, haga clic en el enlace \"🟢 GraphiQL (público)\" en el menú del complemento:\n\n<div class=\"img-width-1024\" descuento=1>\n\n![Enlace del punto final único al cliente GraphiQL](/assets/guides/upstream/single-endpoint-graphiql-link.webp)\n\n</div>\n\nDe forma predeterminada, el cliente está expuesto en `/graphiql/`. Esta ruta se puede modificar en Configuración, en la pestaña \"GraphiQL para punto final único\":\n\n<div class=\"img-width-1024\" descuento=1>\n\n![Ruta al cliente GraphiQL](/assets/guides/upstream/settings-graphiql-for-single-endpoint.webp)\n\n</div>\n\n### Esquema interactivo (Voyager)\n\nSi el módulo \"Esquema interactivo para punto final único\" está habilitado, el cliente Voyager del punto final único estará disponible públicamente.\n\nPara abrirlo, haga clic en el enlace \"🟢 Esquema (público)\" en el menú del complemento:\n\n<div class=\"img-width-1024\" descuento=1>\n\n![Enlace del punto final único al cliente de esquema interactivo](/assets/guides/upstream/single-endpoint-interactive-schema-link.webp)\n\n</div>\n\nDe forma predeterminada, el cliente está expuesto en `/schema/`. Esta ruta se puede modificar en Configuración, en la pestaña \"Esquema interactivo para punto final único\":\n\n<div class=\"img-width-1024\" descuento=1>\n\n![Ruta al cliente Voyager](/assets/guides/upstream/settings-interactive-schema-for-single-endpoint.webp)\n\n</div>\n"
    }
  }
}

รายการนี้ยังถูกเพิ่มในส่วน Recipes ภายใต้หัวข้อ "Translating content from URL" ด้วย

แปลโพสต์ (Classic editor) และแปลโพสต์หลายรายการ (Classic editor)

ก่อนหน้านี้มี Persisted Queries "Translate post" และ "Translate posts" (แบบกลุ่ม) อยู่แล้ว ซึ่งจัดการการแปลคุณสมบัติทั้งหมดภายใน Gutenberg blocks ในโพสต์

รายการเหล่านี้ได้รับการเปลี่ยนชื่อเป็น "Translate post (Gutenberg)" และ "Translate posts (Gutenberg)" ตามลำดับ และมีการเพิ่ม Persisted Queries ใหม่สำหรับแปลเนื้อหาใน Classic Editor:

  • Translate post (Classic editor): แปลโพสต์เดียว
  • Translate posts (Classic editor): แปลหลายโพสต์พร้อมกันแบบกลุ่ม

queries ทั้งหมดเหล่านี้แปลเนื้อหาโดยเรียก Google Translate API และส่งข้อมูลทั้งหมดภายในคำขอเดียว

ตัวอย่างเช่น หากใช้ queries "Translate posts (Classic editor)" เพื่อแปล 5 โพสต์ ข้อมูลทั้งหมด (ชื่อเรื่อง เนื้อหา และข้อความย่อ) ของทั้ง 5 โพสต์จะถูกส่งพร้อมกัน ซึ่งให้บริบทที่ครบถ้วนและเพิ่มความแม่นยำในการแปล

ตัวอย่างเช่น หลังจากแปลโพสต์นี้จากภาษาอังกฤษเป็นภาษาจีน:

โพสต์ภาษาอังกฤษ
โพสต์ภาษาอังกฤษ

...มันกลายเป็นแบบนี้:

โพสต์ที่แปลเป็นภาษาจีน
โพสต์ที่แปลเป็นภาษาจีน

นำเข้าโพสต์จาก WordPress RSS Feed

ชี้ไปที่ WordPress RSS feed ของโพสต์ แล้วสร้างโพสต์ใหม่พร้อมข้อมูลจาก feed นั้น

ตัวอย่างเช่น queries จะแยกวิเคราะห์ RSS feed ต่อไปนี้สำหรับโพสต์เดียว (โดยปกติเข้าถึงได้ที่ https://mysite.com/post-slug/feed/rss/?withoutcomments=1):

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
>
  <channel>
    <title>A tale of two cities &#8211; teaser &#8211; PoP API Demo</title>
    <atom:link href="https://mysite.com/blogroll/a-tale-of-two-cities-teaser/feed/?withoutcomments=1" rel="self" type="application/rss+xml" />
    <link>https://mysite.com</link>
    <description>Just another WordPress site</description>
    <lastBuildDate>Tue, 20 Jul 2021 23:03:59 +0000</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1	</sy:updateFrequency>
    <generator>https://wordpress.org/?v=6.1.1</generator>
    <item>
      <title>A tale of two cities &#8211; teaser</title>
      <link>https://mysite.com/blogroll/a-tale-of-two-cities-teaser/</link>
      <comments>https://mysite.com/blogroll/a-tale-of-two-cities-teaser/#comments</guides/query/comments>
      <dc:creator>leo</dc:creator>
      <pubDate>Mon, 21 Dec 2020 08:24:18 +0000</pubDate>
      <category>Blogroll</category>
      <category>championship</category>
      <category>book</category>
      <guid isPermaLink="false">https://mysite.com/?p=1657</guid>
      <description></description>
      <content:encoded>
<p>It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way—in short, the period was so far like the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of comparison only.</p>
  </content:encoded>          
      <wfw:commentRss>https://mysite.com/blogroll/a-tale-of-two-cities-teaser/feed/</wfw:commentRss>
      <slash:comments>45</slash:comments>
    </item>
  </channel>
</rss>

นำเข้าโพสต์จาก CSV

ระบุ CSV เพื่อสร้างโพสต์พร้อมข้อมูลที่สอดคล้องกันสำหรับแต่ละรายการ (ชื่อเรื่อง ข้อความย่อ เนื้อหา และผู้เขียน)

ตัวอย่างเช่น CSV ด้านล่างจะสร้าง 3 โพสต์:

Title,Excerpt,Content,Author
Multi-channelled optimal interface,Inventore iste velit et expedita ipsa dolor,"<!-- wp:paragraph -->
<p>Inventore iste velit et expedita ipsa dolor. Optio suscipit qui id harum corporis dignissimos.</p>
<!-- /wp:paragraph -->",admin
Ergonomic motivating parallelism,Consequuntur velit quasi assumenda,"<!-- wp:paragraph -->
<p>Consequuntur velit quasi assumenda. Eum non saepe est. Ut dolorem harum eveniet eaque nemo impedit. Voluptatem commodi modi sed sed animi voluptatem.</p>
<!-- /wp:paragraph -->
<!-- wp:image {""id"":5,""sizeSlug"":""large""} -->
<figure class=""wp-block-image size-large""><img src=""https://mysite.com/wp-content/uploads/2023/09/wordpress0.jpg"" alt="""" class=""wp-image-5""/></figure>
<!-- /wp:image -->
<!-- wp:image {""id"":7,""sizeSlug"":""large""} -->
<figure class=""wp-block-image size-large""><img src=""https://mysite.com/wp-content/uploads/2023/09/wordpress2.jpg"" alt="""" class=""wp-image-7""/></figure>
<!-- /wp:image -->",admin
Down-sized solution-oriented securedline,Ipsam minima qui asperiores dolorum unde voluptas quia voluptate,"<!-- wp:paragraph -->
<p>Ipsam minima qui asperiores dolorum unde voluptas quia voluptate. Incidunt omnis cumque beatae quo deleniti ex. Praesentium nihil et consectetur neque commodi tempora ipsa adipisci. Praesentium perferendis sint est.</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>Et aut fuga aliquam consequuntur dolore sunt ut ut. Quibusdam in voluptas vitae quia eaque. Eligendi dolorum dolorem vitae et vitae et ut.</p>
<!-- /wp:paragraph -->",admin

หลังจากรัน queries เราจะได้ผลลัพธ์ดังนี้:

โพสต์ที่สร้างจาก CSV
โพสต์ที่สร้างจาก CSV

ค้นหา link ทั้งหมดในทุกโพสต์ (โดยค้นหาสตริง <a href="(...)">(...)</a> ทั้งหมด) และแสดงรายการในการตอบสนองเป็น JSON object ที่มี properties { href: (...), text: (...) }

ตัวอย่างเช่น อาจได้รับการตอบสนองแบบนี้:

{
  "data": {
    "posts": [
      {
        "id": 1435,
        "title": "Citations from famous authors",
        "links": [
          {
            "href": "https://www.azquotes.com/author/4085-Fyodor_Dostoevsky",
            "text": "Quote by Fyodor Dostoevsky"
          },
          {
            "href": "https://www.azquotes.com/author/14706-Leo_Tolstoy",
            "text": "Quote by Leon Tolstoi"
          },
          {
            "href": "https://www.azquotes.com/author/15138-Voltaire",
            "text": "Quote by Voltaire"
          }
        ]
      },
      {
        "id": 1,
        "title": "Hello world!",
        "links": []
      }
    ]
  }
}

เพิ่มประเภท scalar XML

ตอนนี้เราสามารถป้อนสตริง XML ผ่านประเภท scalar XML ใหม่ ซึ่งจะตรวจสอบความถูกต้องของสตริง XML

ตัวอย่างเช่น queries นี้:

{
  _strDecodeXMLAsJSON(xml: """<?xml version="1.0" encoding="UTF-8"?>
  <body>
    <message>Hello world!</message>
  </body>
  """)
}

...จะสร้างผลลัพธ์:

{
  "data": {
    "_strDecodeXMLAsJSON": {
      "message": "Hello world!"
    }
  }
}

ในขณะที่ queries นี้:

{
  _strDecodeXMLAsJSON(xml: """<?xml version="1.0" encoding="UTF-8"?>
  <body>
    <message>Hello world!</message>
  """)
}

...จะสร้างผลลัพธ์:

{
  "errors": [
    {
      "message": "Cannot cast value '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <body>\n  <message>Hello world!<\/message>\n  ' for type 'XML'",
      "locations": [
        {
          "line": 2,
          "column": 31
        }
      ],
      "extensions": {
        "field": "_strDecodeXMLAsJSON(xml: \"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <body>\n  <message>Hello world!<\/message>\n  \")",
        "problems": [
          "Premature end of data in tag body line 2\n"
        ]
      }
    }
  ],
  "data": {
    "_strDecodeXMLAsJSON": null
  }
}

ปรับปรุงเอกสาร

  • เพิ่มเอกสารสำหรับ field ใหม่จาก extension Helper Function Collection:
    • _strDecodeXMLAsJSON
    • _strParseCSV

แก้ไข

  • ใน Persisted Queries ที่กำหนดไว้ล่วงหน้า "Translate post" และ "Translate posts" เพิ่ม failIfNonExistingKeyOrPath: false เมื่อเลือก property attributes.{something} ของ block (เนื่องจากบางครั้งอาจไม่ได้กำหนดค่าไว้)
  • ใน Persisted Query ที่กำหนดไว้ล่วงหน้า "Import post from WordPress site" เพิ่มสถานะ any เพื่อเลือกโพสต์
  • เปลี่ยนชื่อ Persisted Query "Translate post" เป็น "Translate post (Gutenberg)" และ "Translate posts" เป็น "Translate posts (Gutenberg)"

สมัครรับจดหมายข่าวของเรา

ติดตามการอัปเดตทั้งหมดของ Gato GraphQL