{"id":75919,"date":"2026-07-30T03:29:08","date_gmt":"2026-07-30T06:29:08","guid":{"rendered":"https:\/\/kinsta.com\/pt\/?p=75919&#038;preview=true&#038;preview_id=75919"},"modified":"2026-08-05T10:08:47","modified_gmt":"2026-08-05T13:08:47","slug":"api-abilities-wordpress","status":"publish","type":"post","link":"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/","title":{"rendered":"Primeiros passos com a API Abilities do WordPress: um guia pr\u00e1tico"},"content":{"rendered":"<p>A API Abilities, introduzida no <a href=\"https:\/\/kinsta.com\/pt\/blog\/wordpress-6-9\/#abilities-api\">WordPress 6.9<\/a>, estabelece uma linguagem comum que permite que todos os componentes do WordPress \u2014 tanto o n\u00facleo quanto os plugins \u2014 exponham suas funcionalidades de forma unificada e compreens\u00edvel para pessoas e m\u00e1quinas. Isso prepara seu site WordPress para integra\u00e7\u00e3o com ferramentas externas de automa\u00e7\u00e3o de maneira padronizada e segura.<\/p>\n<p>Se voc\u00ea est\u00e1 se perguntando como a API Abilities pode ser utilizada na pr\u00e1tica, imagine um modelo de IA que orienta um usu\u00e1rio durante todo o processo de compra e at\u00e9 mesmo permite concluir a compra sem que ele precise acessar seu site de eCommerce. Ou imagine um <a href=\"https:\/\/kinsta.com\/pt\/blog\/como-configurar-pipeline-ci-cd\/\">pipeline de CI\/CD no GitHub Actions<\/a> que processa o texto extra\u00eddo de um arquivo de \u00e1udio ou v\u00eddeo e o envia ao WordPress para publica\u00e7\u00e3o. As possibilidades s\u00e3o praticamente ilimitadas.<\/p>\n<p>A API Abilities transforma o papel do WordPress dentro do ecossistema. Ele deixa de ser apenas um blog, ou mesmo um CMS, para atuar como um mecanismo de execu\u00e7\u00e3o distribu\u00eddo, que pode ser orquestrado externamente, funcionando como uma esp\u00e9cie de sistema operacional preparado para agentes aut\u00f4nomos.<\/p>\n<p>Quer saber mais? Vamos explorar o assunto.<br \/>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc><\/p>\n<h2>Para que serve uma ability<\/h2>\n<p>Uma <strong>ability<\/strong> \u00e9 um recurso descobr\u00edvel e execut\u00e1vel em um site WordPress que permite realizar opera\u00e7\u00f5es espec\u00edficas para entidades externas (como modelos de IA) ou componentes internos.<\/p>\n<p>A API pode ser utilizada para tarefas como:<\/p>\n<ul>\n<li>Pesquisar conte\u00fado ou executar opera\u00e7\u00f5es espec\u00edficas no banco de dados.<\/li>\n<li>Ler as configura\u00e7\u00f5es do site.<\/li>\n<li>Criar um artigo.<\/li>\n<li>Converter uma estrutura JSON em blocos do Gutenberg.<\/li>\n<\/ul>\n<p>Expor uma ability significa tornar uma funcionalidade espec\u00edfica interoper\u00e1vel. Antes que uma ability possa ser descoberta e utilizada, ela precisa ser registrada em um cat\u00e1logo centralizado. Somente ent\u00e3o o WordPress e os modelos de IA poder\u00e3o descobri-la, compreender seu prop\u00f3sito e execut\u00e1-la quando necess\u00e1rio.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Um esclarecimento importante: um modelo de IA nunca tem acesso direto ao seu site. Ele apenas solicita ao WordPress que execute uma opera\u00e7\u00e3o (por exemplo, &#8220;informe o n\u00famero total de artigos do site&#8221;) necess\u00e1ria para concluir sua tarefa.<\/p>\n<\/aside>\n\n<p>Por padr\u00e3o, as funcionalidades dos seus plugins permanecem totalmente isoladas. Ao registrar uma ability, voc\u00ea declara que a l\u00f3gica subjacente est\u00e1 dispon\u00edvel como um servi\u00e7o para todo o ecossistema.<\/p>\n<p>Vamos ver um exemplo. Se o seu plugin possui uma fun\u00e7\u00e3o que converte um objeto JSON inicial em conte\u00fado estruturado pronto para blocos do Gutenberg, voc\u00ea pode registr\u00e1-la como uma ability. Isso permite que outras ferramentas com as permiss\u00f5es necess\u00e1rias executem exatamente a mesma fun\u00e7\u00e3o.<\/p>\n<p>Em nosso tutorial anterior sobre o <a href=\"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/\">WordPress AI Client<\/a>, o plugin era respons\u00e1vel pela l\u00f3gica principal de enviar um arquivo de \u00e1udio para o modelo de IA, que retornava uma resposta estruturada em JSON para gerar blocos do Gutenberg. No entanto, essa funcionalidade permanecia restrita ao nosso plugin. Ao registrar esse processo como uma ability, voc\u00ea desacopla sua execu\u00e7\u00e3o, permitindo que qualquer entidade externa acione toda a l\u00f3gica do plugin simplesmente enviando um objeto JSON contendo o ID de um arquivo de \u00e1udio.<\/p>\n<p><strong>Uma \u201cability\u201d funciona como um contrato formal<\/strong> entre a l\u00f3gica PHP subjacente e qualquer entidade que solicite sua execu\u00e7\u00e3o. Esse contrato define quais dados a ability espera receber como entrada, qual \u00e9 seu prop\u00f3sito e qual esquema de dados ser\u00e1 retornado como sa\u00edda.<\/p>\n<p>Ao registrar uma ability, ela \u00e9 adicionada ao <a href=\"https:\/\/make.wordpress.org\/ai\/2025\/07\/17\/abilities-api\/\">registro de abilities<\/a> do seu site. A partir desse momento, o <strong>WordPress passa a atuar como um gateway seguro<\/strong>: ele verifica a autentica\u00e7\u00e3o e valida os dados recebidos com base no esquema definido pelo contrato. O WordPress s\u00f3 encaminha a solicita\u00e7\u00e3o para a fun\u00e7\u00e3o PHP correspondente quando a carga de dados (payload) atende rigorosamente aos requisitos estabelecidos pelo contrato.<\/p>\n<p><strong>Uma ability \u00e9 agn\u00f3stica<\/strong>. O WordPress n\u00e3o precisa saber qual entidade est\u00e1 solicitando acesso; ele apenas verifica se a solicita\u00e7\u00e3o est\u00e1 autorizada e se atende \u00e0s restri\u00e7\u00f5es definidas pelo contrato.<\/p>\n<p>Ao registrar uma ability, seu plugin deixa de ser apenas uma extens\u00e3o com l\u00f3gica interna pr\u00f3pria e passa a atuar como um provedor de servi\u00e7os para todo o ecossistema. Seja um aplicativo m\u00f3vel, um script de automa\u00e7\u00e3o como Make.com ou <a href=\"https:\/\/kinsta.com\/pt\/blog\/woocommerce-zapier\/\">Zapier<\/a>, um agente de IA ou um servidor que se comunica por meio do <a href=\"https:\/\/kinsta.com\/pt\/blog\/mcp-server-kinsta-api\/\">protocolo MCP<\/a>, todas essas entidades saber\u00e3o exatamente como acionar opera\u00e7\u00f5es estruturadas no seu site.<\/p>\n<h2>Trabalhando com a API Abilities<\/h2>\n<p>A API Abilities fornece um <a href=\"https:\/\/github.com\/WordPress\/abilities-api\/blob\/trunk\/docs\/php-api.md\">conjunto abrangente de fun\u00e7\u00f5es<\/a> que permitem descobrir as abilities registradas no seu site, execut\u00e1-las, al\u00e9m de registrar e remover o registro de abilities.<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h3\" count-number=\"3\" sub-toc=\"true\"><\/kinsta-auto-toc><\/p>\n<h3>Trabalhando com as abilities do seu site<\/h3>\n<p>Voc\u00ea pode recuperar uma lista de todas as abilities registradas ou obter um objeto ability espec\u00edfico. Tamb\u00e9m \u00e9 poss\u00edvel verificar determinadas condi\u00e7\u00f5es, como confirmar se uma ability est\u00e1 registrada ou se o agente possui as permiss\u00f5es necess\u00e1rias para execut\u00e1-la.<br \/>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h4\" count-number=\"4\" sub-toc=\"true\"><\/kinsta-auto-toc><\/p>\n<h4>Obter uma lista das abilities registradas no seu site<\/h4>\n<p>A <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_abilities\/\" target=\"_blank\" rel=\"noopener noreferrer\">fun\u00e7\u00e3o <code>wp_get_abilities()<\/code><\/a> retorna um array com\u00a0todas as <strong>abilities<\/strong> registradas. Voc\u00ea pode test\u00e1-la usando o <a href=\"https:\/\/kinsta.com\/pt\/blog\/wp-cli-v2\/\">WP-CLI<\/a>. Depois de se <a href=\"https:\/\/kinsta.com\/pt\/blog\/desenvolvimento-remoto-wordpress-kinsta-ssh\/\">conectar ao seu site via SSH<\/a>, navegue\u00a0 at\u00e9 o diret\u00f3rio raiz do site, onde est\u00e1 localizado o <a href=\"https:\/\/kinsta.com\/pt\/blog\/wp-config-php\/\">arquivo <code>wp-config.php<\/code><\/a>, utilizando os seguintes comandos:<\/p>\n<pre><code class=\"language-bash\">cd \/path\/to\/your\/site\nls wp-config.php<\/code><\/pre>\n<p>Em seguida, verifique se o WP-CLI reconhece a instala\u00e7\u00e3o do seu site:<\/p>\n<pre><code class=\"language-bash\">wp core is-installed\nwp option get siteurl<\/code><\/pre>\n<p>Se voc\u00ea receber a URL do seu site, est\u00e1 tudo pronto para executar o comando a seguir:<\/p>\n<pre><code class=\"language-bash\">wp eval '$abilities = wp_get_abilities(); foreach ( $abilities as $a ) { echo $a-&gt;get_name() . PHP_EOL; }'<\/code><\/pre>\n<p>Esse comando executa <a href=\"https:\/\/developer.wordpress.org\/cli\/commands\/eval\/\" target=\"_blank\" rel=\"noopener noreferrer\">c\u00f3digo PHP no seu terminal<\/a>. O c\u00f3digo PHP solicita os nomes de todas as abilities registradas no seu site e, por padr\u00e3o, deve retornar a seguinte resposta:<\/p>\n<pre><code class=\"language-bash\">core\/get-site-info\ncore\/get-user-info\ncore\/get-environment-info<\/code><\/pre>\n<p>Voc\u00ea pode solicitar um conjunto mais completo de dados com o seguinte comando:<\/p>\n<pre><code class=\"language-bash\">wp eval '\n$all_abilities = wp_get_abilities();\n\nforeach ( $all_abilities as $ability ) {\n\techo \"Ability Name: \" . esc_html( $ability-&gt;get_name() ) . \"\\n\";\n\techo \"Label: \" . esc_html( $ability-&gt;get_label() ) . \"\\n\";\n\techo \"Category: \" . esc_html( $ability-&gt;get_category() ) . \"\\n\";\n\techo \"Description: \" . esc_html( $ability-&gt;get_description() ) . \"\\n\";\n\techo \"---\\n\";\n}\n'<\/code><\/pre>\n<p>Quando voc\u00ea executar esse comando em um site novo do <a href=\"https:\/\/kinsta.com\/pt\/blog\/wordpress-7-0\/\">WordPress 7.0<\/a>, o terminal vai mostrar a seguinte resposta:<\/p>\n<pre><code>Ability Name: core\/get-site-info\nLabel: Get Site Information\nCategory: site\nDescription: Returns site information configured in WordPress. By default returns all fields, or optionally a filtered subset.\n---\nAbility Name: core\/get-user-info\nLabel: Get User Information\nCategory: user\nDescription: Returns profile details for the current authenticated user to support personalization, auditing, and access-aware behavior. By default returns all fields, or optionally a filtered subset.\n---\nAbility Name: core\/get-environment-info\nLabel: Get Environment Info\nCategory: site\nDescription: Returns core details about the site's runtime context for diagnostics and compatibility (environment, PHP runtime, database server info, WordPress version). By default returns all fields, or optionally a filtered subset.\n---<\/code><\/pre>\n<h4>Obter um objeto ability<\/h4>\n<p>A <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_ability\/\" target=\"_blank\" rel=\"noopener noreferrer\">fun\u00e7\u00e3o <code>wp_get_ability()<\/code><\/a> retorna um \u00fanico objeto ability com base em seu nome. Voc\u00ea pode test\u00e1-la no WP-CLI usando o seguinte comando:<\/p>\n<pre><code class=\"language-bash\">wp eval '\n$ability = wp_get_ability( \"core\/get-site-info\" );\n\nif ( ! $ability ) {\n\techo \"Ability not found\\n\";\n\texit( 1 );\n}\n\necho \"Name: \" . $ability-&gt;get_name() . \"\\n\";\necho \"Label: \" . $ability-&gt;get_label() . \"\\n\";\necho \"Category: \" . $ability-&gt;get_category() . \"\\n\";\necho \"Description: \" . $ability-&gt;get_description() . \"\\n\";\necho \"\\nInput Schema:\\n\";\nvar_dump( $ability-&gt;get_input_schema() );\necho \"\\nOutput Schema:\\n\";\nvar_dump( $ability-&gt;get_output_schema() );\necho \"\\nMeta:\\n\";\nvar_dump( $ability-&gt;get_meta() );\n'<\/code><\/pre>\n<p>Se a ability estiver corretamente registrada no seu site, voc\u00ea receber\u00e1 a seguinte resposta no terminal:<\/p>\n<pre><code>Name: core\/get-site-info\nLabel: Get Site Information\nCategory: site\nDescription: Returns site information configured in WordPress. By default returns all fields, or optionally a filtered subset.\n\nInput Schema:\narray(4) {\n  [\"type\"]=&gt;\n  string(6) \"object\"\n  [\"properties\"]=&gt;\n  array(1) {\n\t[\"fields\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(5) \"array\"\n\t  [\"items\"]=&gt;\n\t  array(2) {\n\t\t[\"type\"]=&gt;\n\t\tstring(6) \"string\"\n\t\t[\"enum\"]=&gt;\n\t\tarray(8) {\n\t\t  [0]=&gt;\n\t\t  string(4) \"name\"\n\t\t  [1]=&gt;\n\t\t  string(11) \"description\"\n\t\t  [2]=&gt;\n\t\t  string(3) \"url\"\n\t\t  [3]=&gt;\n\t\t  string(5) \"wpurl\"\n\t\t  [4]=&gt;\n\t\t  string(11) \"admin_email\"\n\t\t  [5]=&gt;\n\t\t  string(7) \"charset\"\n\t\t  [6]=&gt;\n\t\t  string(8) \"language\"\n\t\t  [7]=&gt;\n\t\t  string(7) \"version\"\n\t\t}\n\t  }\n\t  [\"description\"]=&gt;\n\t  string(81) \"Optional: Limit response to specific fields. If omitted, all fields are returned.\"\n\t}\n  }\n  [\"additionalProperties\"]=&gt;\n  bool(false)\n  [\"default\"]=&gt;\n  array(0) {\n  }\n}\n\nOutput Schema:\narray(3) {\n  [\"type\"]=&gt;\n  string(6) \"object\"\n  [\"properties\"]=&gt;\n  array(8) {\n\t[\"name\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(10) \"Site Title\"\n\t  [\"description\"]=&gt;\n\t  string(15) \"The site title.\"\n\t}\n\t[\"description\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(7) \"Tagline\"\n\t  [\"description\"]=&gt;\n\t  string(17) \"The site tagline.\"\n\t}\n\t[\"url\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(18) \"Site Address (URL)\"\n\t  [\"description\"]=&gt;\n\t  string(94) \"The public URL where visitors access the site. May differ from the WordPress installation URL.\"\n\t}\n\t[\"wpurl\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(23) \"WordPress Address (URL)\"\n\t  [\"description\"]=&gt;\n\t  string(83) \"The URL where WordPress core files are served. May differ from the public site URL.\"\n\t}\n\t[\"admin_email\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(28) \"Administration Email Address\"\n\t  [\"description\"]=&gt;\n\t  string(37) \"The site administrator email address.\"\n\t}\n\t[\"charset\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(12) \"Site Charset\"\n\t  [\"description\"]=&gt;\n\t  string(28) \"The site character encoding.\"\n\t}\n\t[\"language\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(13) \"Site Language\"\n\t  [\"description\"]=&gt;\n\t  string(42) \"The site locale in dash form (e.g. en-US).\"\n\t}\n\t[\"version\"]=&gt;\n\tarray(3) {\n\t  [\"type\"]=&gt;\n\t  string(6) \"string\"\n\t  [\"title\"]=&gt;\n\t  string(17) \"WordPress Version\"\n\t  [\"description\"]=&gt;\n\t  string(48) \"The WordPress core version running on this site.\"\n\t}\n  }\n  [\"additionalProperties\"]=&gt;\n  bool(false)\n}\n\nMeta:\narray(2) {\n  [\"annotations\"]=&gt;\n  array(3) {\n\t[\"readonly\"]=&gt;\n\tbool(true)\n\t[\"destructive\"]=&gt;\n\tbool(false)\n\t[\"idempotent\"]=&gt;\n\tbool(true)\n  }\n  [\"show_in_rest\"]=&gt;\n  bool(true)\n}<\/code><\/pre>\n<h4>Verificar se uma ability est\u00e1 registrada<\/h4>\n<p>A <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_has_ability\/\" target=\"_blank\" rel=\"noopener noreferrer\">fun\u00e7\u00e3o <code>wp_has_ability()<\/code><\/a> permite verificar se uma ability est\u00e1 registrada. No WP-CLI, voc\u00ea pode utiliz\u00e1-la da seguinte forma:<\/p>\n<pre><code class=\"language-bash\">wp eval '\nif ( wp_has_ability( \"core\/get-site-info\" ) ) {\n\techo \"\u2713 core\/get-site-info is registered\\n\";\n} else {\n\techo \"\u2717 core\/get-site-info not found\\n\";\n}\n'<\/code><\/pre>\n<p>Se a ability estiver registrada, a seguinte mensagem ser\u00e1 exibida no terminal:<\/p>\n<pre><code class=\"language-bash\">\u2713 core\/get-site-info is registered<\/code><\/pre>\n<h4>Verificar as permiss\u00f5es do agente<\/h4>\n<p>Voc\u00ea pode verificar se o usu\u00e1rio atual possui as permiss\u00f5es necess\u00e1rias para executar uma ability usando o <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_ability\/check_permissions\/\" target=\"_blank\" rel=\"noopener noreferrer\">m\u00e9todo <code>check_permissions()<\/code><\/a>\u00a0do objeto <code>$ability<\/code>. Esse m\u00e9todo retorna <code>true<\/code>, <code>false<\/code> ou um objeto <code>WP_Error<\/code>. Vamos cham\u00e1-lo pelo terminal usando o seguinte comando do WP-CLI:<\/p>\n<pre><code class=\"language-bash\">wp --user=1 eval '\n$ability = wp_get_ability( \"core\/get-site-info\" );\nif ( $ability ) {\n\t$has_permissions = $ability-&gt;check_permissions();\n\tif ( true === $has_permissions ) {\n\t\techo \"You have permissions to execute this ability.\";\n\t} else {\n\t\tif ( is_wp_error( $has_permissions ) ) {\n\t\t\terror_log( \"Permissions check failed: \" . $has_permissions-&gt;get_error_message() );\n\t\t}\n\t\techo \"You do not have permissions to execute this ability.\";\n\t}\n} else {\n\techo \"Ability not found.\";\n}\n'<\/code><\/pre>\n<p>Neste exemplo, definimos <code>--user=1<\/code>; por isso, voc\u00ea receber\u00e1 a seguinte resposta:<\/p>\n<pre><code class=\"language-bash\">You have permissions to execute this ability.<\/code><\/pre>\n<h3>Registrar uma ability<\/h3>\n<p>Agora \u00e9 hora de registrar uma ability. Para demonstrar um caso de uso real, vamos estender o plugin apresentado em <a href=\"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/\">nosso artigo sobre o WordPress AI Client<\/a>. Esse plugin envia um arquivo de \u00e1udio para um modelo de IA, extrai o texto e inicia a gera\u00e7\u00e3o de blocos do Gutenberg. Nesta se\u00e7\u00e3o, veremos como registrar esse processo como uma ability, permitindo que qualquer entidade com as permiss\u00f5es necess\u00e1rias possa descobri-lo e utiliz\u00e1-lo.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Nos exemplos a seguir, mostramos apenas o c\u00f3digo essencial. Para experimentar o c\u00f3digo apresentado nesta se\u00e7\u00e3o, recomendamos baixar o plugin <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder-next\">AI Content Builder Next<\/a> no GitHub e instal\u00e1-lo manualmente em um site WordPress local ou em um ambiente de teste.<\/p>\n<\/aside>\n\n<p>Antes de registrar uma nova ability, voc\u00ea precisa registrar uma nova categoria de abilities.<\/p>\n<p>Para isso, voc\u00ea vai precisar conectar a <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_register_ability_category\/\" target=\"_blank\" rel=\"noopener noreferrer\">fun\u00e7\u00e3o <code>wp_register_ability_category()<\/code> <\/a>ao hook \u00a0<code>wp_abilities_api_categories_init<\/code>.<\/p>\n<p>A fun\u00e7\u00e3o aceita um slug exclusivo para a categoria e um array associativo com os argumentos da configura\u00e7\u00e3o.<\/p>\n<p>Veja como registrar uma categoria de abilities:<\/p>\n<pre><code class=\"language-php\">function aicb_register_ability_category(): void {\n\n\tif ( ! function_exists( 'wp_register_ability_category' ) ) {\n\t\treturn;\n\t}\n\n\twp_register_ability_category(\n\t\t'content-generation',\n\t\tarray(\n\t\t\t'label'       =&gt; 'Content Generation',\n\t\t\t'description' =&gt; 'AI-powered content transformation and structuring abilities',\n\t\t)\n\t);\n}\nadd_action( 'wp_abilities_api_categories_init', 'aicb_register_ability_category' );<\/code><\/pre>\n<p>O pr\u00f3ximo passo \u00e9 registrar a ability. Para isso, conecte a <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_register_ability\/\" target=\"_blank\" rel=\"noopener noreferrer\">fun\u00e7\u00e3o <code>wp_register_ability()<\/code><\/a> \u00e0 a\u00e7\u00e3o <code>wp_abilities_api_init<\/code>.<\/p>\n<p>A fun\u00e7\u00e3o aceita dois argumentos: o nome da ability, incluindo seu namespace, e um array com os argumentos de configura\u00e7\u00e3o da ability.<\/p>\n<p>Veja como registrar a ability no plugin <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder-next\/blob\/main\/abilities.php\" target=\"_blank\" rel=\"noopener noreferrer\">AI Content Builder<\/a>:<\/p>\n<pre><code class=\"language-php\">function aicb_register_audio_to_gutenberg_blocks_ability(): void {\n\n\tif ( ! function_exists( 'wp_register_ability' ) ) {\n\t\treturn;\n\t}\n\n\t$input_schema = array( ... );\n\n\t$output_schema = array( ... );\n\n\twp_register_ability(\n\t\t'ai-content-builder\/audio-to-gutenberg-blocks',\n\t\tarray(\n\t\t\t'category'            =&gt; 'content-generation',\n\t\t\t'label'               =&gt; 'Audio to Gutenberg Blocks',\n\t\t\t'description'         =&gt; 'Transcribes audio and converts the content into WordPress Gutenberg-compatible block objects.',\n\t\t\t'input_schema'        =&gt; $input_schema,\n\t\t\t'output_schema'       =&gt; $output_schema,\n\t\t\t'execute_callback'    =&gt; 'aicb_audio_to_gutenberg_blocks_callback',\n\t\t\t'permission_callback' =&gt; static function (): bool {\n\t\t\t\treturn current_user_can( 'edit_posts' );\n\t\t\t},\n\t\t\t'meta'                =&gt; array(\n\t\t\t\t'show_in_rest' =&gt; true,\n\t\t\t\t'annotations'  =&gt; array(\n\t\t\t\t\t'readonly'     =&gt; false,\n\t\t\t\t\t'destructive'  =&gt; false,\n\t\t\t\t\t'idempotent'   =&gt; false,\n\t\t\t\t\t'instructions' =&gt; 'Processes an audio attachment: transcribes it, generates structured blog content via AI, and returns Gutenberg-ready block objects.',\n\t\t\t\t),\n\t\t\t),\n\t\t)\n\t);\n}\nadd_action( 'wp_abilities_api_init', 'aicb_register_audio_to_gutenberg_blocks_ability' );<\/code><\/pre>\n<p>Na chamada da fun\u00e7\u00e3o <code>wp_register_ability<\/code>, configuramos os seguintes argumentos:<\/p>\n<ul>\n<li><code>category<\/code>: a categoria \u00e0 qual a ability pertence.<\/li>\n<li><code>label<\/code>: o nome de exibi\u00e7\u00e3o da ability.<\/li>\n<li><code>description<\/code>: uma breve descri\u00e7\u00e3o do que a ability faz e qual \u00e9 a sua finalidade.<\/li>\n<li><code>input_schema<\/code>: o esquema de dados para os argumentos de entrada.<\/li>\n<li><code>output_schema<\/code>: o esquema de dados retornado pela ability.<\/li>\n<li><code>execute_callback<\/code>: a fun\u00e7\u00e3o de callback executada quando a ability \u00e9 acionada.<\/li>\n<li><code>permission_callback<\/code>: a fun\u00e7\u00e3o de callback executada para verificar se o agente possui as permiss\u00f5es necess\u00e1rias para executar a ability.<\/li>\n<li><code>meta<\/code>: um array com campos adicionais de metadados da ability.<\/li>\n<li><code>show_in_rest<\/code>: determina se a ability ser\u00e1 exposta pela API REST do WordPress.<\/li>\n<li><code>annotations<\/code>: um array de elementos descritivos que definem o comportamento da ability.<\/li>\n<\/ul>\n<p>O <code data-start=\"1010\" data-end=\"1024\">input_schema<\/code> \u00e9 um array que define o contrato de entrada da ability. Ele representa a defini\u00e7\u00e3o do JSON Schema usada para validar os dados de entrada. No nosso caso espec\u00edfico, ele \u00e9 definido assim:<\/p>\n<pre><code class=\"language-php\">$input_schema = array(\n\t'type'       =&gt; 'object',\n\t'properties' =&gt; array(\n\t\t'audio_id' =&gt; array(\n\t\t\t'type'        =&gt; 'integer',\n\t\t\t'description' =&gt; 'The ID of the audio attachment to process and convert into Gutenberg blocks.',\n\t\t),\n\t),\n\t'required'   =&gt; array( 'audio_id' ),\n);<\/code><\/pre>\n<p>Esse JSON Schema representa o formato que os dados de entrada devem seguir para que essa ability possa ser utilizada.<\/p>\n<p>O <code>output_schema<\/code> define o contrato de sa\u00edda retornado pela ability. Em nosso exemplo, cada item \u00e9 um objeto que representa um bloco em JSON:<\/p>\n<pre><code class=\"language-php\">$output_schema = array(\n\t'type'       =&gt; 'object',\n\t'properties' =&gt; array(\n\t\t'title'      =&gt; array( 'type' =&gt; 'string' ),\n\t\t'sections'   =&gt; array(\n\t\t\t'type'  =&gt; 'array',\n\t\t\t'items' =&gt; array( 'type' =&gt; 'object' ),\n\t\t),\n\t\t'blocks'     =&gt; array(\n\t\t\t'type'  =&gt; 'array',\n\t\t\t'items' =&gt; array( 'type' =&gt; 'object' ),\n\t\t),\n\t\t'transcript' =&gt; array( 'type' =&gt; 'string' ),\n\t),\n\t'required'   =&gt; array( 'blocks' ),\n);<\/code><\/pre>\n<p>O pr\u00f3ximo passo \u00e9 definir a fun\u00e7\u00e3o de callback que ser\u00e1 executada quando a ability for acionada (veja o <a href=\"https:\/\/github.com\/carlodaniele\/ai-content-builder-next\/blob\/main\/abilities.php#L483\" target=\"_blank\" rel=\"noopener noreferrer\">c\u00f3digo completo no GitHub<\/a>):<\/p>\n<pre><code class=\"language-php\">function aicb_audio_to_gutenberg_blocks_callback( array $args ) {\n\n\t\/\/ missing code\n\t\/\/ see GitHub\n\t...\n\n\t$structured_json = wp_ai_client_prompt( $prompt )\n\t\t-&gt;using_system_instruction( $instructions )\n\t\t-&gt;using_temperature( 0.4 )\n\t\t-&gt;as_json_response( $schema )\n\t\t-&gt;generate_text();\n\n\tif ( is_wp_error( $structured_json ) ) {\n\t\treturn $structured_json;\n\t}\n\n\t$structured = json_decode( (string) $structured_json, true );\n\tif ( ! is_array( $structured ) ) {\n\t\treturn new \\WP_Error(\n\t\t\t'invalid_ai_json',\n\t\t\t'Could not parse structured AI response.',\n\t\t\tarray( 'status' =&gt; 500 )\n\t\t);\n\t}\n\n\t\/\/ Normalize the output.\n\t$normalized = aicb_normalize_structured_post( $structured );\n\n\tif ( '' === $normalized['title'] && empty( $normalized['sections'] ) ) {\n\t\treturn new \\WP_Error(\n\t\t\t'empty_structured_content',\n\t\t\t'The AI provider returned empty structured content.',\n\t\t\tarray( 'status' =&gt; 500 )\n\t\t);\n\t}\n\n\t\/\/ Convert to Gutenberg blocks.\n\t$blocks = aicb_sections_to_blocks( $normalized['title'], $normalized['sections'] );\n\n\treturn $blocks;\n}<\/code><\/pre>\n<p>Essa fun\u00e7\u00e3o invoca duas fun\u00e7\u00f5es personalizadas. A primeira (<code>aicb_normalize_structured_post<\/code>) normaliza a sa\u00edda do modelo de IA para um formato predefinido e sanitiza os dados:<\/p>\n<pre><code class=\"language-php\">function aicb_normalize_structured_post( array $structured ): array {\n\t$title = isset( $structured['title'] )\n\t\t? sanitize_text_field( (string) $structured['title'] )\n\t\t: '';\n\n\t$sections = array();\n\n\tif ( isset( $structured['sections'] ) && is_array( $structured['sections'] ) ) {\n\t\tforeach ( $structured['sections'] as $section ) {\n\t\t\tif ( ! is_array( $section ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$heading = isset( $section['heading'] )\n\t\t\t\t? sanitize_text_field( (string) $section['heading'] )\n\t\t\t\t: '';\n\n\t\t\t$level = 2;\n\n\t\t\t$paragraphs = array();\n\t\t\tif ( isset( $section['paragraphs'] ) && is_array( $section['paragraphs'] ) ) {\n\t\t\t\tforeach ( $section['paragraphs'] as $paragraph ) {\n\t\t\t\t\t$clean_paragraph = trim( sanitize_textarea_field( (string) $paragraph ) );\n\t\t\t\t\tif ( '' !== $clean_paragraph ) {\n\t\t\t\t\t\t$paragraphs[] = $clean_paragraph;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$bullet_points = array();\n\t\t\tif ( isset( $section['bullet_points'] ) && is_array( $section['bullet_points'] ) ) {\n\t\t\t\tforeach ( $section['bullet_points'] as $bullet_point ) {\n\t\t\t\t\t$clean_bullet_point = trim( sanitize_text_field( (string) $bullet_point ) );\n\t\t\t\t\tif ( '' !== $clean_bullet_point ) {\n\t\t\t\t\t\t$bullet_points[] = $clean_bullet_point;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( '' === $heading || empty( $paragraphs ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$sections[] = array(\n\t\t\t\t'heading'       =&gt; $heading,\n\t\t\t\t'level'         =&gt; $level,\n\t\t\t\t'paragraphs'    =&gt; $paragraphs,\n\t\t\t\t'bullet_points' =&gt; $bullet_points,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn array(\n\t\t'title'    =&gt; $title,\n\t\t'sections' =&gt; $sections,\n\t);\n}<\/code><\/pre>\n<p>A fun\u00e7\u00e3o recebe um array estruturado de objetos JSON, normaliza e sanitiza os dados e retorna um array contendo o t\u00edtulo e as se\u00e7\u00f5es.<\/p>\n<p>A segunda fun\u00e7\u00e3o (<code>aicb_sections_to_blocks<\/code>) converte os dados normalizados em objetos descritores de blocos e \u00e9 definida da seguinte forma:<\/p>\n<pre><code class=\"language-php\">function aicb_sections_to_blocks( string $title, array $sections ): array {\n\t$blocks = array();\n\n\tforeach ( $sections as $section ) {\n\t\tif ( ! is_array( $section ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t$heading = isset( $section['heading'] ) ? trim( (string) $section['heading'] ) : '';\n\t\tif ( '' === $heading ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t$paragraphs = array();\n\t\tif ( isset( $section['paragraphs'] ) && is_array( $section['paragraphs'] ) ) {\n\t\t\tforeach ( $section['paragraphs'] as $paragraph ) {\n\t\t\t\t$clean = trim( (string) $paragraph );\n\t\t\t\tif ( '' !== $clean ) {\n\t\t\t\t\t$paragraphs[] = $clean;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( empty( $paragraphs ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t$blocks[] = array(\n\t\t\t'name'       =&gt; 'core\/heading',\n\t\t\t'attributes' =&gt; array(\n\t\t\t\t'content' =&gt; $heading,\n\t\t\t\t'level'   =&gt; 2,\n\t\t\t),\n\t\t);\n\n\t\tforeach ( $paragraphs as $paragraph ) {\n\t\t\t$blocks[] = array(\n\t\t\t\t'name'       =&gt; 'core\/paragraph',\n\t\t\t\t'attributes' =&gt; array(\n\t\t\t\t\t'content' =&gt; $paragraph,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif ( isset( $section['bullet_points'] ) && is_array( $section['bullet_points'] ) ) {\n\t\t\t$bullet_items_html = '';\n\n\t\t\tforeach ( $section['bullet_points'] as $bullet_point ) {\n\t\t\t\t$clean_bullet = trim( sanitize_text_field( (string) $bullet_point ) );\n\t\t\t\tif ( '' === $clean_bullet ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t\/\/ core\/list expects HTML in the `values` attribute.\n\t\t\t\t$bullet_items_html .= '&lt;li&gt;' . esc_html( $clean_bullet ) . '&lt;\/li&gt;';\n\t\t\t}\n\n\t\t\tif ( '' !== $bullet_items_html ) {\n\t\t\t\t$blocks[] = array(\n\t\t\t\t\t'name'       =&gt; 'core\/list',\n\t\t\t\t\t'attributes' =&gt; array(\n\t\t\t\t\t\t'values' =&gt; '&lt;ul&gt;' . $bullet_items_html . '&lt;\/ul&gt;',\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn $blocks;\n}<\/code><\/pre>\n<p>Os principais destaques dessa fun\u00e7\u00e3o s\u00e3o:<\/p>\n<ul>\n<li>A fun\u00e7\u00e3o aceita dois argumentos: uma string que representa o t\u00edtulo do artigo e um array com as se\u00e7\u00f5es geradas pelo modelo de IA.<\/li>\n<li>Para cada se\u00e7\u00e3o, a fun\u00e7\u00e3o gera um t\u00edtulo e pelo menos um par\u00e1grafo.<\/li>\n<li>Se houver marcadores (<em>bullet points<\/em>), ela gera a quantidade correspondente de itens de lista.<\/li>\n<li>A fun\u00e7\u00e3o retorna um array <code>$blocks<\/code> de objetos descritores de blocos, que corresponde ao contrato de sa\u00edda retornado pela ability (<code>$output_schema<\/code>).<\/li>\n<\/ul>\n<p>Observe que a sa\u00edda da fun\u00e7\u00e3o n\u00e3o \u00e9 a marca\u00e7\u00e3o (<em>markup<\/em>) bruta dos blocos. Ela ser\u00e1 gerada no lado do cliente pela fun\u00e7\u00e3o JavaScript <code>createBlock<\/code>.<\/p>\n<p>Por exemplo, o elemento de t\u00edtulo de uma se\u00e7\u00e3o \u00e9 representado pelo seguinte objeto:<\/p>\n<pre><code class=\"language-php\">if ( '' !== $heading ) {\n\t$blocks[] = array(\n\t\t'name'       =&gt; 'core\/heading',\n\t\t'attributes' =&gt; array(\n\t\t\t'content' =&gt; $heading,\n\t\t\t'level'   =&gt; ( 3 === $level ) ? 3 : 2,\n\t\t),\n\t);\n}<\/code><\/pre>\n<p>Depois de registrar sua ability, voc\u00ea pode executar no terminal os mesmos comandos do WP-CLI apresentados anteriormente para visualizar seus detalhes. O c\u00f3digo a seguir gera o esquema de entrada (input schema) da sua ability:<\/p>\n<pre><code class=\"language-bash\">wp --user=1 eval '\n$ability = wp_get_ability( \"ai-content-builder\/audio-to-gutenberg-blocks\" );\n\nif ( ! $ability ) {\n    echo \"Ability not found\\n\";\n    exit( 1 );\n}\n\necho \"Input Schema:\\n\";\nvar_dump( $ability-&gt;get_input_schema() );\n'<\/code><\/pre>\n<p>Aqui est\u00e1 o resultado no terminal:<\/p>\n<pre><code>Input Schema:\narray(3) {\n\t[\"type\"]=&gt;\n\tstring(6) \"object\"\n\t[\"properties\"]=&gt;\n\tarray(1) {\n\t\t[\"audio_id\"]=&gt;\n\t\tarray(2) {\n\t\t\t[\"type\"]=&gt;\n\t\t\tstring(7) \"integer\"\n\t\t\t[\"description\"]=&gt;\n\t\t\tstring(76) \"The ID of the audio attachment to process and convert into Gutenberg blocks.\"\n\t\t}\n\t}\n\t[\"required\"]=&gt;\n\tarray(1) {\n\t\t[0]=&gt;\n\t\tstring(8) \"audio_id\"\n\t}\n}<\/code><\/pre>\n<p>Da mesma forma, voc\u00ea pode recuperar o esquema de sa\u00edda (output schema) da ability:<\/p>\n<pre><code class=\"language-bash\">wp --user=1 eval '\n$ability = wp_get_ability( \"ai-content-builder\/audio-to-gutenberg-blocks\" );\n\nif ( ! $ability ) {\n    echo \"Ability not found\\n\";\n    exit( 1 );\n}\n\necho \"Output Schema:\\n\";\nvar_dump( $ability-&gt;get_output_schema() );\n'<\/code><\/pre>\n<p>Voc\u00ea tamb\u00e9m pode exibir o objeto completo da sua funcionalidade com o comando a seguir:<\/p>\n<pre><code class=\"language-bash\">wp eval '\n$ability = wp_get_ability( \"ai-content-builder\/audio-to-gutenberg-blocks\" );\n\nif ( ! $ability ) {\n\techo \"Ability not found\\n\";\n\texit( 1 );\n}\n\necho \"Name: \" . $ability-&gt;get_name() . \"\\n\";\necho \"Label: \" . $ability-&gt;get_label() . \"\\n\";\necho \"Category: \" . $ability-&gt;get_category() . \"\\n\";\necho \"Description: \" . $ability-&gt;get_description() . \"\\n\";\necho \"\\nInput Schema:\\n\";\nvar_dump( $ability-&gt;get_input_schema() );\necho \"\\nOutput Schema:\\n\";\nvar_dump( $ability-&gt;get_output_schema() );\n'<\/code><\/pre>\n<h3>Executando uma ability<\/h3>\n<p>Para executar uma ability, utilize o m\u00e9todo <code>execute()<\/code> do objeto <code>$ability<\/code>. Voc\u00ea pode testar a execu\u00e7\u00e3o da ability <code>core\/get-site-info<\/code> executando o seguinte c\u00f3digo PHP por meio do WP-CLI:<\/p>\n<pre><code class=\"language-bash\">wp --user=1 eval '\n$ability = wp_get_ability( \"core\/get-site-info\" );\n\nif ( ! $ability ) {\n\techo \"Ability not found\\n\";\n\texit(1);\n}\n\n$result = $ability-&gt;execute();\n\nif ( is_wp_error( $result ) ) {\n\techo \"ERROR: \" . $result-&gt;get_error_message() . \"\\n\";\n\texit(1);\n}\n\necho json_encode( $result, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES ) . \"\\n\";\n'<\/code><\/pre>\n<p>Ao executar esse comando, a ability retornar\u00e1 um objeto JSON semelhante ao seguinte:<\/p>\n<pre><code>{\n\t\"name\": \"WordPress 7.0\",\n\t\"description\": \"\",\n\t\"url\": \"http:\/\/yoursite.kinsta.cloud\",\n\t\"wpurl\": \"http:\/\/yoursite.kinsta.cloud\",\n\t\"admin_email\": \"yourname@youremail.com\",\n\t\"charset\": \"UTF-8\",\n\t\"language\": \"en-US\",\n\t\"version\": \"7.1-alpha-62550\"\n}<\/code><\/pre>\n<p>O exemplo acima mostra uma ability simples que fornece informa\u00e7\u00f5es sobre o seu site.<\/p>\n<p>Como mencionado anteriormente, uma ability pode exigir dados de entrada, executar opera\u00e7\u00f5es sobre esses dados e retornar uma sa\u00edda estruturada. Podemos observar esse comportamento na ability registrada na se\u00e7\u00e3o anterior.<\/p>\n<p>Ainda no terminal, navegue at\u00e9 o diret\u00f3rio raiz do seu site e execute o seguinte c\u00f3digo PHP:<\/p>\n<pre><code class=\"language-bash\">wp --user=1 eval '\n$ability = wp_get_ability( \"ai-content-builder\/audio-to-gutenberg-blocks\" );\n\nif ( ! $ability ) {\n\techo \"Ability not found\\n\";\n\texit( 1 );\n}\n\n$input = array( \"audio_id\" =&gt; 1755 );\n\n$result = $ability-&gt;execute( $input );\n\nif ( is_wp_error( $result ) ) {\n\techo \"ERROR: \" . $result-&gt;get_error_message() . \"\\n\";\n\texit( 1 );\n}\n\necho json_encode( $result, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES ) . \"\\n\";\n'<\/code><\/pre>\n<p>O m\u00e9todo <code>execute()<\/code> envia os dados estruturados de entrada para a ability, que retorna um array de objetos pronto para ser convertido em blocos do Gutenberg:<\/p>\n<pre><code>[\n\t{\n\t\t\"name\": \"core\/heading\",\n\t\t\"attributes\": {\n\t\t\t\"content\": \"A Well-Deserved Rest Day in Marrakech\",\n\t\t\t\"level\": 2\n\t\t}\n\t},\n\t{\n\t\t\"name\": \"core\/paragraph\",\n\t\t\"attributes\": {\n\t\t\t\"content\": \"On April 24th, our group of seven motorcyclists took a break from the open road...\"\n\t\t}\n\t},\n\t{\n\t\t\"name\": \"core\/heading\",\n\t\t\"attributes\": {\n\t\t\t\"content\": \"Exploring Jemaa el-Fnaa and the Medina\",\n\t\t\t\"level\": 2\n\t\t}\n\t},\n\t{\n\t\t\"name\": \"core\/paragraph\",\n\t\t\"attributes\": {\n\t\t\t\"content\": \"Our journey led us straight to Jemaa el-Fnaa, the legendary main square of Marrakech...\"\n\t\t}\n\t},\n\t{\n\t\t\"name\": \"core\/list\",\n\t\t\"attributes\": {\n\t\t\t\"values\": \"&lt;ul&gt;&lt;li&gt;Navigating the bustling souks and narrow alleys of the ancient Medina.&lt;\/li&gt;&lt;li&gt;Savoring traditional Moroccan and Berber dishes.&lt;\/li&gt;&lt;li&gt;Experiencing the vibrant street performances and food stalls of Jemaa el-Fnaa at night.&lt;\/li&gt;&lt;\/ul&gt;\"\n\t\t}\n\t},\n\t...\n]<\/code><\/pre>\n<h2>Integra\u00e7\u00e3o com a API REST<\/h2>\n<p>A API Abilities do WordPress fornece uma estrutura unificada de rotas que permite a agentes externos consultar programaticamente as categorias de abilities dispon\u00edveis (<code>\/categories<\/code>), inspecionar o contrato de uma ability espec\u00edfica (<code>\/abilities\/{name}<\/code>) e executar uma ability por meio do endpoint padr\u00e3o <code>\/abilities\/{name}\/run<\/code>.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Todas as solicita\u00e7\u00f5es para a API REST do WordPress exigem autentica\u00e7\u00e3o. Para scripts externos ou ferramentas de terceiros, como o Postman, utilize as <a href=\"https:\/\/developer.wordpress.org\/advanced-administration\/security\/application-passwords\/\">Senhas de Aplicativo<\/a> (<em>Application Passwords<\/em>) do WordPress.<\/p>\n<\/aside>\n\n<p>Veja, por exemplo, uma requisi\u00e7\u00e3o GET que retorna a lista de categorias do nosso site de testes:<\/p>\n<pre><code>https:\/\/yoursite.kinsta.cloud\/wp-json\/wp-abilities\/v1\/categories<\/code><\/pre>\n<figure id=\"attachment_212438\" aria-describedby=\"caption-attachment-212438\" style=\"width: 1372px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-212438 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/Screenshot-2026-06-26-alle-19.07.03.png\" alt=\"Todas as solicita\u00e7\u00f5es devem ser autorizadas.\" width=\"1372\" height=\"496\"><figcaption id=\"caption-attachment-212438\" class=\"wp-caption-text\">Todas as solicita\u00e7\u00f5es devem ser autorizadas.<\/figcaption><\/figure>\n<p>Quando registramos a ability no exemplo anterior, definimos o par\u00e2metro <code>show_in_rest<\/code> como <code>true<\/code>. Com isso, nossa ability passou a ficar automaticamente acess\u00edvel por meio desses endpoints nativos da API REST do WordPress, sob o namespace centralizado <code>wp-abilities\/v1<\/code>.<\/p>\n<p>Isso significa que voc\u00ea n\u00e3o precisa registrar manualmente rotas personalizadas para executar uma ability a partir de um ambiente externo. Agentes externos podem descobrir e executar sua ability utilizando requisi\u00e7\u00f5es HTTP padr\u00e3o.<\/p>\n<p>Voc\u00ea pode inspecionar o contrato espec\u00edfico da nossa ability com a seguinte requisi\u00e7\u00e3o GET:<\/p>\n<pre><code>https:\/\/yoursite.kinsta.cloud\/wp-json\/wp-abilities\/v1\/abilities\/ai-content-builder\/audio-to-gutenberg-blocks<\/code><\/pre>\n<p>Por fim, voc\u00ea pode executar a ability com uma requisi\u00e7\u00e3o POST autenticada:<\/p>\n<pre><code>https:\/\/yoursite.kinsta.cloud\/wp-json\/wp-abilities\/v1\/abilities\/ai-content-builder\/audio-to-gutenberg-blocks\/run<\/code><\/pre>\n<p>Ao enviar esse tipo de requisi\u00e7\u00e3o, certifique-se de informar os dados de entrada. No nosso exemplo, definimos o seguinte JSON no corpo da requisi\u00e7\u00e3o:<\/p>\n<pre><code class=\"language-json\">{\n\t\"input\": {\n\t\t\"audio_id\": YOUR_AUDIO_ID\n\t}\n}<\/code><\/pre>\n<figure id=\"attachment_212446\" aria-describedby=\"caption-attachment-212446\" style=\"width: 1378px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-212446 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2026\/06\/run-ability-via-rest-1.png\" alt=\"Executando uma ability por meio de uma requisi\u00e7\u00e3o HTTP no Postman.\" width=\"1378\" height=\"1286\"><figcaption id=\"caption-attachment-212446\" class=\"wp-caption-text\">Executando uma ability por meio de uma requisi\u00e7\u00e3o HTTP no Postman.<\/figcaption><\/figure>\n<p>Nossa ability processou o \u00e1udio e o enviou ao modelo de IA configurado no site. O modelo retornou uma sa\u00edda estruturada, que foi posteriormente normalizada e sanitizada, retornando, por fim, o seguinte array de objetos contendo os atributos dos blocos:<\/p>\n<pre><code class=\"language-json\">{\n\t\"blocks\": [\n\t\t{\n\t\t\t\"name\": \"core\/heading\",\n\t\t\t\"attributes\": { \"content\": \"A Welcome Rest Day in Marrakech\", \"level\": 2 }\n\t\t},\n\t\t{\n\t\t\t\"name\": \"core\/paragraph\",\n\t\t\t\"attributes\": { \"content\": \"On April 24, our group of seven motorcyclists paused our journey...\" }\n\t\t}\n\t]\n}<\/code><\/pre>\n<p>E esse \u00e9 exatamente o resultado que quer\u00edamos obter.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Desde o lan\u00e7amento do WordPress 7.0, a API Abilities tamb\u00e9m est\u00e1 dispon\u00edvel em JavaScript por meio da implementa\u00e7\u00e3o da Client-Side Abilities API. Os desenvolvedores podem utilizar os pacotes <code>@wordpress\/abilities<\/code> e <code>@wordpress\/core-abilities<\/code> para registrar abilities \u2014 incluindo seus esquemas de entrada e sa\u00edda, callbacks e anota\u00e7\u00f5es \u2014 e implementar funcionalidades no lado do cliente. Para uma an\u00e1lise mais detalhada, consulte a <em>dev note<\/em> da <a href=\"https:\/\/make.wordpress.org\/core\/2026\/03\/24\/client-side-abilities-api-in-wordpress-7-0\/\">Client-Side Abilities API<\/a> e a <a href=\"https:\/\/github.com\/WordPress\/abilities-api\/blob\/trunk\/docs\/javascript-client.md\">documenta\u00e7\u00e3o do cliente JavaScript<\/a>.<\/p>\n<\/aside>\n\n<h2>O futuro do WordPress \u00e9 agentic<\/h2>\n<p>Enquanto o <a href=\"https:\/\/kinsta.com\/pt\/blog\/ia-wordpress\/\">AI Client e a nova arquitetura de conectores<\/a> trazem recursos de processamento de IA para dentro do WordPress, a API Abilities redefine a forma como o WordPress interage com o mundo externo. Estamos presenciando uma mudan\u00e7a profunda de paradigma, saindo de uma arquitetura tradicional da Web \u2014 baseada na intera\u00e7\u00e3o manual do usu\u00e1rio, em que cada integra\u00e7\u00e3o exigia endpoints personalizados e mapeamentos manuais \u2014 para uma arquitetura orientada por inten\u00e7\u00f5es (<em>intent-driven<\/em>), concebida desde o in\u00edcio para automa\u00e7\u00e3o.<\/p>\n<p>Para os desenvolvedores WordPress, a nova API Abilities representa um ponto de inflex\u00e3o arquitetural, caracterizado pelo desacoplamento das funcionalidades dos plugins que cont\u00eam sua l\u00f3gica, pela aplica\u00e7\u00e3o de seguran\u00e7a por meio do contrato de entrada e sa\u00edda (<em>input\/output contract<\/em>) e pela interoperabilidade nativa em todo o ecossistema.<\/p>\n<p>Em conjunto, esses recursos fazem com que a API Abilities n\u00e3o seja apenas mais uma API, mas um verdadeiro mecanismo de execu\u00e7\u00e3o distribu\u00eddo, oferecendo uma vis\u00e3o do futuro cada vez mais agentic do WordPress.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A API Abilities, introduzida no WordPress 6.9, estabelece uma linguagem comum que permite que todos os componentes do WordPress \u2014 tanto o n\u00facleo quanto os plugins &#8230;<\/p>\n","protected":false},"author":36,"featured_media":75920,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[951,1026],"class_list":["post-75919","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-api","topic-desenvolvimento-wordpress"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Primeiros passos com a API Abilities do WordPress<\/title>\n<meta name=\"description\" content=\"Aprenda a usar a API Abilities do WordPress para transformar as funcionalidades do seu plugin em servi\u00e7os seguros, baseados em contratos e prontos para automa\u00e7\u00e3o com IA.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Primeiros passos com a API Abilities do WordPress: um guia pr\u00e1tico\" \/>\n<meta property=\"og:description\" content=\"Aprenda a usar a API Abilities do WordPress para transformar as funcionalidades do seu plugin em servi\u00e7os seguros, baseados em contratos e prontos para automa\u00e7\u00e3o com IA.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-30T06:29:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-05T13:08:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1470\" \/>\n\t<meta property=\"og:image:height\" content=\"735\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Carlo Daniele\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Aprenda a usar a API Abilities do WordPress para transformar as funcionalidades do seu plugin em servi\u00e7os seguros, baseados em contratos e prontos para automa\u00e7\u00e3o com IA.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"23 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Primeiros passos com a API Abilities do WordPress: um guia pr\u00e1tico\",\"datePublished\":\"2026-07-30T06:29:08+00:00\",\"dateModified\":\"2026-08-05T13:08:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/\"},\"wordCount\":2584,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\",\"inLanguage\":\"pt-PT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/\",\"name\":\"Primeiros passos com a API Abilities do WordPress\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\",\"datePublished\":\"2026-07-30T06:29:08+00:00\",\"dateModified\":\"2026-08-05T13:08:47+00:00\",\"description\":\"Aprenda a usar a API Abilities do WordPress para transformar as funcionalidades do seu plugin em servi\u00e7os seguros, baseados em contratos e prontos para automa\u00e7\u00e3o com IA.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png\",\"width\":1470,\"height\":735},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"API\",\"item\":\"https:\/\/kinsta.com\/pt\/topicos\/api\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Primeiros passos com a API Abilities do WordPress: um guia pr\u00e1tico\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/pt\/#website\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"caption\":\"Carlo Daniele\"},\"description\":\"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.\",\"sameAs\":[\"https:\/\/frammentidicodice.com\/\",\"https:\/\/x.com\/carlodaniele\"],\"url\":\"https:\/\/kinsta.com\/pt\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Primeiros passos com a API Abilities do WordPress","description":"Aprenda a usar a API Abilities do WordPress para transformar as funcionalidades do seu plugin em servi\u00e7os seguros, baseados em contratos e prontos para automa\u00e7\u00e3o com IA.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/","og_locale":"pt_PT","og_type":"article","og_title":"Primeiros passos com a API Abilities do WordPress: um guia pr\u00e1tico","og_description":"Aprenda a usar a API Abilities do WordPress para transformar as funcionalidades do seu plugin em servi\u00e7os seguros, baseados em contratos e prontos para automa\u00e7\u00e3o com IA.","og_url":"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2026-07-30T06:29:08+00:00","article_modified_time":"2026-08-05T13:08:47+00:00","og_image":[{"width":1470,"height":735,"url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","type":"image\/png"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"Aprenda a usar a API Abilities do WordPress para transformar as funcionalidades do seu plugin em servi\u00e7os seguros, baseados em contratos e prontos para automa\u00e7\u00e3o com IA.","twitter_image":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","twitter_creator":"@carlodaniele","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Carlo Daniele","Tempo estimado de leitura":"23 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Primeiros passos com a API Abilities do WordPress: um guia pr\u00e1tico","datePublished":"2026-07-30T06:29:08+00:00","dateModified":"2026-08-05T13:08:47+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/"},"wordCount":2584,"publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","inLanguage":"pt-PT"},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/","url":"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/","name":"Primeiros passos com a API Abilities do WordPress","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","datePublished":"2026-07-30T06:29:08+00:00","dateModified":"2026-08-05T13:08:47+00:00","description":"Aprenda a usar a API Abilities do WordPress para transformar as funcionalidades do seu plugin em servi\u00e7os seguros, baseados em contratos e prontos para automa\u00e7\u00e3o com IA.","breadcrumb":{"@id":"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/#primaryimage","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2026\/07\/getting-started-with-the-wordpress-abilities-a-i-a-practical-guide.png","width":1470,"height":735},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/pt\/blog\/api-abilities-wordpress\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"API","item":"https:\/\/kinsta.com\/pt\/topicos\/api\/"},{"@type":"ListItem","position":3,"name":"Primeiros passos com a API Abilities do WordPress: um guia pr\u00e1tico"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/pt\/#website","url":"https:\/\/kinsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","caption":"Carlo Daniele"},"description":"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.","sameAs":["https:\/\/frammentidicodice.com\/","https:\/\/x.com\/carlodaniele"],"url":"https:\/\/kinsta.com\/pt\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/75919","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/comments?post=75919"}],"version-history":[{"count":6,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/75919\/revisions"}],"predecessor-version":[{"id":76069,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/75919\/revisions\/76069"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/75919\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/75919\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/75919\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/75919\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/75919\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/75919\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/75919\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/75919\/translations\/es"},{"href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/75919\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media\/75920"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media?parent=75919"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/tags?post=75919"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/topic?post=75919"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}