All notable changes to gatographql will be documented in this file.
Updates should follow the Keep a CHANGELOG principles.
- 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)
- 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)
- 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)
- 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)
- 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 fieldsmetaValue/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)
- 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)
- 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,optionNamesand 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 fieldsmetaValue/metaValues/meta/metaKeys— e.g. application-password hashes (#3389)
- 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)
- 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)
- Helper directives
@startand@endto indicate which directives are affected by a meta directive, as an alternative to argumentaffectDirectivesUnderPos: the affected directives are wrapped between@startand@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)
- Updated "Field Value Iteration and Manipulation" docs with the
@underDynamicVariablemeta 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/tableblock, which the query extracted for the body rows and the caption only (#3375)
- Serializing the value of a field of type
DateorDateTimeno 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@applyFieldwithsetResultInResponse: 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\Finderdeprecation notices on PHP 8.1 and above (on sites withWP_DEBUGenabled). 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 requiressymfony/finder(#3373)
- Filter custom posts by their parent: the
customPostsquery gains theparentID,parentIDsandexcludeParentIDsfilter inputs (as already available on thepagesquery), mapping to WordPress'post_parent,post_parent__inandpost_parent__not_inquery args (#3366) - Fields to query the site's options (i.e. the settings) in bulk:
optionNamesreturns the list of the allowed option names stored in the DB (with afilterByinput to include/exclude the names containing some string), andoptionsreturns a JSON object with the option name and value for the provided (allowed) option names (#3364) - Mutations to create, update and delete users:
createUser,updateUseranddeleteUser(and their bulk versionscreateUsers,updateUsersanddeleteUsers), and the nestedupdateanddeletefields on theUsertype;createUserandupdateUser(and their nested and bulk versions) also accept ametainput 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,deletePageanddeleteCustomPost(and their bulk versions), and the nesteddeletefield on thePost,PageandGenericCustomPosttypes (#3358) - Mutations to delete media items:
deleteMediaItemanddeleteMediaItems, and the nesteddeletefield on theMediatype (#3358) - Mutations to delete menus:
deleteMenuanddeleteMenus, and the nesteddeletefield on theMenutype (#3358) - Mutations to update and moderate comments:
updateCommentandupdateComments, and the nestedupdatefield on theCommenttype. The comment is moderated via thestatusinput, which can approve it, hold it for moderation, mark it as spam, or send it to the trash (#3358) - Mutations to delete comments:
deleteCommentanddeleteComments, and the nesteddeletefield on theCommenttype (#3358)
- 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)
- The
defaultValueof 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
parentIDandparentIDsfilter 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
...MutationPayloadObjectsquery 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)
- Fix link to My account page (https://store.gatoplugins.com/account)
- Distribute Gato GraphQL plugin via the Gato Plugins store (instead of wordpress.org) (#3347)
- 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)
- 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 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)
- 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_querytowp-admin/edit.php?page=gatographql&action=run_query) (#3308)
- Field
Root.blockTypesto query data from the Block Type Registry (#3291) - Cache compiled queries to disk (#3303)
- 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
authorto 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)
- Handle null response from license API (eg: when access is forbidden via network) (#3288)
- In field
menus, return no results when passing emptyfilter.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)
- Conflict with the "All In One Security" plugin (#3287)
- Updated Translation extension docs on using a self-hosted LLM (#3282)
- Conflict with the "All In One Security" plugin (#3283)
- JetEngine: Fix missing images in docs (#3279)
- Update GraphiQL to v5 (#3270)
- Support multiple e-commerce providers to validate plugin license (#3271)
- Validate plugin license against Gato's new FluentCart-powered shop (#3278)
- Extensions: Show new version updates when clicking on the Show details link in Plugin updates (#0be1eb0)
- Added the new "All Inclusive" bundle to Extensions (#3269)
- JetEngine extension for Gato GraphQL (#3264)
- Support executing bulk actions on users page (#3261)
- 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)
- Applying
@objectRemovePropertieson fields with typeStringValueJSONObject(#3268)
- Own Plugin CPT editor: Check that
get_current_screenexists (eg: it doesn't when editing Bricks templates) (#3259)
- Revalidate commercial license (#3258)
- Renamed MenuItem fields: title to rawLabel, and rawTitle to titleAttribute (#3251)
- Renamed MenuItem.classes to cssClasses (#3252)
- Menu mutations Root.createMenu, Root.updateMenu and Menu.update (#3253)
- MenuItem.itemType and MenuItem.objectType fields (#3249)
- 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)
- Don't initialize an input that includes itself (eg: MenuItemInput) (#3248)
- MetaNamespacer service (#3241)
- Pass extensions to the response error via FeedbackItemResolution (#3240)
- Allow to execute Custom Settings bulk action after filtering posts (for standalone plugins) (#3242)
- Issue in WordPress 6.9 where "\" in blocks is not serialized properly (#3240)
- Added field
_urlToCustomPostIDto get the custom post ID from a URL (#3229) - Support
--fail-if-log-notificationsparam to WP-CLI commands, to print IDs only when a log entry was added during the execution (#3221) - Documentation for new field
_htmlParseHTML5in the Helper Function Collection extension (#3237)
- Include block's
innerContentproperty forblockDataItemsandblockFlattenedDataItemsfields (#3224) CustomPost.slugcan return empty string if not yet set (#3228)- In fields
blocks,blockDataItems, andblockFlattenedDataItems, allow to not convert block content using HTML5 parser (#3230) - Tested up to WordPress 6.9 (#3238)
- 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
nestErrorsInMetaDirectivesis false (#3226) - The link on the
wpAdminEditURLfield to print&as&(not&) (#3227) - "Undefined array key" warning (#3239)
- Added WooCommerce extension to docs (#3195)
- Added
CodeNameJSONObjectinput type (#3210)
- 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)
- 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)
- Removed the BasicService trait (#3208)
- Add helper methods to check if requesting public GraphQL API (#3207)
- Chain defining environment settings across extensions (#3209)
- "Service not found" issue when storing "Schema Elements Configuration" Settings (#3206)
- Upgraded min PHP version from 7.4 to 8.1 (#3200)
- Pass
objectparam toresolveMetaKeysValue(#3177)
- Added
parentfield toCustomPost(#3159) - Pass parent on custom post mutations (#3160)
- Added
slugPathfield to CustomPost (comprising the slug for all ancestor posts) (#3163) - Added fields
GenericCustomPost.ancestorsandPage.ancestors(#3167) - Added fields
childrenandchildCounttoGenericCustomPost(#3168) - Added field
Category.ancestors(#3169) - Added field
CustomPost.menuOrder(#3172) - Added
menuOrderarg to custom post mutations (#3173)
- 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.metaKeysas sensitive field (#3197) - Move
isOneOfintrospection field out ofextensions(as feature has been merged to GraphQL spec) (#3198)
- Querying
post(by: { id: 0 })returnsnull(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)
- Field
CustomPost.rawStatus(as it exists in the database, eg:publishinstead offuture) (#3142) - Filter custom posts and media items by "slugs" (#3143)
- Date parameter to
createMediaItemmutation (#3146) - Option to create media items from unsafe URLs (#3149)
- Fields
srcs,widths, andheights(to fetch data for severalsizes) to typeMedia(#3149) - Documentation for new field
_arrayDeepFlattenfrom the Helper Function Collection extension (#3153)
- Added
futureandinheritstatuses to theCustomPostStatusenum (#3142) - Updated dependencies to latest version (#3145)
- 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)
- Handle empty response when LemonSqueezy service is down (#3139)
- Exception in Extensions page (#3140)
- 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
@exportFromdirective from Multiple Query Execution (#3121) - Documentation for the updated
@passOnwardsdirective from Field to Input (#3122) - Added
NonEmptyStringcustom scalar (#3124) - Added
IdentifierStringcustom scalar (#3125) - Added new input
IncludeExcludeFilterInput(#3127) - Added documentation for new fields
_strArrayReplaceand_strArrayReplaceMultiplefrom 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)
- Allow reinstalling plugin initial data when plugin/theme dependency is activated/deactivated (#3119)
- Made
customPostTypeparam on theupdateCustomPostmutation optional (#3120) - Use
NonEmptyStringforslugon 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)
- Avoid overriding logic: Querying "attachment" doesn't work in an array (#3123)
- Returning no results from
get_postswhen passing many CPTs (#3128) - Exception thrown when multiple fields have errors (#3137)
- Do not show the notification count badge in the plugin menu if the Logs page is not enabled (#3112)
(Empty - Version sync with PRO)
- Replaced methods in
Logger:logInfoandlogError=>log(severity: ...)(#3093) - Split
Loggerservice intoLoggerandSystemLogger(#3098) - Moved "Logs" from "General" tab to new "Logs" tab in the Settings (#3103)
- 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)
- Print the severity (
SUCCESS/INFO/WARNING/ERROR) in the logs (#3099) - Use the Logger also when using plugin as standalone (without WordPress) (#3104)
- Error type for "Custom post does not exist" was missing from union types (#3109)
(Empty - Version sync with PRO)
(Empty - Version sync with PRO)
- Exception when clicking on Extensions link (#3092)
(Empty - Version sync with PRO)
- 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)
- Convert stdClass to array also on
metamutation input (#3088)
- Documentation for new Elementor Premium Extension (#3052)
- Convert stdClass to associative array when storing meta in the DB (#3082)
- Improve error message when casting to
NullableListValueJSONObjectfails (#3083) - Added
metainput field to thecreatePagemutation (#3085) - Added "Post Meta Mutations" and "Page Meta Mutations" modules (#3086)
- Plugin constructor signature receives nullable
commitHashparam (#3056) - Store the extension names whose license has just been activated (instead of a timestamp) to install setup data (#3057)
- Renamed
getCommentPostIDtogetCommentCustomPostID(#3073)
- Avoid
_load_textdomain_just_in_timeerror message in WP 6.8 (#3084) - Loading page entity in
customPostfield as result of mutation (#3087)
- Use
DangerouslyNonSpecificScalarinstead ofAnyScalarScalartype formetaValuefield, to allow retrieving lists (eg: for ACF) (#3080)
- Fields
meta: ListValueJSONObject!andmetaKeys: [String!]!for typesComment/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)
- Made meta field
metaValuehandle any scalar type (previously onlyString) (#3061) - Made meta field
metaValueshandle any scalar type (previously only built-in ones), such asJSONObject(#3061) - Allow to hook inputs into tag/category mutations (#3062)
- Tested up WordPress 6.8
- Passing a non-
postCPT toupdatePostwill show an error (#3070) - Translation loading error message in WordPress 6.8 (73a9f11)
- Support fetching Page Builders data in the GraphQL schema (#3051)
- Documentation for new field
_objectMerge, from the Schema Functions extension (#3050)
- Malcare deactivate triggers Exception (#3054)
- Install plugin setup data on first request after activating license (#3055)
- Hook
template_includecan receivenullvalues (error may happen when WooCommerce is installed) (#3049)
- Support
passwordtype in multi-inputs in Settings (#3047) - Use
passwordtype to activate extensions in Settings (#3048)
(Empty)
- Do not remove the Screen Options tab on the post list page (#3046)
- 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.
- Register
changelogURLfor the extensions, to show the new version's changelog when updating them (#3042)
- Updated documentation for the Translation extension, adding new translation providers:
- Mistral AI (#3043)
- DeepSeek (#3044)
- Enable multiple checkbox options in Settings (#3040)
- If the GMT date is stored as
"0000-00-00 00:00:00", then use the non-GMT date (#3041)
- Added password input on Settings (#3035)
- Added
dateinput on custom post mutations (createPost,updatePost,createCustomPost, andupdateCustomPost) (#3036) - Added
gmtDateinput on custom post mutations (createPost,updatePost,createCustomPost, andupdateCustomPost) (#3038) - Updated Translation extension docs with Claude as translation provider (#3039)
- Removed stale polyfill interface
DateTimeInterface(for PHP 7.2) (#3037)
- Deploy plugin to wp.org (#bb5414d)
- Updated documentation for the Response Error Trigger module, adding the new
_warnfield and@warndirective (#3034)
- Use the smaller images between PNG and WEBP (#3031)
- Documentation for new field
_generateRandomStringin the Helper Function Collection extension (#3027)
- 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)
- YouTube video for the Automation extension doc (#93311e2)
- Documentation for new "Schema Functions extension" fields
_arrayEncodeAsJSONStringand_objectEncodeAsJSONString(#3013) - Order tabs in Settings by priority (#3014)
- Documentation for new extension "Translation" (replacing "Google Translate" and "DeepL") (#3016)
- Allow to create custom posts as
private(#3019) - Allow printing textarea options in Settings (#3020)
- Exception when serializing an array value (#3017)
- Changed signature of method
validateDirectiveArgValue, passing the$directiveArgsparam when validating a single directive arg (#2989) - Made params to method
assertIsValidnon-nullable (#2998)
- GraphQL type
StringListValueJSONObject(#2991) - YouTube videos to the extension docs (#9b95be5)
- Documentation for Premium Extensions (#2994)
- Settings: For entries of the "Key => Label" type (eg: Extension license keys), allow to use a select input to print preselected values (#2988)
- Container not generated properly in certain hosts (
@requiredattribute disregarded) (#3009) - Use the Gutenberg Editor for the plugin CPTs (when Classic Editor active) (#3011)
- Changed signature of method
assertCommercialLicenseHasBeenActivated(#2978)
- 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)
- Catch exception from SymfonyDI on
admin_inithook (#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)
- Extensions (eg: the "All Extensions" bundle) can now be updated from the Plugins page (#2972)
- Don't hardcode Gato GraphQL's plugin base name in
plugin_action_linkshook to allow standalone plugins to use it (#2971)
- When an extension is activated, execute
flush_rewrite_rulesonly at the end (or CPTs are not loaded properly) (#2970)
- Do not print block editor scripts in the frontend (#2966)
- Do not print block editor stylesheets in the frontend (#2967)
- Allow method handling hook
allowed_block_types_allto receivenull(#2965)
- Changed label in Settings form button to "Save Changes (all from this tab)"
- Renamed "Gato GraphQL Shop" to "Gato Shop"
- 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_DIRtoCONTAINER_CACHE_DIR(#2923)
- Added convenience class for standalone plugins (#2899)
- Allow to fetch posts with
auto-draftstatus (#2911) - Allow disabling the private endpoint (#2913)
- Added field
useGutenbergEditorWithCustomPostType(#2960)
- Fetching raw attribute sources with multiple nodes in blocks (#2909)
- Remove global fields from schema when disabled via ACL (#2894)
- Global fields duplicated in schema with nested mutations enabled (#2895)
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)
- 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)
- Breaking change: Bumped minimum WordPress version to 6.1 (#2811)
- Return no results when filtering data by an empty array (#2809)
- Increase limit of chars in truncated response by Guzzle (#2800)
- Added field
isGutenbergEditorEnabled(#2801) - Use
isGutenbergEditorEnabledin 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_tagandcategory) (#2823) - Added taxonomy field also to
PostTagandPostCategorytypes (#2824) - Made taxonomy input not mandatory on
Root.tags/categoriesandCustomPost.tags/categoriesfields (#2827)
- Add
featuredImagefield onGenericCustomPost(#2806) - On fields
blocks,blockDataItems, andblockFlattenedDataItems, avoid error when post has no content (#2814) - Pass mandatory
attrsfield when creating persisted query blocks (#3adde2e)
- Added mutations for categories (#2764)
- Added mutations for tags (#2765)
- Validate
assign_termscapability onsetCategoryandsetTagmutations (#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)
- Exception when initializing the GraphQL Internal Server query on
add_attachment(#2796)
- Send the referer on Guzzle requests (#2754)
- Use
@strQuoteRegexin predefined persisted queries (#2758)
- Updated internal PHP hook structure for error payloads (#2739)
- 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)
- Don't replace chars in translation persisted queries (#2731)
- "Call to protected method" exception in PHP 8.2 (#2741)
- 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)
- 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)
- Catch exception if dependency version is not semver (#2712)
- Convert entries in JSON dictionary of variables in persisted query from array to object (#2715)
- Added
siteURLfield (#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,$includeLanguagesToTranslateand$excludeLanguagesToTranslateto 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)
- Identifying extension in
createMediaItemwhen filename has more then one dot
- Added input
valueWhenNonExistingKeyOrPathto 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
- Initialize blocks only after their corresponding CPTs (#2693)
- Fixed tabs in Markdown in new persisted query [PRO] Send email to users about post
- Added predefined persisted queries
- [PRO] Send email to users about post (#2692)
- Added documentation for "WordPress hook mapping" for the [PRO] Automation extension (#2691)
- 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)
- 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)
- Added fields
GenericCustomPost.update,Root.updateCustomPostandRoot.createCustomPost(#2663) - Added documentation for integration with Polylang (#2664)
- Added module type "Integrations" (#2665)
- Return an EnumString type on
GenericCategory.taxonomyandGenericTag.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)
- Updated the Support form's action URL (#2662)
- 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
- Bug parsing
@export(as: $someVar)(#2661)
- Adapted
blocksfield to work with WordPress 6.5 (#2657) - Tested up WordPress 6.5
- Renamed "Tutorial" to "Schema tutorial"
- Added "Lesson (number): " in the tutorials
- Do not include bundles in the Extensions page
- Do not print the required extensions on predefined persisted queries
- Added documentation for fields
_arrayFlipToObjectand_objectIntersectKeyfrom the PHP Functions via Schema extension - Added documentation for field
_arrayOfJSONObjectsExtractPropertyfrom the Helper Function Collection extension
- Support providing the Schema Configuration to apply when invoking the Internal GraphQL Server
- Predefined persisted query "Insert block in post"
- 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)
- 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)
- Module "Media Mutations"
- Mutation
createMediaItem - Fields
myMediaItemCount,myMediaItemsandmyMediaItem - Predefined persisted query "Generate a post's featured image using AI and optimize it"
- Documentation for new field
_dataMatrixOutputAsCSVfrom the Helper Function Collection extension
- 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
- Bug where a syntax error on a variable definition in the GraphQL query was not validated
- Field resolver's
validateFieldArgValuemethod receives extra argument$fieldArgs
- Bug in resolver where innerBlocks is not set
- Point the "Missing an extension?" link to the Contact us page
- Add link to bundles on the Extensions page
- Fixed typo in readme.txt
- Active bundle or extension, with different version than main plugin, did not show "Active" button in Extensions page
- Description on readme.txt (for the WordPress plugin directory)
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).
- Added video to documentation for bundle
- Added new predefined persisted queries:
- "Send email to admin about post"
- "Add comments block to post"
- Predefined custom endpoint "Nested mutations + Entity as mutation payload type"
- 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
- HTML codes were printed in select inputs in the WordPress editor, now removed
- Read
GETvariables when executing Persisted Queries viaPOST - Pass data via URL params in persisted query "Register a newsletter subscriber from InstaWP to Mailchimp"
- Component docs displayed in the editor were not included in the plugin
XMLscalar type- Documentation for new field
_strDecodeXMLAsJSONfrom the Helper Function Collection extension - Documentation for new field
_strParseCSVfrom 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"
- In predefined persisted queries "Translate post" and "Translate posts", added
failIfNonExistingKeyOrPath: falsewhen selecting a block'sattributes.{something}property (as it may sometimes not be defined) - In predefined persisted query "Import post from WordPress site", added status
anyto select the post - Renamed persisted query "Translate post" to "Translate post (Gutenberg)", and "Translate posts" to "Translate posts (Gutenberg)"
- Bug on the caching component (a downgraded
resetmethod was called on a non array)
- 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
AnyStringScalarwildcard scalar type
- Purge container when autoupdating a depended-upon plugin
- Executing introspection query failed in GraphiQL client when passing ?operationName=...
- Configuration alert in recipe "Duplicating multiple blog posts at once"
- Scalar type
AnyScalar - Documentation for new field
_arrayGenerateAllCombinationsOfItemsfrom the "Helper Function Collection" extension
- 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
- Adapted the plugin following the assessment by the WordPress Plugin Review team.
- Recipes: Replace
mysite.comwith the site domain - Added recipe: Automatically sending newsletter subscribers from InstaWP to Mailchimp
- The
operationNameparam can be obtained from the URL even when doingPOST
- Return
Stringin fieldsRoot.optionValueandWithMeta.metaValue
- Constants in
wp-config.phpmust start withGATOGRAPHQL_(previously wasGATO_GRAPHQL_)
- 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
createPostandupdatePostnow have inputauthorBy, 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
anystatus - 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_ENDPOINTwith URL of internalblockEditorendpoint
- Added JS variable
- 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
- Made field
Comment.typeof typeCommentTypeEnum(previously wasString) - Avoid error from loading non-existing translation files
- Updated all documentation images
- Upgraded minimum PHP version to 7.2
- Must update mutations
createPost,updatePost,addCommentToCustomPost(and others) - Must update mutations
setTagsOnPost,createPostandupdatePost - Must adapt filtering data for
posts,customPostsandcomments - Non-restrictive Settings values are used by default
- Env var
ENABLE_UNSAFE_DEFAULTShas been removed andSETTINGS_OPTION_ENABLE_RESTRICTIVE_DEFAULT_BEHAVIORadded in its place, to indicate to use the restrictive Settings values by default - Renamed plugin to "Gato GraphQL"
- Performance issue where elements to resolve AST were duplicated (#2039)
- 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"
- Modified value for
allowbehavior option in settings
- Improved query-resolution performance (by caching method results in PHP)
- Added field
globalIDto all types in the schema - In addition to
id, fetch single entities byslug,pathand other properties, on fields:Root.customPostRoot.genericCustomPostRoot.mediaItemRoot.menuRoot.pageRoot.postCategoryRoot.postTagRoot.postRoot.user
- Filter elements via the new
filterfield argument - Pagination and sorting fields are accessed via
paginationandsortfield args customPostsfields 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: StringexcludeAuthorIDs: [ID]hasPassword: Boolpassword: String
- Filter by
metaQuery - Exclude results via field arg
excludeIDs - Added field
urlPathon several types:Post.urlPath: String!Page.urlPath: String!PostTag.urlPath: String!PostCategory.urlPath: String!User.urlPath: String!
contentfields (for typesPost,PageandComment) are now of typeHTML, and a newrawContentfield of typeStringwas 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: CustomPostUnionRoot.myCustomPosts: [CustomPostUnion]!Root.myCustomPostCount: Int!
- Query properties for custom post fields:
modified: DateTimemodifiedDateStr: String
- Query properties for posts:
Post.postFormat: String!isSticky: Bool!
- Fetch a page's parent and children, and the menu order:
Page.parent: PagePage.children: [Page]!Page.childCount: Int!Page.menuOrder: Int! - Filter field
pagesvia new arguments:parentIDs: [ID]parentID: ID
- Added fields to retrieve comments and their number:
Root.comment: CommentRoot.comments: [Comment]!Root.commentCount: Int!Root.myComment: CommentRoot.myComments: [Comment]!Root.myCommentCount: Int!Commentable.commentCount: Int!(Commentableis an interface, implemented by typesPost,PageandGenericCustomPost)Comment.responseCount: Int!
- Added field arguments to filter
comments:authorIDs: [ID!]customPostID: ID!customPostIDs: [ID!]excludeCustomPostIDs: [ID]customPostAuthorIDs: [ID!]excludeCustomPostAuthorIDs: [ID]customPostTypes: [String!]dateFrom: DatedateTo: DateexcludeAuthorIDs: [ID]excludeIDs: [ID!]ids: [ID!]parentID: ID!parentIDs: [ID!]excludeParentIDs: [ID]excludeIDs: [ID!]search: Stringtypes: [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
rolesandexcludeRolesto filter by user roles ("sensitive" input fields) - Fetch children from Categories:
PostCategory.children: [PostCategory]!PostCategory.childNames: [String]!PostCategory.childCount: Int
- Added filter input
hideEmptyto fieldspostTagsandpostCategoriesto fetch entries with/out any post - Added types
GenericTagandGenericCategoryto 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
filterinput properties:categoryTaxonomytagTaxonomy
- Added fields for Menus:
Root.menus: [Menu]!Root.menuCount: Int!Menu.name: StringMenu.slug: StringMenu.count: IntMenu.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.mediaItemsfor filtering results - Added media field:
Root.imageSizeNames: [String]!to retrieve the list of the available intermediate image size namesRoot.mediaItemCount: Int!to count the number of media items
- Added fields for media items:
Media.srcSet: StringMedia.url: String!Media.localURLPath: StringMedia.slug: String!Media.title: StringMedia.caption: StringMedia.altText: StringMedia.description: StringMedia.date: DateTimeMedia.dateStr: StringMedia.modified: DateTimeMedia.modifiedDateStr: StringMedia.mimeType: StringMedia.sizes: String
- Added fields to query options:
Root.optionValues: [AnyBuiltInScalar]Root.optionObjectValue: JSONObjectRoot.optionValue: AnyBuiltInScalar(renamed fromRoot.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!
CommentableandWithFeaturedImageinterfaces are only added to CPTs that support the feature
- Support for custom scalar types
- Implementation of standard custom scalar types
- Implementation of
Numericscalar - 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
- Implemented extension
- 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 newlines removed from GraphQL query after refreshing browser (#972)
- 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
- Replaced argument
idwithbyin fields fetching a single entity - Must update GraphQL queries to use the new
filter,paginationandsortfield arguments - Renamed module "Schema for the Admin" to "Expose Sensitive Data in the Schema"
- Renamed scalar type
AnyScalartoAnyBuiltInScalar - Renamed interface type
ElementaltoIdentifiableObject - Renamed field
Root.optiontoRoot.optionValue - Removed the
genericCustomPostsfields, unifying their logic intocustomPosts - All
datefields (such asPost.date,Media.dateandComment.date) andmodifiedfields are now of typeDateTime(before they had typeString) - Must update
content(format:PLAIN_TEXT)torawContent - Must update the inputs for mutations
- Merged the "sensitive" fields with the non-admin versions: instead of having fields
postsandunrestrainedPosts, now there is only fieldposts, and itsfilterargument can also receive inputstatuswhenExpose Sensitive Data in the Schemais enabled User.emailis 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
- Field
myPostsretrieving posts for all users, not logged-in user
- 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,FloatandID) - Cache is saved under the
wp-content - Split the GraphQL endpoint for accessing data for the WordPress editor into two:
GATOGRAPHQL_ADMIN_CONFIGURABLESCHEMA_ENDPOINTGATOGRAPHQL_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]])
- Lists with non-null items (
- 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_allallowed_block_types_all
- 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.
- 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
nullin 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)
- GraphiQL client returning 406 status error with ModSecurity (#436)
- Improved initialization speed (#412)
- Markdown pages not working (#433)
- Removed file
rector-test-scoping.phpfrom the plugin
- Scoped external dependencies (#246)
- Point GitHub Updater to GatoGraphQL/gatographql-dist
- Compatibility with PHP 8.0
- Compatibility with PHP 8.0
- Mutations and nested mutations (#28) - Thanks to WPKube for sponsoring this feature ❤️
- Mutations in the schema:
Root.createPostRoot.updatePostRoot.setFeaturedImageforCustomPostRoot.removeFeaturedImageforCustomPostRoot.addCommentToCustomPostRoot.replyCommentRoot.loginUserRoot.logoutUser
- Support for PHP 8.0
- Replaced the About page with the Support page
- Decreased the size of the plugin's
.zipfile:- Images are referenced from the GitHub repo, and not packed within the plugin anymore
- Removed all
package-lock.jsonfiles from the plugin
- 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
- Renamed field
echoasechoStrto avoid conflict with global fieldecho
- Use newly downgradable PHP 7.4 and 7.3 features (list reference assignment, array spread,
_in numeric literal)
- 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.2or 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
- Set the right version in plugin main file
- Made GraphiQL client in admin show the default GraphQL query
- 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
- 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
- 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)
- If the plugin is installed more than once (eg: by mistake because the .zip file has been renamed) then load only one version
- Lazy-load the documentation inside blocks
is_admin()or not affects the configuration, so this value must be accounted for when generating the cache- Logic for
options.phpis not executed when WP core or other plugins save their own settings
- 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:
- Directive
@exportis also disabled - The server respects the GraphQL spec concerning
operationName(https://spec.graphql.org/draft/#GetOperation())
- Directive
- Process only the operation indicated in
operationNamein 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
- Query Batching
- Directive aliases (through trait
AliasSchemaFieldDirectiveResolverTrait) - Field aliases on the server (through trait
AliasSchemaObjectTypeFieldResolverTrait)
- Enabled variables as expressions for
@export
- Non-default endpoints did not work after re-activating the plugin, WP requires to add hack to execute
flush_rewrite_rulesin first request after plugin is activated
- 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
- Added a GitHub action that, whenever the source code is tagged, creates the installable plugin and uploads it as a release asset
- 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
fullUrlfor SSL - Fixed issue to query users by email
- Launched project