[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f_R6J2KyBZJdjieCt9ptCK0jUoMwo1nJ1KlkfcE9Q3VA":3},{"slug":4,"display_name":4,"profile_url":5,"plugin_count":6,"total_installs":7,"avg_security_score":8,"avg_patch_time_days":9,"trust_score":10,"computed_at":11,"plugins":12},"leoloso","https:\u002F\u002Fprofiles.wordpress.org\u002Fleoloso\u002F",2,80,93,30,89,"2026-05-20T01:10:45.179Z",[13,38],{"slug":14,"name":15,"version":16,"author":4,"author_profile":5,"description":17,"short_description":18,"active_installs":19,"downloaded":20,"rating":21,"num_ratings":22,"last_updated":23,"tested_up_to":24,"requires_at_least":25,"requires_php":26,"tags":27,"homepage":33,"download_link":34,"security_score":21,"vuln_count":35,"unpatched_count":35,"last_vuln_date":36,"fetched_at":37},"gatographql","Gato GraphQL","17.1.1","\u003Cp>Gato GraphQL is a powerful and flexible GraphQL server for WordPress.\u003C\u002Fp>\n\u003Cp>Use it to expose WordPress data via GraphQL. Access any piece of data (posts, users, comments, tags, categories, etc) from your application, and also transform and mutate data.\u003C\u002Fp>\n\u003Cp>The \u003Ca href=\"https:\u002F\u002Fgatographql.com\" rel=\"nofollow ugc\">standard use cases\u003C\u002Fa> are:\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Code performant apps:\u003C\u002Fstrong> Send a GraphQL query to your API and get exactly what you need, nothing more and nothing less.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Build dynamic\u002Fheadless sites:\u003C\u002Fstrong> Use WordPress as the CMS to manage data, and your framework of choice to render the site.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Speed up creating Gutenberg blocks:\u003C\u002Fstrong> Ship Gutenberg blocks faster, by avoiding creating REST controllers to feed them data.\u003C\u002Fp>\n\u003Cp>With Gato GraphQL, you also have the flexibility to migrate your application from WordPress to another PHP-based framework or CMS (if ever needed) with minimal effort: The GraphQL server can run via its standalone PHP component (which doesn’t depend on WordPress), and only those resolvers fetching WordPress data (posts, users, comments, etc) used by your application would need to be ported. You can do \u003Cstrong>Headless WordPress without WordPress\u003C\u002Fstrong>, avoiding the vendor lock-in to WordPress.\u003C\u002Fp>\n\u003Ch3>Power Extensions\u003C\u002Fh3>\n\u003Cp>The \u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions#power-extensions\" rel=\"nofollow ugc\">Power Extensions\u003C\u002Fa> allow you to augment the server functionality.\u003C\u002Fp>\n\u003Cspan class=\"embed-youtube\" style=\"text-align:center; display: block;\">\u003Ciframe loading=\"lazy\" class=\"youtube-player\" width=\"750\" height=\"422\" src=\"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fd-Ap9axT7kE?version=3&rel=1&showsearch=0&showinfo=1&iv_load_policy=1&fs=1&hl=en-US&autohide=2&wmode=transparent\" allowfullscreen=\"true\" style=\"border:0;\" sandbox=\"allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox\">\u003C\u002Fiframe>\u003C\u002Fspan>\n\u003Cp>You can purchase a \u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fpricing#power-extensions\" rel=\"nofollow ugc\">bundle containing all the power extensions\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>The available power extensions are:\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions\u002Faccess-control\" rel=\"nofollow ugc\">Access Control\u003C\u002Fa>: Grant granular access to the schema (based on the user being logged-in, having some role or capability, or by IP), to manage who can access what data.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions\u002Fcaching\" rel=\"nofollow ugc\">Caching\u003C\u002Fa>: Make your application faster by providing HTTP Caching for the GraphQL response, and by caching the results of expensive operations.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions\u002Fcustom-endpoints\" rel=\"nofollow ugc\">Custom Endpoints\u003C\u002Fa>: Create and expose multiple custom GraphQL schemas under their own URL, for different users, applications, external services, or other.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions\u002Fdeprecation\" rel=\"nofollow ugc\">Deprecation\u003C\u002Fa>: Evolve the GraphQL schema by deprecating fields, and explaining how to replace them, through a user interface.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions\u002Fhttp-client\" rel=\"nofollow ugc\">HTTP Client\u003C\u002Fa>: Connect to and interact with external services via their APIs.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions\u002Finternal-graphql-server\" rel=\"nofollow ugc\">Internal GraphQL Server\u003C\u002Fa>: Execute GraphQL queries directly within your application, using PHP code.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions\u002Fmultiple-query-execution\" rel=\"nofollow ugc\">Multiple Query Execution\u003C\u002Fa>: Combine multiple queries into a single query, sharing state across them and executing them in the requested order.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions\u002Fpersisted-queries\" rel=\"nofollow ugc\">Persisted Queries\u003C\u002Fa>: Use GraphQL queries to create pre-defined endpoints as in REST, obtaining the benefits from both APIs.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions\u002Fquery-functions\" rel=\"nofollow ugc\">Query Functions\u003C\u002Fa>: Manipulate the values of fields within the GraphQL query, via a collection of utilities and special directives providing meta-programming capabilities.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions\u002Fschema-functions\" rel=\"nofollow ugc\">Schema Functions\u003C\u002Fa>: The GraphQL schema is provided with fields and directives which expose functionalities from the PHP programming language.\u003C\u002Fp>\n\u003Ch3>Premium Extensions\u003C\u002Fh3>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions#premium-extensions\" rel=\"nofollow ugc\">Premium Extensions\u003C\u002Fa> allow you to integrate popular services and WordPress plugins into the GraphQL schema, and automate the execution of queries.\u003C\u002Fp>\n\u003Cp>You can \u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fpricing#premium-extensions\" rel=\"nofollow ugc\">purchase each premium extension separately\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>The available premium extensions are:\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions\u002Fautomation\" rel=\"nofollow ugc\">Automation\u003C\u002Fa>: Use GraphQL to automate tasks in your app: Execute queries when some event happens, chain queries, and schedule and trigger queries via WP-Cron.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions\u002Fbricks\" rel=\"nofollow ugc\">Bricks\u003C\u002Fa>: Integration with the Bricks plugin, to parse and update data in Bricks pages and templates.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions\u002Felementor\" rel=\"nofollow ugc\">Elementor\u003C\u002Fa>: Integration with the Elementor plugin, to parse and update data in Elementor pages and templates.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions\u002Fevents-manager\" rel=\"nofollow ugc\">Events Manager\u003C\u002Fa>: Integration with the Events Manager plugin, to fetch event data.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions\u002Fjetengine\" rel=\"nofollow ugc\">JetEngine\u003C\u002Fa>: Integration with the JetEngine plugin, to fetch custom content types and related data.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions\u002Fmultilingualpress\" rel=\"nofollow ugc\">MultilingualPress\u003C\u002Fa>: Integration with the MultilingualPress plugin, to fetch multilingual data.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions\u002Fpolylang\" rel=\"nofollow ugc\">Polylang\u003C\u002Fa>: Integration with the Polylang plugin, adding fields and filters to select the language when fetching data on a multilingual site.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions\u002Ftranslation\" rel=\"nofollow ugc\">Translation\u003C\u002Fa>: Translate a field value using the service provider of your choice, among ChatGPT, Claude, DeepSeek, Mistral AI, DeepL, and Google Translate.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatographql.com\u002Fextensions\u002Fwoocommerce\" rel=\"nofollow ugc\">WooCommerce\u003C\u002Fa>: Integration with WooCommerce, to fetch product data.\u003C\u002Fp>\n\u003Ch3>Built with Gato GraphQL\u003C\u002Fh3>\n\u003Cp>All the plugins by \u003Ca href=\"https:\u002F\u002Fgatoplugins.com\" rel=\"nofollow ugc\">Gato Plugins\u003C\u002Fa> use Gato GraphQL under the hook.\u003C\u002Fp>\n\u003Cp>You can use Gato GraphQL to do everything offered by Gato Plugins!\u003C\u002Fp>\n\u003Cp>The plugins are:\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgatoplugins.com\u002Fplugins\u002Fai-translations-for-polylang\" rel=\"nofollow ugc\">Gato AI Translations for Polylang\u003C\u002Fa>: Automatically translate all content on your WordPress site, using the LLM of your choice: ChatGPT, Claude, DeepSeek, Mistral AI, DeepL, and Google Translate.\u003C\u002Fp>\n","Powerful and flexible GraphQL server for WordPress. Access any piece of data (posts, users, comments, tags, etc) from your app via a GraphQL API.",70,9461,100,36,"2026-03-24T08:11:00.000Z","6.9.4","6.1","8.1",[28,29,30,31,32],"api","decoupled","graphql","headless","webhook","https:\u002F\u002Fgatographql.com","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fgatographql.17.1.1.zip",0,null,"2026-04-16T10:56:18.058Z",{"slug":39,"name":40,"version":41,"author":4,"author_profile":5,"description":42,"short_description":43,"active_installs":44,"downloaded":45,"rating":21,"num_ratings":46,"last_updated":47,"tested_up_to":48,"requires_at_least":49,"requires_php":50,"tags":51,"homepage":56,"download_link":57,"security_score":58,"vuln_count":35,"unpatched_count":35,"last_vuln_date":36,"fetched_at":37},"block-metadata","Block Metadata","1.0.7","\u003Cp>This plugin helps convert WordPress into a manager of our digital content, to publish it in different mediums or platforms: not just the website, but also email, iOS\u002FAndroid apps, home-assistants (like Amazon Alexa) and others.\u003C\u002Fp>\n\u003Cp>It does this by extracting the metadata from all Gutenberg blocks inside of a blog post. Because each Gutenberg block stores its own content and properties, these ones can be extracted as metadata and exported through a JSON object, accessible through a REST API endpoint, to feed any application on any platform.\u003C\u002Fp>\n\u003Cp>The plugin makes the following REST API endpoints available:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u002Fwp-json\u002Fblock-metadata\u002Fv1\u002Fmetadata\u002F{POST_ID}: Extract all metadata from all Gutenberg blocks in a blog post with id {POST_ID}, converted to medium-agnostic (eg: removing all non-semantic HTML tags)\u003C\u002Fli>\n\u003Cli>\u002Fwp-json\u002Fblock-metadata\u002Fv1\u002Fdata\u002F{POST_ID}: Extract all data from all Gutenberg blocks in a blog post with id {POST_ID}, as originally stored in the block by Gutenberg (eg: containing HTML code)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Demonstration:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fnextapi.getpop.org\u002Fposts\u002Fcope-with-wordpress-post-demo-containing-plenty-of-blocks\u002F\" rel=\"nofollow ugc\">Blog post\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fnextapi.getpop.org\u002Fwp-json\u002Fblock-metadata\u002Fv1\u002Fdata\u002F1499\" rel=\"nofollow ugc\">Blog post’s Gutenberg blocks\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fnextapi.getpop.org\u002Fwp-json\u002Fblock-metadata\u002Fv1\u002Fmetadata\u002F1499\" rel=\"nofollow ugc\">Blog post’s medium-agnostic metadata\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>How does it work?\u003C\u002Fh4>\n\u003Cp>This plugin is based on the strategy called “Create Once, Publish Everywhere” (also called “COPE”), which reduces the amount of work needed to publish our content into different mediums by establishing a single source of truth for all content.\u003C\u002Fp>\n\u003Cp>Having content that works everywhere is not a trivial task, since each medium will have its own requirements. For instance, whereas HTML is valid for printing content for the web, this language is not valid for an iOS\u002FAndroid app; similarly, we can add classes to our HTML for the web, but these must be converted to styles for email.\u003C\u002Fp>\n\u003Cp>The solution is to separate form from content: The presentation and the meaning of the content must be decoupled, and only the meaning is used as the single source of truth. The presentation can then be added in another layer, specific to the selected medium. For instance, given the following piece of HTML code, the \u003Ccode>\u003Cp>\u003C\u002Fcode> is an HTML tag which applies mostly for the web, and attribute class=”align-center” is presentation (placing an element “on the center” makes sense for a screen-based medium, but not for an audio-based one such as Amazon Alexa):\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u003Cp class=\"align-center\">Hello world!\u003C\u002Fp>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Hence, this piece of content cannot be used as a single source of truth, and it must be converted into a format which separates the meaning from the presentation, such as the following piece of JSON code:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>{\n  content: \"Hello world!\",\n  placement: \"center\",\n  type: \"paragraph\"\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>This piece of code can be used as a single source of truth for content, since from it we can recreate once again the HTML code to use for the web, and procure an appropriate format for other mediums.\u003C\u002Fp>\n\u003Ch4>Supported Gutenberg blocks\u003C\u002Fh4>\n\u003Cp>This plugin attempts to extract the metadata for all Gutenberg blocks shipped in WordPress core; support for additional blocks, such as from plugins, can be added through hooks. Not all Gutenberg blocks can be supported (for instance, because they may only work for the web, or only make sense when applied to screen-based mediums, among other reasons).\u003C\u002Fp>\n\u003Cp>The following WordPress core blocks are currently not supported:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>\"core\u002Fcolumns\"\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\"core\u002Fcolumn\"\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\"core\u002Fcover\"\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\"core\u002Fhtml\"\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\"core\u002Ftable\"\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\"core\u002Fbutton\"\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\"core\u002Fmedia-text\"\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The following Gutenberg blocks are supported, and this plugin extracts their metadata:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>\"core\u002Fparagraph\"\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\"core\u002Fimage\"\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\"core-embed\u002Fyoutube\"\u003C\u002Fcode> (all other \u003Ccode>\"core-embed\"\u003C\u002Fcode> blocks can also be extracted, but must be implemented through a hook)\u003C\u002Fli>\n\u003Cli>\u003Ccode>\"core\u002Fheading\"\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\"core\u002Fgallery\"\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\"core\u002Flist\"\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\"core\u002Faudio\"\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\"core\u002Ffile\"\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\"core\u002Fvideo\"\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\"core\u002Fcode\"\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\"core\u002Fpreformatted\"\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\"core\u002Fquote\"\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\"core\u002Fpullquote\"\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\"core\u002Fverse\"\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>Extracting metadata for additional blocks\u003C\u002Fh4>\n\u003Cp>We can extend this plugin to extract the metadata for additional blocks, such as those shipped through plugins. To do this, simply add a hook for filter \u003Ccode>\"Leoloso\\BlockMetadata\\Metadata::blockMeta\"\u003C\u002Fcode> (located in function \u003Ccode>get_block_metadata($block_data)\u003C\u002Fcode> from class \u003Ccode>Metadata\u003C\u002Fcode> in file \u003Ccode>block-metadata\u002Fsrc\u002FMetadata.php\u003C\u002Fcode>). The attributes that must be extracted must be decided on a block type by block type basis:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>add_filter(\"Leoloso\\BlockMetadata\\Metadata::blockMeta\", \"extract_additional_block_metadata\", 10, 3);\nfunction extract_additional_block_metadata($blockMeta, $blockName, $block)\n{\n  if ($blockName == \"my-plugin\u002Fmy-block-name\") {\n    return array(\n      \"property1\" => $block[\"property1\"],\n      \"property2\" => $block[\"property2\"]\n    );\n  }\n\n  return $blockMeta;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4>Further references\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fleoloso.com\u002Fposts\u002Fmy-1st-wp-plugin\u002F\" rel=\"nofollow ugc\">Inspiration for the plugin\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fslides.com\u002Fleoloso\u002Fcope-with-wp\" rel=\"nofollow ugc\">Slides from presentation “COPE with WordPress”\u003C\u002Fa> (from WordCamp Singapore 2019), explaining how the plugin works\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>Contributing \u002F Reporting issues\u003C\u002Fh4>\n\u003Cp>Please head over to the project’s \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fleoloso\u002Fblock-metadata\" rel=\"nofollow ugc\">GitHub repo\u003C\u002Fa> for contributing, reporting issues or making suggestions, and others.\u003C\u002Fp>\n\u003Cp>\u003Cem>Banner image \u003Ca href=\"https:\u002F\u002Fwww.freepik.com\" rel=\"nofollow ugc\">designed by Freepik\u003C\u002Fa>\u003C\u002Fem>\u003C\u002Fp>\n","Extract all metadata from all Gutenberg blocks inside of a post",10,1907,1,"2020-04-15T03:37:00.000Z","5.4.19","5.0","5.6",[28,52,53,54,55],"block","content","gutenberg","metadata","https:\u002F\u002Fgithub.com\u002Fleoloso\u002Fblock-metadata","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fblock-metadata.1.0.7.zip",85]