Skip to content

Latest commit

 

History

History
1893 lines (1305 loc) · 72.8 KB

File metadata and controls

1893 lines (1305 loc) · 72.8 KB

Changelog

All notable changes to gatographql will be documented in this file.

Updates should follow the Keep a CHANGELOG principles.

19.3.0 - 30/09/2026

Added

  • Documentation for the FluentCart integration (#3379)
  • Choose whether the plugin's data is deleted when the plugin is deleted, under Settings => Plugin Management => Uninstall (#3398)

Improvements

  • The plugin's cached AI model data, its log counts and its internal transients are no longer loaded on every request, only where they are read (#3387)
  • The stored plugin and extension versions are no longer loaded on every request, only in the wp-admin where they are read (#3388)
  • Newly activated licenses are stored without the raw response from the marketplace, which nothing reads and made up two thirds of an option loaded on every request (#3397)

Fixed

  • The bulk action with custom settings now runs when a value on the originating screen contains a #, & or =, such as an HTML entity in a stored translation (#3396)
  • The values carried to the custom settings page and back no longer gain a backslash before each quote on the way (#3396)
  • Filtering users by several emails no longer changes the user queries that run after it in the same request (#3404)
  • Log entries whose context holds an HTML entity, such as ", now show that context under "Additional context" (#3406)
  • Saving the settings no longer crashes with a "Bad Gateway" error when a value is missing from the submitted form, such as the "Reset settings" option under Plugin Management (#3411)
  • The plugin's texts follow a switch of the language within a request (switch_to_locale()), and go back when it is restored (#3412)

Security

  • The selected IDs shown on the custom settings page are now escaped, closing a reflected XSS where a crafted link could run a script in the wp-admin of the user who followed it (#3396)

19.2.4 - 07/09/2026

Security

  • Reading protected meta keys (WordPress internal keys, such as those prefixed with _) from custom posts, comments and taxonomy terms is now restricted to administrators, closing an information disclosure where any user, including anonymous, could read them via fields metaValue/metaValues/meta/metaKeys (#3393)
  • Protected meta keys can no longer be read or written by padding the key name with characters that the database does not tell apart from the key itself (#3393)

19.2.3 - 07/09/2026

Security

  • Fixed a privilege escalation vulnerability where a logged-in user could still modify protected user meta keys (such as their own role/capabilities) through the user meta mutations by varying the letter case, accenting a letter, or adding trailing whitespace to the key name, bypassing the protection added in 19.2.2 (#3392)
  • The allow/deny lists for settings and meta keys are no longer bypassable by varying the letter case, accenting a letter, or adding trailing whitespace in the name, which allowed reading the value of a denylisted option, and writing and filtering by a denylisted meta key (#3392)
  • Writing the roles/capabilities user meta keys now requires the "promote users" capability, instead of any administrator-level capability (#3392)

19.2.2 - 02/09/2026

Security

  • Fixed a privilege escalation vulnerability where a logged-in user could modify protected user meta keys (such as their own role/capabilities) through the user meta mutations to gain higher privileges (#3389)
  • Protected meta keys (WordPress internal keys, such as those prefixed with _) can no longer be written through the custom post, comment and taxonomy meta mutations either (#3389)
  • Reading site options (fields optionValue, optionValues, optionNames and their variants) is now restricted to administrators unless the option is added to the settings allowlist, closing an information disclosure where any user could read arbitrary options; the "Settings" allow/deny default is now an empty allowlist (#3389)
  • Reading protected user meta keys (the roles/capabilities keys, user_level, session tokens, application passwords, and other user meta keys prefixed with _) is now restricted to administrators, closing an information disclosure where any user, including anonymous, could read them via fields metaValue/metaValues/meta/metaKeys — e.g. application-password hashes (#3389)

19.2.1 - 20/08/2026

Improvements

  • Tested up to WordPress 7.1 (#aa2cdc8d)
  • The read-only lists of selected schema elements are spaced out, instead of having their items sit flush against each other (#3382)

Fixed

  • The dropdowns in the plugin's post type editors are styled again under WordPress 7.1 (#3380)
  • The checkmarks in the read-only lists of selected schema elements are no longer greyed out under WordPress 7.1 (#3381)

19.2.0 - 11/08/2026

Added

  • Helper directives @start and @end to indicate which directives are affected by a meta directive, as an alternative to argument affectDirectivesUnderPos: the affected directives are wrapped between @start and @end (placed right after the meta directive), removing the need to calculate their relative positions, which is error prone in large queries. Both methods produce the same result, and can be combined within the same query (but not on the same meta directive) (#3369)

Improvements

  • Updated "Field Value Iteration and Manipulation" docs with the @underDynamicVariable meta directive (#3371)
  • Updated the WooCommerce docs with the store configuration, and brought the bundle teaser in line with what the extension reaches (#3374)
  • The tutorials on translating block content to a different language now also translate the header and footer cells of a core/table block, which the query extracted for the body rows and the caption only (#3375)

Fixed

  • Serializing the value of a field of type Date or DateTime no longer produces an uncaught PHP error when that value is not a date. This happens whenever a meta directive overrides the value of the field while keeping its type (eg: via @underDynamicVariable, or @applyField with setResultInResponse: true), and made the request fail with a 500 response instead of returning a GraphQL error. Such a value is now serialized as any other scalar would be (#3372)
  • Running a WP-CLI command that loads WordPress no longer prints Symfony\Component\Finder\Finder deprecation notices on PHP 8.1 and above (on sites with WP_DEBUG enabled). While compiling the service container, Symfony's Config component checks whether the Finder component is installed; as the plugin did not ship it, the class was resolved against WP-CLI's own bundled copy, which is Symfony 3.4 and predates PHP 8.1's tentative return types. The plugin now requires symfony/finder (#3373)

19.1.0 - 27/07/2026

Added

  • Filter custom posts by their parent: the customPosts query gains the parentID, parentIDs and excludeParentIDs filter inputs (as already available on the pages query), mapping to WordPress' post_parent, post_parent__in and post_parent__not_in query args (#3366)
  • Fields to query the site's options (i.e. the settings) in bulk: optionNames returns the list of the allowed option names stored in the DB (with a filterBy input to include/exclude the names containing some string), and options returns a JSON object with the option name and value for the provided (allowed) option names (#3364)
  • Mutations to create, update and delete users: createUser, updateUser and deleteUser (and their bulk versions createUsers, updateUsers and deleteUsers), and the nested update and delete fields on the User type; createUser and updateUser (and their nested and bulk versions) also accept a meta input to set the user's custom meta; the "payload types for mutations" schema configuration also applies to them (#3362)
  • Mutations to delete posts, pages and custom posts: deletePost, deletePage and deleteCustomPost (and their bulk versions), and the nested delete field on the Post, Page and GenericCustomPost types (#3358)
  • Mutations to delete media items: deleteMediaItem and deleteMediaItems, and the nested delete field on the Media type (#3358)
  • Mutations to delete menus: deleteMenu and deleteMenus, and the nested delete field on the Menu type (#3358)
  • Mutations to update and moderate comments: updateComment and updateComments, and the nested update field on the Comment type. The comment is moderated via the status input, which can approve it, hold it for moderation, mark it as spam, or send it to the trash (#3358)
  • Mutations to delete comments: deleteComment and deleteComments, and the nested delete field on the Comment type (#3358)

Improvements

  • The collapsible "Show details" descriptions in the plugin settings are now printed using the native HTML <details>/<summary> elements, instead of a JavaScript-driven show/hide link (#3368)
  • Updated WooCommerce docs with mutations (#3356)

Fixed

  • The defaultValue of input values (field and directive arguments, and input object fields) in the introspection query is now encoded using the GraphQL language, as required by the GraphQL spec, and not as JSON. Enum default values were previously quoted as strings (eg: ["approve"] instead of [approve]), so GraphQL clients (such as GraphiQL) discarded the default value and, for non-nullable arguments, wrongly reported that the argument is required (#3367)
  • Corrected the parentID and parentIDs filter input descriptions (on the custom posts and pages filters), which had the singular/plural wording swapped (#3366)
  • The "payload types for mutations" schema configuration (its "Do not use payload types for mutations" and "Use payload types for mutations, and add fields to query those payload objects" options) now also applies to the meta, taxonomy term (category and tag) and menu mutations; previously only the post, page, custom post, media, comment and user-state mutations honored it, so meta/taxonomy/menu mutations always used payload types and never exposed their ...MutationPayloadObjects query fields (#3359)
  • Made the ordering of taxonomy terms (eg: categories and tags) deterministic by adding a stable secondary sort by term ID, so that terms sharing the same primary sort value (eg: a duplicate name) are always returned in a consistent order when sorting and paginating (#3354)

19.0.2 - 13/07/2026

Fixed

19.0.1 - 06/07/2026

Improvements

  • Distribute Gato GraphQL plugin via the Gato Plugins store (instead of wordpress.org) (#3347)

19.0.0 - 29/06/2026

Added

  • Added the ability to register custom WordPress REST API controllers/endpoints via the service container (#3330)
  • Added the ability to execute queries as a DRY RUN, marked with a [DRY-RUN] prefix in the logs (#3330)
  • Added the "External Tools" settings category, for extensions to surface tooling/informational sections (#3330)

Improvements

  • Updated docs for the Schema Functions extension
  • The plugin is now translated to Spanish (es_ES) (#3314)
  • The plugin is now translated to French (fr_FR) (#3315)
  • The plugin is now translated to Italian (it_IT) (#3316)
  • The plugin is now translated to German (de_DE) (#8694a2b)
  • The plugin is now translated to Portuguese (pt_BR) (#3317)
  • The plugin is now translated to Polish (pl_PL) (#3318)
  • The plugin is now translated to Dutch (nl_NL) (#3322)
  • The plugin is now translated to Japanese (ja) (#3332)
  • The plugin is now translated to Chinese (Simplified) (zh_CN) (#3334)
  • The plugin is now translated to Korean (ko_KR) (#3335)
  • The plugin is now translated to Vietnamese (vi) (#3336)
  • The plugin is now translated to Thai (th) (#3337)
  • The plugin is now translated to Bahasa Indonesia (id_ID) (#3338)
  • The plugin is now translated to Russian (ru_RU) (#3339)
  • The plugin is now translated to Swedish (sv_SE) (#3341)
  • The plugin is now translated to Greek (el) (#3345)
  • Completed translations for the existing locales and resynced the block-editor JS language packs with the catalog (#3333)
  • Do not show All Inclusive bundle in Extension docs (#3321)
  • Upgraded GraphiQL to version 5.2.3 (#3323)
  • Added the Explorer plugin to the GraphiQL client, to build queries by point-and-click (#3327)

Fixed

  • Fixed a module being initialized more than once when booting an attached app (such as the Internal GraphQL Server), which could re-register its services and override others (#3331)
  • Fix lost styles in Extensions page (#3319)
  • Fix items not shown as active in Extensions page (#3320)
  • Replace non-standard spaces in block attributes when doing useHTML5Parser (#3313)
  • Fix the GraphiQL editor's Find box (Cmd/Ctrl+F) staying visible after being closed (#3326)
  • Register always first the capability to access the plugin (so it doesn't fail installing whenever the server does not have enough memory) (#3343)
  • Show the Marketplace Provider's own error message when activating or validating a license fails with an error HTTP status code, such as when the license's activation limit has been reached, instead of a generic HTTP error (#3344)

18.0.0 - 20/05/2026

Breaking changes

  • Changed namespace for packages in Gato GraphQL extensions (HTTP Client/PHP Constants and Environment Variables via Schema)
  • Changed the admin endpoint URL (from wp-admin/edit.php?page=gatographql&action=execute_query to wp-admin/edit.php?page=gatographql&action=run_query) (#3308)

Added

  • Field Root.blockTypes to query data from the Block Type Registry (#3291)
  • Cache compiled queries to disk (#3303)

Improvements

  • Tested up to WordPress 7.0 (#3289)
  • Support AI Connectors from WordPress 7.0 (#3290)
  • Updated documentation for Translation extension, now supporting Gemini as a translation service provider (#3292)
  • Allow the custom post author to be null (e.g. when the post has no assigned user / author ID 0) (#3293)
  • Execute GraphQL queries much faster (#3294, #3295, #3298)
  • Consume less memory (#3296, #3297)
  • Replace deprecations in PHP 8.5 (#3306)
  • Allow disabling the "Block type '...' is not server-side registered" warning (#3307)

Fixed

  • Handle null response from license API (eg: when access is forbidden via network) (#3288)
  • In field menus, return no results when passing empty filter.slugs (#8773b1b)
  • Avoid conflict with BBQ Firewall plugin (#3308)
  • Non-nullable parameter in method definition (#0cbe33e2)
  • Make sure query from request is a string (#3309)
  • Several bug fixes (#3310)

17.1.1 - 24/03/2026

Fixed

  • Conflict with the "All In One Security" plugin (#3287)

17.1.0 - 23/03/2026

Improvements

  • Updated Translation extension docs on using a self-hosted LLM (#3282)

Fixed

  • Conflict with the "All In One Security" plugin (#3283)
  • JetEngine: Fix missing images in docs (#3279)

17.0.0 - 03/03/2026

Breaking changes

  • Update GraphiQL to v5 (#3270)

Improvements

  • Support multiple e-commerce providers to validate plugin license (#3271)
  • Validate plugin license against Gato's new FluentCart-powered shop (#3278)

Fixed

  • Extensions: Show new version updates when clicking on the Show details link in Plugin updates (#0be1eb0)

16.1.0 - 13/02/2026

Added

  • Added the new "All Inclusive" bundle to Extensions (#3269)
  • JetEngine extension for Gato GraphQL (#3264)
  • Support executing bulk actions on users page (#3261)

Improvements

  • Print logs in reverse order (#3260)
  • Allow indicating minimum memory needed by plugin (#3262)
  • Allow linking to documentation URL to increase memory for plugin (#3263)

Fixed

  • Applying @objectRemoveProperties on fields with type StringValueJSONObject (#3268)

16.0.2 - 15/01/2026

Fixed

  • Own Plugin CPT editor: Check that get_current_screen exists (eg: it doesn't when editing Bricks templates) (#3259)

16.0.1 - 14/01/2026

Fixed

  • Revalidate commercial license (#3258)

16.0.0 - 12/01/2026

Breaking changes

  • Renamed MenuItem fields: title to rawLabel, and rawTitle to titleAttribute (#3251)
  • Renamed MenuItem.classes to cssClasses (#3252)

Added

  • Menu mutations Root.createMenu, Root.updateMenu and Menu.update (#3253)
  • MenuItem.itemType and MenuItem.objectType fields (#3249)

Improvements

  • Include/exclude properties in MenuItem.itemDataEntries (#3250)
  • Trigger a hook action before initializing enum string possible values (#3254)
  • Support text-only classic-editor CPT for the plugin (#3255)

Fixed

  • Don't initialize an input that includes itself (eg: MenuItemInput) (#3248)

15.3.0 - 16/12/2025

Added

  • MetaNamespacer service (#3241)

Improvements

  • Pass extensions to the response error via FeedbackItemResolution (#3240)
  • Allow to execute Custom Settings bulk action after filtering posts (for standalone plugins) (#3242)

15.2.1 - 03/12/2025

Fixed

  • Issue in WordPress 6.9 where "\" in blocks is not serialized properly (#3240)

15.2.0 - 26/11/2025

Added

  • Added field _urlToCustomPostID to get the custom post ID from a URL (#3229)
  • Support --fail-if-log-notifications param to WP-CLI commands, to print IDs only when a log entry was added during the execution (#3221)
  • Documentation for new field _htmlParseHTML5 in the Helper Function Collection extension (#3237)

Improvements

  • Include block's innerContent property for blockDataItems and blockFlattenedDataItems fields (#3224)
  • CustomPost.slug can return empty string if not yet set (#3228)
  • In fields blocks, blockDataItems, and blockFlattenedDataItems, allow to not convert block content using HTML5 parser (#3230)
  • Tested up to WordPress 6.9 (#3238)

Fixed

  • Check slugPath is not empty when adding page parent by slugPath (#3218)
  • Exception when passing field arg with value null (#3222)
  • Querying taxonomy that is assigned to more than 1 CPT (#3225)
  • Errors inside nested directives not passing the fields upwards when nestErrorsInMetaDirectives is false (#3226)
  • The link on the wpAdminEditURL field to print & as & (not &amp) (#3227)
  • "Undefined array key" warning (#3239)

15.1.0 - 17/10/2025

Added

  • Added WooCommerce extension to docs (#3195)
  • Added CodeNameJSONObject input type (#3210)

Improvements

  • Print descriptions in introspection for EnumStringScalarTypes (#3211)
  • Show "No values available" in description for EnumStrings (#a3dafbf7)
  • Allow returning null values in field connections of type List (#3212)

Fixed

  • Cast post ID to int (for if 3rd-party CPT returns it as string) (#3213)
  • Meta not returned as array (#3214)
  • QueryableInterface adapter (#3215)
  • CustomPostMeta module depends on Meta module (#3216)
  • Exception when printing admin_notices before plugin is initialized (#3217)

15.0.0 - 23/09/2025

Breaking changes

  • Removed the BasicService trait (#3208)

Improvements

  • Add helper methods to check if requesting public GraphQL API (#3207)
  • Chain defining environment settings across extensions (#3209)

14.0.3 - 16/09/2025

Fixed

  • "Service not found" issue when storing "Schema Elements Configuration" Settings (#3206)

14.0.0 - 09/09/2025

Breaking changes

  • Upgraded min PHP version from 7.4 to 8.1 (#3200)
  • Pass object param to resolveMetaKeysValue (#3177)

Added

  • Added parent field to CustomPost (#3159)
  • Pass parent on custom post mutations (#3160)
  • Added slugPath field to CustomPost (comprising the slug for all ancestor posts) (#3163)
  • Added fields GenericCustomPost.ancestors and Page.ancestors (#3167)
  • Added fields children and childCount to GenericCustomPost (#3168)
  • Added field Category.ancestors (#3169)
  • Added field CustomPost.menuOrder (#3172)
  • Added menuOrder arg to custom post mutations (#3173)

Improvements

  • Upgrade plugin to latest dependencies for PHP 8.1 (#3202)
  • Print body of failing requests in error logs (#3155)
  • Support executing bulk actions with custom settings (#3156)
  • Support reading just-updated plugin settings in options.php (#3157)
  • Append selected option value in dropdown in Settings if it doesn't exist (#3178)
  • Allow storing JSON data for options in Settings (#3179)
  • Added convenient method to handle Ajax Requests (#3180)
  • Allow executing further functionality on the Settings page (#3181)
  • Show notification labels in different colors for different severities (#3184)
  • Enable log notifications for warnings by default (#3185)
  • Support executing WP-CLI commands (#3188)
  • Validate the domain in the active license corresponds to the current site (for commercial extensions) (#3192)
  • Don't trigger license check if never run before (#3194)
  • Set WithMeta.metaKeys as sensitive field (#3197)
  • Move isOneOf introspection field out of extensions (as feature has been merged to GraphQL spec) (#3198)

Fixed

  • Querying post(by: { id: 0 }) returns null (instead of the post in the loop) (#3165)
  • Plugin not working with PHP 7.4 (#3182)
  • Updating posts storing wrong date (#3186)
  • User authentication when executing query triggered via the WP REST API (#3187)
  • Requesting GraphQL endpoint using Application Passwords didn't work when WooCommerce is installed (#3195)

13.2.0 - 21/07/2025

Added

  • Field CustomPost.rawStatus (as it exists in the database, eg: publish instead of future) (#3142)
  • Filter custom posts and media items by "slugs" (#3143)
  • Date parameter to createMediaItem mutation (#3146)
  • Option to create media items from unsafe URLs (#3149)
  • Fields srcs, widths, and heights (to fetch data for several sizes) to type Media (#3149)
  • Documentation for new field _arrayDeepFlatten from the Helper Function Collection extension (#3153)

Improvements

  • Added future and inherit statuses to the CustomPostStatus enum (#3142)
  • Updated dependencies to latest version (#3145)

Fixed

  • Don't validate promises inside array of arrays (#3144)
  • Don't fail validation for already-coerced values on inputs containing both a dynamic variable and a custom scalar (#3150)
  • Exception in Extensions page (#3151)

13.1.1 - 02/07/2025

Fixed

  • Handle empty response when LemonSqueezy service is down (#3139)
  • Exception in Extensions page (#3140)

13.1.0 - 25/06/2025

Added

  • Enable extensions if required theme is active (#3114)
  • Allow extension dependencies on themes (#3115)
  • Documentation for new Bricks Premium Extension (#3117)
  • Documentation for the new @exportFrom directive from Multiple Query Execution (#3121)
  • Documentation for the updated @passOnwards directive from Field to Input (#3122)
  • Added NonEmptyString custom scalar (#3124)
  • Added IdentifierString custom scalar (#3125)
  • Added new input IncludeExcludeFilterInput (#3127)
  • Added documentation for new fields _strArrayReplace and _strArrayReplaceMultiple from the PHP Functions via Schema extension (#3129)
  • Added field optionObjectValues (#3133)
  • Support for "partial" errors (shown in the response, but not bubbled up on nested directives) (#3135)
  • Support markdown in logs (#3136)

Improvements

  • Allow reinstalling plugin initial data when plugin/theme dependency is activated/deactivated (#3119)
  • Made customPostType param on the updateCustomPost mutation optional (#3120)
  • Use NonEmptyString for slug on custom post mutations (#3126)
  • Assign default value to configuration items added after the Settings was saved to DB (#3130)
  • Print errors before warnings in the response (#3134)

Fixed

  • Avoid overriding logic: Querying "attachment" doesn't work in an array (#3123)
  • Returning no results from get_posts when passing many CPTs (#3128)
  • Exception thrown when multiple fields have errors (#3137)

13.0.2 - 24/05/2025

Fixed

  • Do not show the notification count badge in the plugin menu if the Logs page is not enabled (#3112)

13.0.1 - 24/05/2025

(Empty - Version sync with PRO)

13.0.0 - 23/05/2025

Breaking changes

  • Replaced methods in Logger: logInfo and logError => log(severity: ...) (#3093)
  • Split Logger service into Logger and SystemLogger (#3098)
  • Moved "Logs" from "General" tab to new "Logs" tab in the Settings (#3103)

Added

  • Enable logs by severity in the Settings (#3095)
  • Add Logs page to the menu, to browse the logs (#3100)
  • Split Logs by sources and date (#3100)
  • Logs count badge in the Logs menu link (#3105)

Improvements

  • Print the severity (SUCCESS/INFO/WARNING/ERROR) in the logs (#3099)
  • Use the Logger also when using plugin as standalone (without WordPress) (#3104)

Fixed

  • Error type for "Custom post does not exist" was missing from union types (#3109)

12.2.2 - 13/05/2025

(Empty - Version sync with PRO)

12.2.1 - 13/05/2025

(Empty - Version sync with PRO)

12.2.0 - 07/05/2025

Fixed

  • Exception when clicking on Extensions link (#3092)

12.1.1 - 06/05/2025

(Empty - Version sync with PRO)

12.1.0 - 02/05/2025

Improvements

  • Added a Plugin Integration Configuration category on Settings (#3089)
  • Don't escape HTML forward slashes in GraphQL response errors (#3090)
  • Encode multibyte Unicode characters in GraphQL response errors (#3091)

12.0.1 - 30/04/2025

Fixed

  • Convert stdClass to array also on meta mutation input (#3088)

12.0.0 - 28/04/2025

Added

  • Documentation for new Elementor Premium Extension (#3052)

Improvements

  • Convert stdClass to associative array when storing meta in the DB (#3082)
  • Improve error message when casting to NullableListValueJSONObject fails (#3083)
  • Added meta input field to the createPage mutation (#3085)
  • Added "Post Meta Mutations" and "Page Meta Mutations" modules (#3086)

Breaking changes

  • Plugin constructor signature receives nullable commitHash param (#3056)
  • Store the extension names whose license has just been activated (instead of a timestamp) to install setup data (#3057)
  • Renamed getCommentPostID to getCommentCustomPostID (#3073)

Fixed

  • Avoid _load_textdomain_just_in_time error message in WP 6.8 (#3084)
  • Loading page entity in customPost field as result of mutation (#3087)

11.3.1 - 19/04/2025

Improvements

  • Use DangerouslyNonSpecificScalar instead of AnyScalarScalar type for metaValue field, to allow retrieving lists (eg: for ACF) (#3080)

11.3.0 - 13/04/2025

Added

  • Fields meta: ListValueJSONObject! and metaKeys: [String!]! for types Comment/CustomPost/TaxonomyTerm/User (#3060)
  • Meta mutations
    • Custom posts (#3067)
    • Categories (#3063)
    • Tags (#3064)
    • Users (#3072)
    • Comments (#3072)
  • Type ListValueJSONObject (#3060)
  • Documentation for new field _objectRecursiveReplace, from the Schema Functions extension (#3074)

Improvements

  • Made meta field metaValue handle any scalar type (previously only String) (#3061)
  • Made meta field metaValues handle any scalar type (previously only built-in ones), such as JSONObject (#3061)
  • Allow to hook inputs into tag/category mutations (#3062)
  • Tested up WordPress 6.8

Fixed

  • Passing a non-post CPT to updatePost will show an error (#3070)
  • Translation loading error message in WordPress 6.8 (73a9f11)

11.2.0 - 15/03/2025

Added

  • Support fetching Page Builders data in the GraphQL schema (#3051)
  • Documentation for new field _objectMerge, from the Schema Functions extension (#3050)

Fixed

  • Malcare deactivate triggers Exception (#3054)
  • Install plugin setup data on first request after activating license (#3055)

11.1.2 - 07/03/2025

Fixed

  • Hook template_include can receive null values (error may happen when WooCommerce is installed) (#3049)

Improvements

  • Support password type in multi-inputs in Settings (#3047)
  • Use password type to activate extensions in Settings (#3048)

11.1.0 - 03/03/2025

(Empty)

11.0.4 - 03/03/2025

Fixed

  • Do not remove the Screen Options tab on the post list page (#3046)

11.0.0 - 27/02/2025

Required actions

  • Important: If you have any extension installed (eg: the "Power Extensions" bundle), you need to update Gato GraphQL first! Otherwise the application will throw an exception.

Breaking changes

  • Register changelogURL for the extensions, to show the new version's changelog when updating them (#3042)

Added

  • Updated documentation for the Translation extension, adding new translation providers:
    • Mistral AI (#3043)
    • DeepSeek (#3044)

10.5.0 - 25/02/2025

Improvements

  • Enable multiple checkbox options in Settings (#3040)

Fixed

  • If the GMT date is stored as "0000-00-00 00:00:00", then use the non-GMT date (#3041)

10.4.0 - 18/02/2025

Added

  • Added password input on Settings (#3035)
  • Added date input on custom post mutations (createPost, updatePost, createCustomPost, and updateCustomPost) (#3036)
  • Added gmtDate input on custom post mutations (createPost, updatePost, createCustomPost, and updateCustomPost) (#3038)
  • Updated Translation extension docs with Claude as translation provider (#3039)

Improvements

  • Removed stale polyfill interface DateTimeInterface (for PHP 7.2) (#3037)

10.3.1 - 15/02/2025

Fixed

  • Deploy plugin to wp.org (#bb5414d)

10.3.0 - 14/02/2025

Added

  • Updated documentation for the Response Error Trigger module, adding the new _warn field and @warn directive (#3034)

Improvements

  • Use the smaller images between PNG and WEBP (#3031)

10.2.0 - 07/02/2025

Added

  • Documentation for new field _generateRandomString in the Helper Function Collection extension (#3027)

Improvements

  • Plugin updates: Use the same icon as the Gato GraphQL plugin for the extensions (#3022)
  • Allow to install setup data every time that the plugin is updated (#3028)
  • Convert all png images to webp (#3029)

10.1.0 - 08/01/2025

Added

  • YouTube video for the Automation extension doc (#93311e2)
  • Documentation for new "Schema Functions extension" fields _arrayEncodeAsJSONString and _objectEncodeAsJSONString (#3013)
  • Order tabs in Settings by priority (#3014)
  • Documentation for new extension "Translation" (replacing "Google Translate" and "DeepL") (#3016)

Improvements

  • Allow to create custom posts as private (#3019)
  • Allow printing textarea options in Settings (#3020)

Fixed

  • Exception when serializing an array value (#3017)

10.0.0 - 30/12/2024

Breaking changes

  • Changed signature of method validateDirectiveArgValue, passing the $directiveArgs param when validating a single directive arg (#2989)
  • Made params to method assertIsValid non-nullable (#2998)

Added

  • GraphQL type StringListValueJSONObject (#2991)
  • YouTube videos to the extension docs (#9b95be5)
  • Documentation for Premium Extensions (#2994)

Improvements

  • Settings: For entries of the "Key => Label" type (eg: Extension license keys), allow to use a select input to print preselected values (#2988)

Fixed

  • Container not generated properly in certain hosts (@required attribute disregarded) (#3009)
  • Use the Gutenberg Editor for the plugin CPTs (when Classic Editor active) (#3011)

9.0.0 - 16/12/2024

Breaking changes

  • Changed signature of method assertCommercialLicenseHasBeenActivated (#2978)

Improvements

  • Only register block JS scripts when in allowed CPT (#2975)
  • Enable updating extensions from Plugins page after major release (#2978)
  • Improve performance when caching resolvers for a queried field (#2981)

Fixed

  • Catch exception from SymfonyDI on admin_init hook (#2974)
  • Show "Visit plugin site" link instead of "View details" for extensions (#2976)
  • Fixed "Deprecated: Calling get_parent_class() without arguments is deprecated" (#2977)
  • Elementor not loading widgets with Gato GraphQL active (#2986)

8.0.0 - 30/11/2024

Improvements

  • Extensions (eg: the "All Extensions" bundle) can now be updated from the Plugins page (#2972)

7.0.8 - 28/11/2024

Fixed

  • Don't hardcode Gato GraphQL's plugin base name in plugin_action_links hook to allow standalone plugins to use it (#2971)

7.0.5 - 25/11/2024

Fixed

  • When an extension is activated, execute flush_rewrite_rules only at the end (or CPTs are not loaded properly) (#2970)

7.0.4 - 20/11/2024

Fixed

  • Do not print block editor scripts in the frontend (#2966)
  • Do not print block editor stylesheets in the frontend (#2967)

7.0.3 - 15/11/2024

Fixed

  • Allow method handling hook allowed_block_types_all to receive null (#2965)

7.0.2 - 13/11/2024

Fixed

  • Changed label in Settings form button to "Save Changes (all from this tab)"

7.0.1 - 11/11/2024

Fixed

  • Renamed "Gato GraphQL Shop" to "Gato Shop"

7.0.0 - 08/11/2024

Breaking changes

  • Bump minimum required PHP version to 7.4 (#2905)
  • Allow to include Gato GraphQL as the engine to power another standalone plugin (#2897)
  • Renamed env var CACHE_DIR to CONTAINER_CACHE_DIR (#2923)

Improvements

  • Added convenience class for standalone plugins (#2899)
  • Allow to fetch posts with auto-draft status (#2911)
  • Allow disabling the private endpoint (#2913)
  • Added field useGutenbergEditorWithCustomPostType (#2960)

Fixed

  • Fetching raw attribute sources with multiple nodes in blocks (#2909)

6.0.2 - 11/10/2024

Fixed

  • Remove global fields from schema when disabled via ACL (#2894)
  • Global fields duplicated in schema with nested mutations enabled (#2895)

6.0.0 - 06/10/2024

Breaking changes

Action required: When updating the plugin (i.e. not installing anew), you need to deactivate and then re-activate the plugin. Until then, the "GraphiQL" and "Schema" items won't appear on the menu (due to the newly-added "Schema Editing Access" module, see below)

  • Removed custom endpoints and persisted queries (#2852)
  • The single endpoint is enabled by default (#2859)
  • The single endpoint GraphiQL/Voyager clients are disabled default (#2860)
  • The Schema Configuration module is disabled by default (#2848)
  • The schema tutorial page is hidden by default (#2856)
  • On the settings page, the configuration for items under "Schema Elements Configuration" need to be set again (#2861)

Improvements

  • Tested up to WordPress 6.7 (#2887)
  • Do not display Endpoint Categories if there are no endpoint CPTs enabled (#2849)
  • Hide "API Hierarchy" module if there are no endpoint CPTs enabled (#2850)
  • Hide "Excerpt as description" module if there are no CPTs enabled (#2851)
  • Display the "Enable Logs?" settings only when some extension is using it (#2853)
  • Hide the Schema tutorial page by default (#2854)
  • Reorganized the Settings, splitting "Schema Configuration" into 2 elements: "Schema Configuration" and "Schema Elements Configuration" (#2861)
  • Improved documentation for extensions (#2866)
  • Added links to online docs on the Settings page (#2875)
  • Added "Schema Editing Access" module (#2877)

5.0.0 - 07/09/2024

Breaking changes

  • Breaking change: Bumped minimum WordPress version to 6.1 (#2811)
  • Return no results when filtering data by an empty array (#2809)

Improvements

  • Increase limit of chars in truncated response by Guzzle (#2800)
  • Added field isGutenbergEditorEnabled (#2801)
  • Use isGutenbergEditorEnabled in predefined persisted queries (#2802)
  • Added mutations to assign custom tags/categories to custom posts (#2803)
  • Added Settings option to enable/disable logs (#2813)
  • Application password failed authentication: Show error in GraphQL response (#2817)
  • Added predefined persisted queries:
    • [PRO] Import post from WordPress RSS feed and rewrite its content with ChatGPT (#2818)
    • [PRO] Import new posts from WordPress RSS feed (#2819)
    • [PRO] Import HTML from URLs as new posts in WordPress (#2822)
  • Support additional taxonomies for mutations on post tags/categories (not only post_tag and category) (#2823)
  • Added taxonomy field also to PostTag and PostCategory types (#2824)
  • Made taxonomy input not mandatory on Root.tags/categories and CustomPost.tags/categories fields (#2827)

Fixed

  • Add featuredImage field on GenericCustomPost (#2806)
  • On fields blocks, blockDataItems, and blockFlattenedDataItems, avoid error when post has no content (#2814)
  • Pass mandatory attrs field when creating persisted query blocks (#3adde2e)

4.2.0 - 21/08/2024

Improvements

  • Added mutations for categories (#2764)
  • Added mutations for tags (#2765)
  • Validate assign_terms capability on setCategory and setTag mutations (#2772)
  • Create a media item using the attachment from an existing media item (#2787)
  • Added field Media.parentCustomPost (#2788)
  • Added mutation Root.updateMediaItem (#2790)
  • Added predefined persisted queries:
    • [PRO] Create missing translation categories for Polylang (#2774)
    • [PRO] Translate categories for Polylang (#2774)
    • [PRO] Translate tags for Polylang (#2774)
    • [PRO] Create missing translation tags for Polylang (#2774)
    • [PRO] Translate categories for MultilingualPress (#2774)
    • [PRO] Translate tags for MultilingualPress (#2774)
    • [PRO] Create missing translation media for Polylang (#2789)
    • [PRO] Translate media for Polylang (#2789)
  • Added translation language mapping to persisted queries (#2775)

Fixed

  • Exception when initializing the GraphQL Internal Server query on add_attachment (#2796)

4.1.0 - 26/07/2024

Improvements

  • Send the referer on Guzzle requests (#2754)
  • Use @strQuoteRegex in predefined persisted queries (#2758)

4.0.0 - 24/07/2024

Breaking changes

  • Updated internal PHP hook structure for error payloads (#2739)

Improvements

  • Use bulk mutations in predefined persisted queries (#2728)
  • Added documentation for new PRO module Polylang Mutations (#2733)
  • Added documentation for new PRO field _arrayIntersect (#2735)
  • Added predefined persisted query:
    • [PRO] Create missing translation posts for Polylang (#2740)

Fixed

  • Don't replace chars in translation persisted queries (#2731)
  • "Call to protected method" exception in PHP 8.2 (#2741)

3.0.0 - 10/07/2024

Breaking changes

  • Require at least WordPress v6.0 (#2719)
  • Option "Do not use payload types for mutations (i.e. return the mutated entity)" in schema configuration block "Payload Types for Mutations" must be re-selected (#2720)

Improvements

  • Added compatibility with WordPress 6.6 (#2717)
  • Added bulk mutation fields (for all mutations in the schema) (#2721)
  • Added fields to query the mutation payload objects (#2720)
  • Added option to schema configuration block "Payload Types for Mutations" (#2720)
  • Added predefined custom endpoint "Bulk mutations" (#2720)
  • Removed predefined custom endpoint "Nested mutations + Entity as mutation payload type" (#2720)

Fixed

  • Catch exception if dependency version is not semver (#2712)
  • Convert entries in JSON dictionary of variables in persisted query from array to object (#2715)

2.6.0 - 01/07/2024

Improvements

  • Added siteURL field (#2697)
  • Added fields to fetch multisite data (#2698)
  • Added documentation for PRO integration with MultilingualPress (#2699)
  • Added documentation for new PRO field _strRegexFindMatches (#2708)
  • Added GraphQL variables $translateFromLanguage, $includeLanguagesToTranslate and $excludeLanguagesToTranslate to persisted queries (#2694 / #2700):
    • [PRO] Translate posts for Polylang (Gutenberg)
    • [PRO] Translate posts for Polylang (Classic editor)
  • Added scalar types to the GraphQL schema:
    • IntValueJSONObject (#2703)
    • IDValueJSONObject (#2704)
  • Added predefined persisted queries:
    • [PRO] Translate posts for MultilingualPress (Gutenberg) (#2706)
    • [PRO] Translate posts for MultilingualPress (Classic editor) (#2706)
    • [PRO] Translate Poedit file content (#2709)
  • Added Gato GraphQL intro video to documentation (#2707)

Fixed

  • Identifying extension in createMediaItem when filename has more then one dot

[PRO] Improvements

  • Added input valueWhenNonExistingKeyOrPath to field _objectProperty
  • Added integration with MultilingualPress
  • Added automation rules:
    • MultilingualPress: When publishing a post, translate it to all languages (Gutenberg)
    • MultilingualPress: When publishing a post, translate it to all languages (Classic editor)
  • Added field _strRegexFindMatches

2.5.2 - 06/06/2024

Fixed

  • Initialize blocks only after their corresponding CPTs (#2693)

2.5.1 - 05/06/2024

Fixed

  • Fixed tabs in Markdown in new persisted query [PRO] Send email to users about post

2.5.0 - 05/06/2024

Improvements

  • Added predefined persisted queries
    • [PRO] Send email to users about post (#2692)
  • Added documentation for "WordPress hook mapping" for the [PRO] Automation extension (#2691)

2.4.0 - 23/05/2024

Improvements

  • Added page mutations to the GraphQL schema (#2682)
  • Added fields to fetch the logged-in user's pages (#2682)
  • Added fields to fetch the site's locale and language (#2685)
  • Install "internal" private custom endpoint (#2684)
  • Support Application Passwords (#2672)
  • Added documentation for new PRO field _strBase64Encode (#2673)
  • Link extensions to the Extensions Reference in gatographql.com (#2675)
  • Added YouTube channel link to About page (#2676)
  • Added predefined persisted queries:
    • [PRO] Translate and create all pages for a multilingual site (Multisite / Gutenberg) (#2688)
    • [PRO] Translate and create all pages for a multilingual site (Multisite / Classic editor) (#2688)

Fixed

  • Open GraphiQL/Voyager clients in subfolder-based Multisite network (#2677)
  • Highlight extensions and enable link to visit in website (#2674)
  • GraphiQL client (for LocalWP) now uses site URL as endpoint (#2686)
  • Internal server error from passing string when expected int (v2.4.1)

2.3.0 - 08/05/2024

Improvements

  • Added fields GenericCustomPost.update, Root.updateCustomPost and Root.createCustomPost (#2663)
  • Added documentation for integration with Polylang (#2664)
  • Added module type "Integrations" (#2665)
  • Return an EnumString type on GenericCategory.taxonomy and GenericTag.taxonomy (#2666)
  • Added predefined persisted queries:
    • [PRO] Translate posts for Polylang (Gutenberg) (#2667)
    • [PRO] Translate posts for Polylang (Classic editor) (#2667)
    • [PRO] Sync featured image for Polylang (#2669)
    • [PRO] Sync tags and categories for Polylang (#2670)
  • Support alternative filenames from 3rd-party plugins for extensions (#2671)

Fixed

  • Updated the Support form's action URL (#2662)

[PRO] Improvements

  • Added integration with Polylang
  • Added automation rules:
    • Polylang: When publishing a post, translate it to all languages (Gutenberg)
    • Polylang: When publishing a post, translate it to all languages (Classic editor)
    • Polylang: When publishing a post, set the featured image for each language on all translation posts
    • Polylang: When publishing a post, set the tags and categories for each language on all translation posts

2.2.3 - 26/04/2024

Fixed

  • Bug parsing @export(as: $someVar) (#2661)

2.2.2 - 27/03/2024

Improvements

  • Adapted blocks field to work with WordPress 6.5 (#2657)
  • Tested up WordPress 6.5
  • Renamed "Tutorial" to "Schema tutorial"

2.2.1 - 14/03/2024

Improvements

  • Added "Lesson (number): " in the tutorials

2.2.0 - 06/03/2024

Improvements

  • Do not include bundles in the Extensions page
  • Do not print the required extensions on predefined persisted queries

2.1.3 - 16/02/2024

Improvements

  • Added documentation for fields _arrayFlipToObject and _objectIntersectKey from the PHP Functions via Schema extension
  • Added documentation for field _arrayOfJSONObjectsExtractProperty from the Helper Function Collection extension

2.1.0 - 15/02/2024

Added

  • Support providing the Schema Configuration to apply when invoking the Internal GraphQL Server
  • Predefined persisted query "Insert block in post"

Improvements

  • If initializing the service container from the cache fails, fallback to initializing PHP object from memory (#2638)
  • Give unique operationName to all predefined persisted queries (#2644)
  • Improved error message when fetching blocks from a post, and the block content has errors
  • Completed documentation for the Automation extension (#2651)
  • On the "Generate a post's featured image using AI and optimize it" predefined persisted query, execute logic only if the post title is not empty (#ec931dd)

Fixed

  • Bug in multi-control JS component used by extensions (Access Control, Cache Control, and Field Deprecation) showing "undefined" on the block on the Schema Configuration (#2639)
  • Bug in regex replacements in predefined persisted queries (#2649)
  • Avoid reinstalling plugin setup data if deactivating/reactivating the plugin (#2641)
  • Handle error from passing WP_Post as GraphQL variable to the Internal GraphQL Server (#2652)

2.0.0 - 29/01/2014

Added

  • Module "Media Mutations"
  • Mutation createMediaItem
  • Fields myMediaItemCount, myMediaItems and myMediaItem
  • Predefined persisted query "Generate a post's featured image using AI and optimize it"
  • Documentation for new field _dataMatrixOutputAsCSV from the Helper Function Collection extension

Improvements

  • Validate the license keys when updating the plugin
  • Simplified the Tutorial section
  • Prevent max execution time issues when installing plugin on (cheap) shared hosting (#2631)
    • Validate that the PHP memory limit is at least 64MB to load Gato GraphQL
    • Store the new plugin versions to DB only after generating the service container cache
    • Disable the max execution time when compiling the container

Fixed

  • Bug where a syntax error on a variable definition in the GraphQL query was not validated

Breaking changes

  • Field resolver's validateFieldArgValue method receives extra argument $fieldArgs

1.5.4 - 11/01/2024

Fixed

  • Bug in resolver where innerBlocks is not set

1.5.3 - 09/01/2024

Fixed

  • Point the "Missing an extension?" link to the Contact us page
  • Add link to bundles on the Extensions page
  • Fixed typo in readme.txt

1.5.2 - 08/01/2024

Fixed

  • Active bundle or extension, with different version than main plugin, did not show "Active" button in Extensions page

1.5.1 - 08/01/2024

Improvements

  • Description on readme.txt (for the WordPress plugin directory)

1.5.0 - 08/01/2024

Automatically deploy plugin to WordPress plugin directory SVN

Whenever creating a new release of the Gato GraphQL plugin, automatically deploy it to the WordPress plugin directory SVN (via 10up/action-wordpress-plugin-deploy).

Improvements

  • Added video to documentation for bundle
  • Added new predefined persisted queries:
    • "Send email to admin about post"
    • "Add comments block to post"

1.4.0 - 04/01/2014

Added

  • Predefined custom endpoint "Nested mutations + Entity as mutation payload type"

Improvements

  • Added "Request headers" to GraphiQL clients on single public/private endpoint, and custom endpoints
  • Renamed page "Recipes" to "Tutorial", and added settings to hide it
  • Renamed existing bundles:
    • "Application Glue & Automator" bundle => "Tailored WordPress Automator" bundle
    • "Content Translation" bundle => "Simplest WordPress Content Translation" bundle
    • "Public API" bundle => "Responsible WordPress Public API" bundle
  • Added documentation for new bundles:
    • "Automated Content Translation & Sync for WordPress Multisite" bundle
    • "Better WordPress Webhooks" bundle
    • "Easy WordPress Bulk Transform & Update" bundle
    • "Private GraphQL Server for WordPress" bundle
    • "Selective Content Import, Export & Sync for WordPress" bundle
    • "Unhindered WordPress Email Notifications" bundle
    • "Versatile WordPress Request API" bundle

Fixed

  • HTML codes were printed in select inputs in the WordPress editor, now removed

1.3.0 - 07/12/2013

Improvements

  • Read GET variables when executing Persisted Queries via POST
  • Pass data via URL params in persisted query "Register a newsletter subscriber from InstaWP to Mailchimp"

Fixed

  • Component docs displayed in the editor were not included in the plugin

1.2.0 - 28/11/2013

Added

  • XML scalar type
  • Documentation for new field _strDecodeXMLAsJSON from the Helper Function Collection extension
  • Documentation for new field _strParseCSV from the Helper Function Collection extension
  • Recipe "Translating content from URL"
  • Persisted Queries "Translate post (Classic editor)" and "Translate posts (Classic editor)"
  • Predefined Persisted Query "Translate content from URL"
  • Predefined Persisted Query "Import post from WordPress RSS feed"
  • Predefined Persisted Query "Import posts from CSV"
  • Predefined Persisted Query "Fetch post links"

Fixed

  • In predefined persisted queries "Translate post" and "Translate posts", added failIfNonExistingKeyOrPath: false when selecting a block's attributes.{something} property (as it may sometimes not be defined)
  • In predefined persisted query "Import post from WordPress site", added status any to select the post
  • Renamed persisted query "Translate post" to "Translate post (Gutenberg)", and "Translate posts" to "Translate posts (Gutenberg)"

1.1.1 - 21/11/2013

Fixed

  • Bug on the caching component (a downgraded reset method was called on a non array)

1.1.0 - 20/11/2013

Improvements

  • Tested with WordPress 6.4 ("Tested up to: 6.4")
  • Install setup data: Private "Nested mutations" Custom Endpoint
  • Install setup data: Private Persisted Queries for common admin tasks
  • Added Settings to enable or disable installing the setup data
  • Added AnyStringScalar wildcard scalar type

Fixed

  • Purge container when autoupdating a depended-upon plugin

1.0.15 - 30/10/2013

Fixed

  • Executing introspection query failed in GraphiQL client when passing ?operationName=...

1.0.14 - 29/10/2013

Fixed

  • Configuration alert in recipe "Duplicating multiple blog posts at once"

1.0.13 - 29/10/2013

Added

  • Scalar type AnyScalar
  • Documentation for new field _arrayGenerateAllCombinationsOfItems from the "Helper Function Collection" extension

Fixed

  • Passing dynamic variables 2 levels down
  • Do not open link in modal window when current page is in a modal window
  • Newsletter form "action" attribute

1.0.12 - 26/10/2023

Fixed

  • Adapted the plugin following the assessment by the WordPress Plugin Review team.

Improvements

  • Recipes: Replace mysite.com with the site domain
  • Added recipe: Automatically sending newsletter subscribers from InstaWP to Mailchimp

1.0.11 - 24/10/2023

Improvements

  • The operationName param can be obtained from the URL even when doing POST

1.0.10 - 24/10/2023

Improvements

  • Return String in fields Root.optionValue and WithMeta.metaValue

1.0.7 - 22/09/2023

Fixed

  • Constants in wp-config.php must start with GATOGRAPHQL_ (previously was GATO_GRAPHQL_)

1.0.0/1.0.6 - 07/09/23

Improvements

  • Integration of Gutenberg blocks into the GraphQL schema
  • Support for private and password-protected endpoints
  • Browse and install Gato GraphQL extensions
  • Browse Recipes, providing examples of GraphQL queries for different use cases
  • Browse "Additional Documentation" when editing a Schema Configuration
  • Inspect properties when editing Custom Endpoints and Persisted Query Endpoints
  • Added support for the "Global Fields" custom feature
  • Added support for the "Composable Directives" custom feature
  • Added support for the "Multi-Field Directives" custom feature
  • Send custom headers in the GraphQL response
  • Added field Category.slugPath
  • Added field CustomPost.wpAdminEditURL
  • Added several "raw content" fields, made them all "sensitive"
  • Mutations createPost, updatePost, addCommentToCustomPost (and others) now receive a oneof input object for content
  • Mutations createPost and updatePost now have input authorBy, as a "sensitive" data element
  • Mutations setting tags and categories on custom posts can now receive IDs or slugs via a oneof input
  • Filter custom posts by any status
  • Related inputs in filters have been grouped under input objects
  • The Settings page has been re-designed, featuring 2-level organization and tabs displayed vertically
  • Reset settings, and choose to use restrictive or non-restrictive default settings
  • Configuration blocks in the the Schema Configuration CPT editor can be removed (and added again)
  • GraphiQL clients now accept sending headers
  • Display warnings in the GraphQL response
  • Implementation of standard custom scalar types
  • Added internal endpoints to feed data to (Gutenberg) blocks
    • Added JS variable GATOGRAPHQL_BLOCK_EDITOR_ADMIN_ENDPOINT with URL of internal blockEditor endpoint
  • Create custom internal endpoints to feed data to (Gutenberg) blocks
  • Endpoints: Use 🟢 (green) to denote "public", 🟡 (yellow) to denote "private"
  • Sort the Schema Configuration entries by name
  • Configure returning a payload object or the mutated entity for mutations
  • Added "State" and "Schema Configuration" columns to tables for Custom Endpoints and Persisted Queries
  • Saving the Settings is faster, as it does not regenerate the service container anymore
  • Only activating/deactivating Gato GraphQL extension plugins will regenerate the service container
  • Generating the service container is faster (after upgrading to Symfony v6.3)
  • Upgraded Voyager client to v1.3

Fixed

  • Made field Comment.type of type CommentTypeEnum (previously was String)
  • Avoid error from loading non-existing translation files
  • Updated all documentation images

Breaking changes

  • Upgraded minimum PHP version to 7.2
  • Must update mutations createPost, updatePost, addCommentToCustomPost (and others)
  • Must update mutations setTagsOnPost, createPost and updatePost
  • Must adapt filtering data for posts, customPosts and comments
  • Non-restrictive Settings values are used by default
  • Env var ENABLE_UNSAFE_DEFAULTS has been removed and SETTINGS_OPTION_ENABLE_RESTRICTIVE_DEFAULT_BEHAVIOR added in its place, to indicate to use the restrictive Settings values by default
  • Renamed plugin to "Gato GraphQL"

0.10.2 - 24/02/2023

Fixed

  • Performance issue where elements to resolve AST were duplicated (#2039)

0.10.0 - 16/02/2023

Added

  • Configure several modules via the Schema Configuration:
    • Custom Posts
    • Tags
    • Categories
    • Settings
    • Custom Post Meta
    • Comment Meta
    • Taxonomy Meta
    • User Meta
  • Docs for modules "Tags" and "Categories"

Breaking changes

  • Modified value for allow behavior option in settings

0.9.9 - 16/01/2023

Enhancement

  • Improved query-resolution performance (by caching method results in PHP)

0.9.3 - 12/01/2023

GraphQL schema upgrade

  • Added field globalID to all types in the schema
  • In addition to id, fetch single entities by slug, path and other properties, on fields:
    • Root.customPost
    • Root.genericCustomPost
    • Root.mediaItem
    • Root.menu
    • Root.page
    • Root.postCategory
    • Root.postTag
    • Root.post
    • Root.user
  • Filter elements via the new filter field argument
  • Pagination and sorting fields are accessed via pagination and sort field args
  • customPosts fields now also retrieve data from CPTs which are not mapped to the GraphQL schema
  • Filter custom post fields (Root.posts, User.posts, etc) via new inputs:
    • tagIDs: [ID]
    • tagSlugs: [String]
    • categoryIDs: [ID]
    • authorIDs: [ID]
    • authorSlug: String
    • excludeAuthorIDs: [ID]
    • hasPassword: Bool
    • password: String
  • Filter by metaQuery
  • Exclude results via field arg excludeIDs
  • Added field urlPath on several types:
    • Post.urlPath: String!
    • Page.urlPath: String!
    • PostTag.urlPath: String!
    • PostCategory.urlPath: String!
    • User.urlPath: String!
  • content fields (for types Post, Page and Comment) are now of type HTML, and a new rawContent field of type String was added
  • Converted from string to Enum type whenever possible
    • Custom post type and status
    • Comment type and status
    • "Order by" property, for all entities
    • Menu locations
  • Added fields to retrieve the logged-in user's custom posts:
    • Root.myCustomPost: CustomPostUnion
    • Root.myCustomPosts: [CustomPostUnion]!
    • Root.myCustomPostCount: Int!
  • Query properties for custom post fields:
    • modified: DateTime
    • modifiedDateStr: String
  • Query properties for posts:
    • Post.postFormat: String!
    • isSticky: Bool!
  • Fetch a page's parent and children, and the menu order: Page.parent: Page Page.children: [Page]! Page.childCount: Int! Page.menuOrder: Int!
  • Filter field pages via new arguments:
    • parentIDs: [ID]
    • parentID: ID
  • Added fields to retrieve comments and their number:
    • Root.comment: Comment
    • Root.comments: [Comment]!
    • Root.commentCount: Int!
    • Root.myComment: Comment
    • Root.myComments: [Comment]!
    • Root.myCommentCount: Int!
    • Commentable.commentCount: Int! (Commentable is an interface, implemented by types Post, Page and GenericCustomPost)
    • Comment.responseCount: Int!
  • Added field arguments to filter comments:
    • authorIDs: [ID!]
    • customPostID: ID!
    • customPostIDs: [ID!]
    • excludeCustomPostIDs: [ID]
    • customPostAuthorIDs: [ID!]
    • excludeCustomPostAuthorIDs: [ID]
    • customPostTypes: [String!]
    • dateFrom: Date
    • dateTo: Date
    • excludeAuthorIDs: [ID]
    • excludeIDs: [ID!]
    • ids: [ID!]
    • parentID: ID!
    • parentIDs: [ID!]
    • excludeParentIDs: [ID]
    • excludeIDs: [ID!]
    • search: String
    • types: [String!]
  • Comment mutations: support creating comments by non logged-in users
  • Filter users by email (considered as "sensitive" data)
  • Query properties for users:
    • User.nicename: String!
    • User.nickname: String!
    • User.locale: String!
    • User.registeredDate: String!
  • Added utility fields to better operate with user roles:
    • User.roleNames: [String]!
    • User.hasRole: Bool!
    • User.hasAnyRole: Bool!
    • User.hasCapability: Bool!
    • User.hasAnyCapability: Bool!
  • Added arguments roles and excludeRoles to filter by user roles ("sensitive" input fields)
  • Fetch children from Categories:
    • PostCategory.children: [PostCategory]!
    • PostCategory.childNames: [String]!
    • PostCategory.childCount: Int
  • Added filter input hideEmpty to fields postTags and postCategories to fetch entries with/out any post
  • Added types GenericTag and GenericCategory to query any non-mapped custom taxonomy (tags and categories), and fields:
    • Root.categories(taxonomy: String!): [GenericCategory!]
    • Root.tags(taxonomy: String!): [GenericTag!]
    • GenericCustomPost.categories(taxonomy: String!): [GenericCategory!]
    • GenericCustomPost.tags(taxonomy: String!): [GenericTag!]
  • Filter custom posts by their associated taxonomy (tags and categories) via new filter input properties:
    • categoryTaxonomy
    • tagTaxonomy
  • Added fields for Menus:
    • Root.menus: [Menu]!
    • Root.menuCount: Int!
    • Menu.name: String
    • Menu.slug: String
    • Menu.count: Int
    • Menu.locations: [String]!
    • Menu.items: [MenuItem]!
    • MenuItem.children: [MenuItem]!
  • Added type UserAvatar, and fields:
    • User.avatar: [UserAvatar]
    • UserAvatar.src: String!
    • UserAvatar.size: Int!
  • Added field arguments to Root.mediaItems for filtering results
  • Added media field:
    • Root.imageSizeNames: [String]! to retrieve the list of the available intermediate image size names
    • Root.mediaItemCount: Int! to count the number of media items
  • Added fields for media items:
    • Media.srcSet: String
    • Media.url: String!
    • Media.localURLPath: String
    • Media.slug: String!
    • Media.title: String
    • Media.caption: String
    • Media.altText: String
    • Media.description: String
    • Media.date: DateTime
    • Media.dateStr: String
    • Media.modified: DateTime
    • Media.modifiedDateStr: String
    • Media.mimeType: String
    • Media.sizes: String
  • Added fields to query options:
    • Root.optionValues: [AnyBuiltInScalar]
    • Root.optionObjectValue: JSONObject
    • Root.optionValue: AnyBuiltInScalar (renamed from Root.option)
  • Mutations now return "Payload" types:
    • Comment.reply: CommentReplyMutationPayload!
    • Commentable.addComment: CustomPostAddCommentMutationPayload!
    • Post.setCategories: PostSetCategoriesMutationPayload!
    • Post.setTags: PostSetTagsMutationPayload!
    • Post.update: PostUpdateMutationPayload!
    • Root.addCommentToCustomPost: RootAddCommentToCustomPostMutationPayload!
    • Root.createPost: RootCreatePostMutationPayload!
    • Root.loginUser: RootLoginUserMutationPayload!
    • Root.logoutUser: RootLogoutUserMutationPayload!
    • Root.replyComment: RootReplyCommentMutationPayload!
    • Root.removeFeaturedImageFromCustomPost: RootRemoveFeaturedImageFromCustomPostMutationPayload!
    • Root.setCategoriesOnPost: RootSetCategoriesOnPostMutationPayload!
    • Root.setFeaturedImageOnCustomPost: RootSetFeaturedImageOnCustomPostMutationPayload!
    • Root.setTagsOnPost: RootSetTagsOnPostMutationPayload!
    • Root.updatePost: RootUpdatePostMutationPayload!
    • WithFeaturedImage.removeFeaturedImage: CustomPostRemoveFeaturedImageMutationPayload!
    • WithFeaturedImage.setFeaturedImage: CustomPostSetFeaturedImageMutationPayload!
  • Commentable and WithFeaturedImage interfaces are only added to CPTs that support the feature

Added

  • Support for custom scalar types
    • Implementation of standard custom scalar types
    • Implementation of Numeric scalar
    • Support for the new "Specified By URL" meta property
  • Support for custom enum types
    • Implementation of several enum types
  • Support for "enum string" types
    • Implementation of several "enum string" types
  • Support for input objects
    • Implementation of several input object types
  • Support for oneof input objects
    • Implementation of several oneof input objects
  • Support for operation directives
  • Restrict field directives to specific types
  • Added module "Self Fields"
  • Link to the online documentation of the GraphQL errors
  • Namespacing is applied to new types
  • Print the full path to the GraphQL query node producing errors
  • Allow to use unsafe default settings
  • Schema Configuration for the Single Endpoint
  • Display "causes" for errors in response (#893)
  • Sort fields and connections together, alphabetically
  • The entities from the WordPress data model are not namespaced anymore (#990)
  • Split options into 2 entries, "Default value for Schema Configuration" and "Apply on Admin clients", for the following settings:
    • Namespacing
    • Nested mutations
    • Admin fields
  • Validate constraints for field and directive arguments
  • Added options "default limit" and "max limit" for Posts and Pages
  • Return an error if access is not allowed for the option name or meta key
  • Completed all remaining query validations defined by the GraphQL spec
    • No cyclical fragment references
    • No duplicate fragment names
    • Fragment spread type existence
    • Support fragment spread on unions
    • Variables are input types
    • Queried fields are unambiguous
  • Organize custom endpoints and persisted queries by category
  • Support block string characters
  • Query schema extensions via introspection
    • Implemented extension isSensitiveDataElement
  • Performance improvement: Avoid regenerating the container when the schema is modified
  • Clicking on "Save Changes" on the Settings page will always regenerate the schema
  • Prettyprint GraphQL queries in the module docs
  • Upgraded GraphiQL to v1.5.7
  • Finished decoupling the GraphQL server code from WordPress
  • Browse documentation when editing a Schema Configuration, Custom Endpoint and Persisted Query

Fixed

  • Fixed newlines removed from GraphQL query after refreshing browser (#972)

Improvements in Development and Testing

  • Created several hundred new unit and integration tests
  • Upgraded all code to PHPStan's level 8
  • Bumped the min PHP version to 8.1 for development

Breaking changes

  • Replaced argument id with by in fields fetching a single entity
  • Must update GraphQL queries to use the new filter, pagination and sort field arguments
  • Renamed module "Schema for the Admin" to "Expose Sensitive Data in the Schema"
  • Renamed scalar type AnyScalar to AnyBuiltInScalar
  • Renamed interface type Elemental to IdentifiableObject
  • Renamed field Root.option to Root.optionValue
  • Removed the genericCustomPosts fields, unifying their logic into customPosts
  • All date fields (such as Post.date, Media.date and Comment.date) and modified fields are now of type DateTime (before they had type String)
  • Must update content(format:PLAIN_TEXT) to rawContent
  • Must update the inputs for mutations
  • Merged the "sensitive" fields with the non-admin versions: instead of having fields posts and unrestrainedPosts, now there is only field posts, and its filter argument can also receive input status when Expose Sensitive Data in the Schema is enabled
  • User.email is treated as "sensitive" field
  • Mutations now return a "Payload" type
  • Removed modules: Access Control, Cache Control, Public/Private Schema Mode, and Low-Level Persisted Query Editing
  • Module "GraphiQL Explorer" has been hidden
  • Settings for several modules must be set again
  • Must re-set options "default limit" and "max limit" for Posts and Pages

0.8.1 - 21/07/2021

Fixed

  • Field myPosts retrieving posts for all users, not logged-in user

0.8.0 - 19/07/2021

Added

  • Support for WordPress 5.8 (switched to newly-introduced hooks)
  • Simplified the codebase, using container services everywhere
  • Further completed the WordPress schema
    • Categories
    • Meta values
    • Menus
    • Settings
    • Logged-in user's posts
  • "Schema for the Admin" module, exposing "unrestricted" admin fields to the GraphQL schema
  • Introduced scalar type AnyScalar, representing any of the built-in scalars (String, Int, Boolean, Float and ID)
  • Cache is saved under the wp-content
  • Split the GraphQL endpoint for accessing data for the WordPress editor into two:
    1. GATOGRAPHQL_ADMIN_CONFIGURABLESCHEMA_ENDPOINT
    2. GATOGRAPHQL_ADMIN_FIXEDSCHEMA_ENDPOINT
  • Option to display the Settings page in long form, or using tabs
  • Further support of field types in the schema:
    • Lists with non-null items ([String!])
    • Lists of lists ([[String]])
  • Input coercion: accept a single value when a list is expected
  • Avoid deprecation notices in WordPress 5.8, by using the new filter hooks:
    • block_categories_all
    • allowed_block_types_all

Backwards-breaking changes:

  • Use bitwise operations and flags to augment a field's type (eg: [String]! => SchemaTypeModifiers::NON_NULLABLE | SchemaTypeModifiers::IS_ARRAY)
  • Schema Configurations, Custom Endpoints and Persisted Queries have their Option blocks rebuilt, and they must be filled again.

Fixed:

  • Improved support for PHP 8.0 (fixed several issues)
  • PHP notice "is_singular was called incorrectly" in WordPress 5.8
  • When a directive fails, the field is set to null in the response (previously the directive was ignored, and the field still printed)
  • A failing input coercion produces an error (previously it produced a warning, printed under extensions)

0.7.12/13 - 2021-02-23

Fixed

  • GraphiQL client returning 406 status error with ModSecurity (#436)

0.7.11 - 2021-02-22

Enhancement

  • Improved initialization speed (#412)

Fixed

  • Markdown pages not working (#433)

0.7.10 - 2021-02-01

Fixed

  • Removed file rector-test-scoping.php from the plugin

0.7.8/9 - 2021-01-30

Fixed

  • Scoped external dependencies (#246)

0.7.7 - 2021-01-25

Fixed

  • Point GitHub Updater to GatoGraphQL/gatographql-dist

0.7.5 to 0.7.6 - 2021-01-09

Fixed

  • Compatibility with PHP 8.0

0.7.1 to 0.7.4 - 2020-12-17

Fixed

  • Compatibility with PHP 8.0

0.7.0 - 2020-12-17

Added

  • Mutations and nested mutations (#28) - Thanks to WPKube for sponsoring this feature ❤️
  • Mutations in the schema:
    • Root.createPost
    • Root.updatePost
    • Root.setFeaturedImageforCustomPost
    • Root.removeFeaturedImageforCustomPost
    • Root.addCommentToCustomPost
    • Root.replyComment
    • Root.loginUser
    • Root.logoutUser
  • Support for PHP 8.0

Updated

  • Replaced the About page with the Support page
  • Decreased the size of the plugin's .zip file:
    • Images are referenced from the GitHub repo, and not packed within the plugin anymore
    • Removed all package-lock.json files from the plugin

Fixed

  • Automatic namespacing: retrieve the namespace from the called class
  • GraphiQL in Persisted query editor: use schema from selected Schema configuration
  • Array unpacking can't be used with string keys
  • Filtering of generic custom posts when passing non whitelisted CPT

0.6.4 - 2020-10-09

Fixed

  • Renamed field echo as echoStr to avoid conflict with global field echo

Enhancement (for development)

  • Use newly downgradable PHP 7.4 and 7.3 features (list reference assignment, array spread, _ in numeric literal)

0.6.3 - 2020-09-25

Fixed

  • No need to duplicate asset for GitHub Updater
  • Renamed verbose options for the GraphiQL Explorer settings (if any option had been disabled using v0.6.2 or below, the form needs to be submitted again, to use the new option names)
  • Store plugin version to detect updates (plugin can be updated in many ways, eg: using Composer, so using hook "upgrader_process_complete" doesn't always work)
  • Added option to disable admin notice in settings, and link in the admin notice

0.6.2 - 2020-09-22

Fixed

  • Set the right version in plugin main file

0.6.1 - 2020-09-22

Fixed

  • Made GraphiQL client in admin show the default GraphQL query

0.6.0 - 2020-09-22

Added

  • Upgraded PHPStan to level 8
  • Plugin for production can run with PHP 7.1
  • Added Embeddable Fields (#41)
  • Support for GitHub Updater (#53)
  • Use the GraphiQL Explorer in the public clients (#23)
  • About page
  • After updating plugin, show an admin notice with link to Release notes

0.5.0 - 2020-09-01

Added

  • Code now supports typed properties from PHP 7.4, and it uses Rector to convert it to PHP 7.2 when generating the plugin for production

0.4.2 - 2020-08-31

Fixed

  • Add the plugin version to the cache timestamp, to avoid configuration caching conflicts when developing the plugin (whenever this happens, upgrading the version solves the issue)

0.4.1 - 2020-08-26

Fixed

  • If the plugin is installed more than once (eg: by mistake because the .zip file has been renamed) then load only one version

0.4 - 2020-08-26

Added

  • Lazy-load the documentation inside blocks

Fixed

  • is_admin() or not affects the configuration, so this value must be accounted for when generating the cache
  • Logic for options.php is not executed when WP core or other plugins save their own settings

0.3 - 2020-08-24

Added

  • Filter modules by type
  • Use different colors to distinguish modules by type
  • Documentation for all modules, accessible clicking on "View details" on each module
  • Documentation for modals inside blocks
  • Module "Remove if Null" to add directive @removeIfNull
  • Module "Proactive Feedback" to send data about deprecations, warnings, logs, notices and traces in the response to the query
  • Module "Multiple Query Execution" to enable/disable functionality
  • If module "Multiple Query Execution" is disabled:

0.2.1 - 2020-08-07

Added

  • Process only the operation indicated in operationName in the GraphQL payload, as sent by GraphiQL
  • Hack to add support for query batching from GraphiQL: When in GraphiQL running query query __ALL { id }, it will execute all the other queries in the document

0.2.0 - 2020-08-06

Added

  • Query Batching
  • Directive aliases (through trait AliasSchemaFieldDirectiveResolverTrait)
  • Field aliases on the server (through trait AliasSchemaObjectTypeFieldResolverTrait)

Fixed

  • Enabled variables as expressions for @export

0.1.22 - 2020-08-04

Fixed

  • Non-default endpoints did not work after re-activating the plugin, WP requires to add hack to execute flush_rewrite_rules in first request after plugin is activated

0.1.21 - 2020-08-04

Fixed

  • Exception was thrown when executing a query, and option "Enable to select the visibility for a set of fields/directives when editing the Access Control List" was disabled

0.1.20 - 2020-07-31

Added

  • Added a GitHub action that, whenever the source code is tagged, creates the installable plugin and uploads it as a release asset

0.1.1 - 2020-07-31

Fixed

  • GraphiQL client retrieves domain using $_SERVER['HTTP_HOST'] instead of $_SERVER['SERVER_NAME'], for if configuration in server is not correct
  • Ignore port 443 from the URL retrieved fullUrl for SSL
  • Fixed issue to query users by email

0.1.0 - 2020-07-22

Added

  • Launched project