Blog

🚀 Lanzado Gato GraphQL v1.2 (con nuevas Persisted Queries)

Leonardo Losoviz
Por Leonardo Losoviz ·

¡Se ha lanzado la versión 1.2 de Gato GraphQL! 🎉

Aquí tienes una descripción de todos los cambios.

Añadidas varias Persisted Queries predefinidas

Ahora se proporcionan las siguientes Persisted Queries, para ejecutar tareas comunes de administración:

Traducir contenido desde URL

Dada una URL como entrada, su idioma, y a qué idioma traducir, esta consulta obtiene el contenido de la URL y realiza la traducción usando Google Translate:

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

Por ejemplo, pasando la URL de un fichero Markdown en un repo de GitHub, y el código de idioma "es":

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

...traducirá el contenido Markdown al español:

{
  "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"
    }
  }
}

También se ha añadido a la sección Recipes, bajo "Translating content from URL".

Traducir post (editor clásico), y Traducir posts (editor clásico)

Ya existían las persisted queries "Translate post" y "Translate posts" (en bulk), que tratan con traducir todas las propiedades dentro de los bloques Gutenberg en el post.

Estas se han renombrado debidamente como "Translate post (Gutenberg)" y "Translate posts (Gutenberg)", y se han añadido nuevas persisted queries para traducir contenido para el editor clásico:

  • Translate post (Classic editor): Traducir un solo post
  • Translate posts (Classic editor): Traducir múltiples posts, en bulk

Todas estas consultas traducen contenido llamando a la API de Google Translate, enviando todos los datos en una única petición.

Entonces, si usas la consulta "Translate posts (Classic editor)" para traducir 5 posts, todos los datos (título, contenido y extracto) para los 5 posts se envían juntos, proporcionando un contexto rico que produce mayor precisión en la traducción.

Por ejemplo, después de traducir este post de inglés a chino:

Post en inglés
Post en inglés

...se convirtió en esto:

Post traducido al chino
Post traducido al chino

Importar post desde un feed RSS de WordPress

Apunta al feed RSS de WordPress de un post, y crea un nuevo post con sus datos.

Por ejemplo, la consulta parseará el siguiente feed RSS para un solo post (normalmente accesible bajo 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</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>

Importar posts desde CSV

Proporciona un CSV para crear posts con los datos correspondientes para cada entrada (el título, extracto, contenido y autor).

Por ejemplo, el CSV de abajo creará 3 posts:

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

Tras ejecutar la consulta, obtenemos los resultados:

Posts creados desde CSV
Posts creados desde CSV

Obtener enlaces de posts

Encuentra todos los enlaces en todos los posts (buscando todas las cadenas <a href="(...)">(...)</a>), y lístalos en la respuesta como un objeto JSON, con las propiedades { href: (...), text: (...) }.

Por ejemplo, puede producir esta respuesta:

{
  "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": []
      }
    ]
  }
}

Añadido tipo escalar XML

Ahora podemos introducir cadenas XML vía el nuevo tipo escalar XML, que validará la corrección de la cadena XML.

Por ejemplo, esta consulta:

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

...producirá:

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

Mientras que esta consulta:

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

...producirá:

{
  "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
  }
}

Documentación mejorada

Arreglado

  • En las persisted queries predefinidas "Translate post" y "Translate posts", añadido failIfNonExistingKeyOrPath: false al seleccionar la propiedad attributes.{something} de un bloque (ya que a veces puede no estar definida)
  • En la persisted query predefinida "Import post from WordPress site", añadido el estado any para seleccionar el post
  • Renombrada la persisted query "Translate post" a "Translate post (Gutenberg)", y "Translate posts" a "Translate posts (Gutenberg)"

Suscríbete a nuestra newsletter

Mantente al tanto de todas las novedades de Gato GraphQL.