{"id":233869,"date":"2023-02-23T17:31:00","date_gmt":"2023-02-23T14:31:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233869"},"modified":"2022-11-11T12:53:38","modified_gmt":"2022-11-11T09:53:38","slug":"referencia-completa-para-adicionar-grupos-de-campos-personalizados-avancados-e-campos-por-codigo","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/referencia-completa-para-adicionar-grupos-de-campos-personalizados-avancados-e-campos-por-codigo\/","title":{"rendered":"Refer\u00eancia completa para adicionar grupos de campos personalizados avan\u00e7ados e campos por c\u00f3digo"},"content":{"rendered":"\n<p>O plugin <a href=\"https:\/\/www.advancedcustomfields.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Advanced Custom Fields<\/a> (ACF) suporta a configura\u00e7\u00e3o completa de campos e grupos por c\u00f3digo PHP em seu tema ou plugin. Os benef\u00edcios de fazer isso \u00e9 que todos os seus campos estar\u00e3o dispon\u00edveis independentemente da inst\u00e2ncia do WordPress em que voc\u00ea est\u00e1 trabalhando (por exemplo, se voc\u00ea precisar alternar entre local, servidor de teste e servidor ativo). Voc\u00ea pode configurar todos os campos no admin do ACF e usar a ferramenta de exporta\u00e7\u00e3o para export\u00e1-los para PHP.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151957-61e4d1b8bd642.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-151957-61e4d1b8bd642.png\" alt=\"Refer\u00eancia completa para adicionar grupos de campos personalizados avan\u00e7ados e campos por c\u00f3digo\" ><\/a><\/p>\n<p>No entanto, se voc\u00ea fizer isso com frequ\u00eancia, poder\u00e1 notar que a exporta\u00e7\u00e3o PHP do ACF cont\u00e9m muito c\u00f3digo, tornando seus arquivos PHP desnecessariamente longos. Em alguns casos, \u00e9 melhor escrever o c\u00f3digo voc\u00ea mesmo, com o m\u00ednimo necess\u00e1rio, para um c\u00f3digo mais limpo em seu tema ou plugin. Este guia tem como objetivo fornecer uma refer\u00eancia completa sobre como escrever manualmente a adi\u00e7\u00e3o de campos e grupos ACF em PHP. Observe que ele n\u00e3o entrar\u00e1 em detalhes sobre cada tipo de campo, pois pressup\u00f5e que voc\u00ea j\u00e1 esteja familiarizado com os diferentes campos poss\u00edveis no ACF.<\/p>\n<h2>Mas primeiro; algumas precau\u00e7\u00f5es<\/h2>\n<p>Para manter bons padr\u00f5es de c\u00f3digo e garantir que seu site WordPress n\u00e3o falhe, voc\u00ea deve sempre verificar se as fun\u00e7\u00f5es ou classes que seu c\u00f3digo est\u00e1 usando realmente existem. Especialmente quando se trata de plugins que podem ser facilmente desativados ou nem mesmo instalados em um site, voc\u00ea deve sempre envolver o c\u00f3digo espec\u00edfico do plugin em um teste if que verifica se as fun\u00e7\u00f5es que voc\u00ea usa existem, antes de us\u00e1-las.<\/p>\n<p>Quanto ao ACF voc\u00ea pode fazer isso verificando se a classe <code>'acf'<\/code>existe ou se a fun\u00e7\u00e3o para adicionar campos e grupos, <code>'acf_add_local_field_group'<\/code>, existe. Enrole qualquer um deles ao redor do c\u00f3digo abaixo.<\/p>\n<pre><code>if (function_exists('acf_add_local_field_group')) {\n    \/\/ Your ACF specific code here\n}\n\/\/ OR:\nif (class_exists('acf')) {\n    \/\/ Your ACF specific code here\n}<\/code><\/pre>\n<h2>C\u00f3digo esqueleto<\/h2>\n<p>Para adicionar meta caixas (grupos) e campos, usamos o gancho chamado <code>acf\/init<\/code>. Dentro da fun\u00e7\u00e3o chamamos a fun\u00e7\u00e3o <code>acf_add_local_field_group()<\/code>com um array como par\u00e2metro. Dentro dessa matriz est\u00e1 a configura\u00e7\u00e3o completa do grupo e todos os seus campos. Os mais importantes s\u00e3o as chaves de matriz <code>'fields'<\/code>e <code>'location'<\/code>. Para chave de matriz <code>'fields'<\/code>voc\u00ea fornece a matriz para todos os campos e para a chave <code>'location'<\/code>voc\u00ea fornece as configura\u00e7\u00f5es de onde a metabox deve aparecer. Este post entrar\u00e1 em detalhes de quais op\u00e7\u00f5es poss\u00edveis voc\u00ea tem para cada uma delas abaixo.<\/p>\n<p>Este \u00e9 o m\u00ednimo para adicionar um grupo, al\u00e9m dos campos e local:<\/p>\n<pre><code>add_action('acf\/init', function() {\n    acf_add_local_field_group([\n        'key' =&gt; 'group_my_fields',\n        'title' =&gt; __('My fields', 'txtdomain'),\n        'label_placement' =&gt; 'top',\n        'menu_order' =&gt; 0,\n        'style' =&gt; 'default',\n        'position' =&gt; 'normal',\n        'fields' =&gt; [],\n        'location' =&gt; [],\n    ]);\n});<\/code><\/pre>\n<p>Cada grupo precisa de uma chave \u00fanica, mas o nome real em si n\u00e3o importa muito (para n\u00f3s). Se voc\u00ea estiver adicionando mais grupos, n\u00e3o se esque\u00e7a de alterar o <code>'key'<\/code>campo. O t\u00edtulo da metabox pode ser definido no elemento-chave do array, voc\u00ea adivinhou, <code>'title'<\/code>. Se voc\u00ea estiver adicionando v\u00e1rias metaboxes no mesmo local (por exemplo, na p\u00f3s-edi\u00e7\u00e3o), voc\u00ea pode controlar o que vem primeiro fornecendo n\u00fameros diferentes em <code>'menu_order'<\/code>.<\/p>\n<p>Voc\u00ea pode controlar o design da metabox fornecendo um <code>default<\/code>eller <code>seamless<\/code>em <code>'style'<\/code>. No entanto, com o novo editor Gutenberg, isso tem um significado muito menor. O mesmo vale para a chave <code>'position'<\/code>onde antigamente voc\u00ea podia posicionar a metabox abaixo do conte\u00fado do post (<code>'normal'<\/code>), ao lado (<code>'side'<\/code>) ou logo ap\u00f3s o t\u00edtulo do post (<code>'acf_after_title'<\/code>).<\/p>\n<p>Tudo bem! Vamos mergulhar nos dois elementos mais interessantes do array; come\u00e7ando com a localiza\u00e7\u00e3o \u2013 que define onde a metabox aparece.<\/p>\n<h2>Localiza\u00e7\u00e3o<\/h2>\n<p>Isso \u00e9 tudo sobre o que voc\u00ea coloca na chave <code>'location'<\/code>. Mas antes de olharmos para as op\u00e7\u00f5es poss\u00edveis, precisamos entender sua estrutura de matriz.<\/p>\n<p><code>'location'<\/code>aceita um array com um array de elementos em um array! Resistir. Sim, porque \u00e9 poss\u00edvel fornecer e combinar a l\u00f3gica AND e OR no local (por exemplo, &quot;mostrar na edi\u00e7\u00e3o de postagem, mas n\u00e3o se o tipo de postagem for &#8216;livro&#8217;&quot;, ou &quot;mostrar na tela de edi\u00e7\u00e3o do usu\u00e1rio e tamb\u00e9m criar uma nova tela de usu\u00e1rio, mas para ambos os casos not if current role is author&quot;). A maneira como voc\u00ea indica se \u00e9 um AND ou OR \u00e9 estruturando os arrays. \u00c9 muito mais f\u00e1cil mostrar do que explicar em palavras:<\/p>\n<p>\u00c9 assim que voc\u00ea combina dois elementos de localiza\u00e7\u00e3o com l\u00f3gica AND (ambos devem ser verdadeiros):<\/p>\n<pre><code>'location' =&gt; [\n    [\n        [\n            \/\/ location 1\n        ],\n        [\n            \/\/ location 2\n        ]\n    ]\n]<\/code><\/pre>\n<p>E isso \u00e9 para combinar locais com l\u00f3gica OR (apenas um precisa ser verdadeiro):<\/p>\n<pre><code>'location' =&gt; [\n    [\n        [\n            \/\/ location 1\n        ]\n    ],\n    [\n        [\n            \/\/ location 2\n        ]\n    ]\n]<\/code><\/pre>\n<p>Veja a diferen\u00e7a?<\/p>\n<p>Certo, vamos seguir em frente. Cada op\u00e7\u00e3o de localiza\u00e7\u00e3o consiste em uma matriz de tr\u00eas elementos; <code>'param'<\/code>que \u00e9 onde adicionamos todos os locais diferentes <code>'operator'<\/code>, e <code>'value'<\/code>. Operador \u00e9 como comparar o valor, podendo ser <code>'=='<\/code>igual ou <code>'!='<\/code>n\u00e3o igual a.<\/p>\n<p>Vamos examinar as op\u00e7\u00f5es poss\u00edveis, uma por uma.<\/p>\n<h3>Localiza\u00e7\u00e3o por tipo de postagem<\/h3>\n<pre><code>[\n    'param' =&gt; 'post_type',\n    'operator' =&gt; '==',\n    'value' =&gt; 'post'\n]<\/code><\/pre>\n<p>Defina o tipo de postagem desejado em <code>'value'<\/code>. Tenha em mente que voc\u00ea n\u00e3o pode fornecer uma matriz de v\u00e1rios tipos de postagem, voc\u00ea precisa combinar v\u00e1rias dessas matrizes em uma configura\u00e7\u00e3o AND.<\/p>\n<h3>Localiza\u00e7\u00e3o por status de postagem<\/h3>\n<pre><code>[\n    'param' =&gt; 'post_status',\n    'operator' =&gt; '==',\n    'value' =&gt; 'publish'\n]<\/code><\/pre>\n<p>Defina o status de postagem desejado como <code>'value'<\/code>. Novamente, lembre-se de que voc\u00ea n\u00e3o pode fornecer uma matriz de v\u00e1rios status de postagem, voc\u00ea precisar\u00e1 fornecer cada valor desejado em uma configura\u00e7\u00e3o AND ou OR.<\/p>\n<h3>Localiza\u00e7\u00e3o por modelo de p\u00e1gina<\/h3>\n<pre><code>[\n    'param' =&gt; 'page_template',\n    'operator' =&gt; '==',\n    'value' =&gt; 'template-name.php'\n]<\/code><\/pre>\n<p>Isso \u00e9 exibido apenas se a p\u00e1gina selecionada (ou tipo de postagem personalizado com suporte a modelo de p\u00e1gina) tiver escolhido o nome do modelo de p\u00e1gina fornecido.<\/p>\n<h3>Localiza\u00e7\u00e3o por termo de taxonomia atribu\u00eddo<\/h3>\n<pre><code>\/\/ Post category only\n[\n    'param' =&gt; 'post_category',\n    'operator' =&gt; '==',\n    'value' =&gt; 'category:some-category-slug'\n]\n\/\/ Any taxonomy\n[\n    'param' =&gt; 'post_taxonomy',\n    'operator' =&gt; '==',\n    'value' =&gt; 'my_custom_taxonomy:some-category-slug'  \/\/ &lt;taxonomy name&gt;:&lt;term slug&gt;\n]<\/code><\/pre>\n<p>Este local \u00e9 para quando um post tem um termo espec\u00edfico atribu\u00eddo a ele. Voc\u00ea precisar\u00e1 fornecer o nome da taxonomia, dois pontos e o slug do termo como valor.<\/p>\n<h3>Localiza\u00e7\u00e3o por tipo de p\u00e1gina<\/h3>\n<p>O ACF agrupa propriedades especiais para p\u00e1ginas como &#8220;tipo de p\u00e1gina&#8221;. Preocupa-se principalmente se a p\u00e1gina atual \u00e9 ou n\u00e3o uma p\u00e1gina pai ou filha, mas tamb\u00e9m para direcionar p\u00e1ginas definidas como p\u00e1gina inicial do WordPress ou p\u00e1gina do blog.<\/p>\n<pre><code>\/\/ Front page\n[\n    'param' =&gt; 'page_type',\n    'operator' =&gt; '==',\n    'value' =&gt; 'front_page'\n]\n\/\/ Posts page\n[\n    'param' =&gt; 'page_type',\n    'operator' =&gt; '==',\n    'value' =&gt; 'posts_page'\n]\n\/\/ Top level page only\n[\n    'param' =&gt; 'page_type',\n    'operator' =&gt; '==',\n    'value' =&gt; 'top_level'\n]\n\/\/ Top level page that has children\n[\n    'param' =&gt; 'page_type',\n    'operator' =&gt; '==',\n    'value' =&gt; 'parent'\n]\n\/\/ Children level pages\n[\n    'param' =&gt; 'page_type',\n    'operator' =&gt; '==',\n    'value' =&gt; 'children'\n]<\/code><\/pre>\n<h3>Local: taxonomia<\/h3>\n<p>Um local para editar ou adicionar um termo em uma taxonomia.<\/p>\n<pre><code>[\n    'param' =&gt; 'taxonomy',\n    'operator' =&gt; '==',\n    'value' =&gt; 'category'  \/\/ Or 'all' for all taxonomies\n]<\/code><\/pre>\n<p>Forne\u00e7a o nome da taxonomia como <code>'value'<\/code>. Lembre-se de que voc\u00ea n\u00e3o pode fornecer uma matriz de v\u00e1rias taxonomias, mas pode fornecer <code>'all'<\/code>para segmentar todas as taxonomias.<\/p>\n<h3>Local: usu\u00e1rio<\/h3>\n<p>Este local \u00e9 para adicionar ou editar um perfil de usu\u00e1rio.<\/p>\n<pre><code>[\n    'param' =&gt; 'user_form',\n    'operator' =&gt; '==',\n    'value' =&gt; 'all'  \/\/ 'edit' || 'register'\n]<\/code><\/pre>\n<p>Forne\u00e7a <code>'edit<\/code>&#8216; para direcionar apenas a tela de edi\u00e7\u00e3o de usu\u00e1rios existentes, <code>'register'<\/code>para direcionar apenas o formul\u00e1rio ao registrar um novo usu\u00e1rio ou &#8216; <code>all'<\/code>para ambos os itens acima.<\/p>\n<h3>Local: item de menu<\/h3>\n<p>Desde o ACF 5.6, voc\u00ea tamb\u00e9m pode adicionar grupos de campos aos itens de menu.<\/p>\n<pre><code>[\n    'param' =&gt; 'nav_menu_item',\n    'operator' =&gt; '==',\n    'value' =&gt; 'all'\n]<\/code><\/pre>\n<p>Voc\u00ea pode definir <code>value<\/code>para <code>all<\/code>aplicar o grupo a todos os itens de menu ou pode especificar menus por local (locais registrados em seu tema) ou por ID de menu. Para uso de local <code>'location\/&lt;name&gt;'<\/code>\u2013 portanto, para um local chamado &#8216; <code>primary<\/code>&#8216;, voc\u00ea pode definir o valor <code>'location\/primary'<\/code>para aplicar seu grupo a um menu atribu\u00eddo apenas a este local. Se voc\u00ea deseja segmentar um ID de menu espec\u00edfico, defina o valor para uma string desse ID.<\/p>\n<h3>Local: widget<\/h3>\n<p>O ACF ainda fornece uma localiza\u00e7\u00e3o dentro das configura\u00e7\u00f5es do widget sem modificar o c\u00f3digo principal do widget.<\/p>\n<pre><code>[\n    'param' =&gt; 'widget',\n    'operator' =&gt; '==',\n    'value' =&gt; 'tag_cloud'  \/\/ or 'all' for all widgets\n]<\/code><\/pre>\n<p>Voc\u00ea pode segmentar todos os widgets com <code>'all'<\/code>as <code>'value'<\/code>ou segmentar um widget espec\u00edfico. Voc\u00ea precisar\u00e1 saber o &#8220;ID interno&#8221; do widget com o qual eles est\u00e3o registrados.<\/p>\n<h3>Local: p\u00e1gina de op\u00e7\u00f5es do ACF (somente Pro)<\/h3>\n<p>Com o ACF Pro, voc\u00ea pode usar o ACF para configurar p\u00e1ginas de administra\u00e7\u00e3o personalizadas.<\/p>\n<pre><code>[\n    'param' =&gt; 'options_page',\n    'operator' =&gt; '==',\n    'value' =&gt; 'acf-options-myoptionspage'\n]<\/code><\/pre>\n<p>Forne\u00e7a o nome que voc\u00ea definiu em <code>acf_add_options_page<\/code>&#8216;s <code>menu_slug<\/code>as <code>'value'<\/code>.<\/p>\n<h3>Localiza\u00e7\u00e3o: bloco (somente Pro 5.8+)<\/h3>\n<p>O ACF Pro (5.8+) possui um recurso para adicionar blocos Gutenberg com campos do ACF e controlar sua sa\u00edda com PHP. Muito bacana para aqueles que ainda n\u00e3o mergulharam na adi\u00e7\u00e3o de blocos personalizados do Gutenberg e o Javascript necess\u00e1rio.<\/p>\n<pre><code>[\n    'param' =&gt; 'block',\n    'operator' =&gt; '==',\n    'value' =&gt; 'acf\/cta'  \/\/ or 'all' for all ACF blocks\n]<\/code><\/pre>\n<hr \/>\n<h2>Campos<\/h2>\n<p>Agora estamos entrando na parte mais interessante; os pr\u00f3prios campos. ACF oferece uma gama (realmente) ampla de tipos de campo, e vou reiterar; este guia n\u00e3o mostra o que \u00e9 cada campo e como eles funcionam ou se parecem.<\/p>\n<p>Na matriz principal que voc\u00ea fornece <code>'fields'<\/code>, <code>acf_add_local_field_group()<\/code>voc\u00ea fornece uma matriz em que cada campo \u00e9 sua pr\u00f3pria matriz.<\/p>\n<p>O m\u00ednimo absoluto necess\u00e1rio para cada campo \u00e9 o seguinte: um exclusivo <code>'key'<\/code>que pode ser o que voc\u00ea quiser e voc\u00ea provavelmente nunca precisar\u00e1 consult\u00e1-lo. Voc\u00ea tamb\u00e9m precisa de <code>'name'<\/code>qual \u00e9 a meta-chave (post, user, term) na qual o valor do campo \u00e9 salvo \u2013 e \u00e9 a que voc\u00ea ir\u00e1 se referir ao obter o valor dos campos. Voc\u00ea deve fornecer um <code>'label'<\/code>e, finalmente, o crucial <code>'type'<\/code>que define qual tipo de campo estamos lidando. O restante dos campos depende de <code>'type'<\/code>como veremos quando passarmos por cada tipo de campo abaixo.<\/p>\n<p>Este \u00e9 o c\u00f3digo de esqueleto para adicionar um campo.<\/p>\n<pre><code>'fields' = [\n    [\n        'key' =&gt; 'field_my_field',\n        'label' =&gt; __('My field', 'txtdomain'),\n        'name' =&gt; 'my_field',\n        'type' =&gt; 'text',\n    ]\n]<\/code><\/pre>\n<p>Tenha em mente que voc\u00ea precisar\u00e1 do acima para cada campo, mas para n\u00e3o repetir o mesmo c\u00f3digo, cada tipo de campo abaixo incluir\u00e1 apenas <code>'type'<\/code>e quaisquer outros elementos necess\u00e1rios para esse tipo de campo.<\/p>\n<h3>Campo: entrada de texto<\/h3>\n<p>O campo mais simples de todos. Tudo o que realmente precisamos \u00e9:<\/p>\n<pre><code>[\n    'type' =&gt; 'text',\n]<\/code><\/pre>\n<p>Mas para personalizar ainda mais sua entrada de texto, voc\u00ea tamb\u00e9m pode fornecer qualquer um dos seguintes:<\/p>\n<pre><code>[\n    'default_value' =&gt; 'Default value',\n    'prepend' =&gt; 'Prepend text',\n    'append' =&gt; 'Appended text',\n]<\/code><\/pre>\n<h3>Campo: Entrada de n\u00famero<\/h3>\n<pre><code>[\n    'type' =&gt; 'number',\n    'min' =&gt; 0,\n    'max' =&gt; 100,\n    'step' =&gt; 1,\n    'default_value' =&gt; 'Default value',\n    'prepend' =&gt; 'Prepend text',\n    'append' =&gt; 'Appended text',\n]<\/code><\/pre>\n<h3>Campo: Textarea<\/h3>\n<pre><code>[\n    'type' =&gt; 'textarea',\n    'rows' =&gt; 5,\n    'new_lines' =&gt; 'wpautop',  \/\/ 'br' || ''\n    'default_value' =&gt; 'Default value',\n]<\/code><\/pre>\n<h3>Campo: controle deslizante de alcance<\/h3>\n<pre><code>[\n    'type' =&gt; 'range',\n    'min' =&gt; 0,\n    'max' =&gt; 100,\n    'step' =&gt; 1,\n    'default_value' =&gt; 50,\n    'prepend' =&gt; 'Prepend text',\n    'append' =&gt; 'Appended text',\n]<\/code><\/pre>\n<h3>Campo: Senha<\/h3>\n<p>Igual \u00e0 entrada de texto, exceto que qualquer coisa que voc\u00ea digitar ser\u00e1 coberta com * como seria de esperar em um campo de senha.<\/p>\n<pre><code>[\n    'type' =&gt; 'password',\n    'prepend' =&gt; 'Prepend text',\n    'append' =&gt; 'Appended text',\n]<\/code><\/pre>\n<h3>Campo: Imagem<\/h3>\n<p>Sele\u00e7\u00e3o de imagem \u00fanica.<\/p>\n<pre><code>[\n    'type' =&gt; 'image',\n    'return_format' =&gt; 'array',  \/\/ 'id' || 'url'\n    'preview_size' =&gt; 'thumbnail',\n]<\/code><\/pre>\n<h3>Campo: Arquivo<\/h3>\n<p>Semelhante \u00e0 imagem acima, exceto que n\u00e3o visualiza o arquivo.<\/p>\n<pre><code>[\n    'type' =&gt; 'file',\n    'return_format' =&gt; 'array',  \/\/ 'id' || 'url'\n]<\/code><\/pre>\n<p>Voc\u00ea tamb\u00e9m pode fornecer <code>'mime_types' =&gt; '',<\/code>e configur\u00e1-lo para, por exemplo, <code>'pdf,docx'<\/code>permitir apenas arquivos PDF e DOCX.<\/p>\n<h3>Campo: Editor WYSIWYG<\/h3>\n<p>WYSIWYG \u00e9 um editor &#8220;What You See Is What You Get&#8221; \u2013 aquele com o qual est\u00e1vamos familiarizados antes da chegada de Gutenberg (TinyMCE).<\/p>\n<pre><code>[\n    'type' =&gt; 'wysiwyg',\n    'tabs' =&gt; 'all',  \/\/ 'visual' || 'text'\n    'toolbar' =&gt; 'full',  \/\/ 'basic'\n    'media_upload' =&gt; 1,\n    'delay' =&gt; 0,\n]<\/code><\/pre>\n<p>O par\u00e2metro <code>'media_upload'<\/code>e <code>'delay'<\/code>pode ser 1 (verdadeiro) ou 0 (falso).<\/p>\n<h3>Campo: Selecione<\/h3>\n<pre><code>[\n    'type' =&gt; 'select',\n    'allow_null' =&gt; 1,\n    'multiple' =&gt; 0,\n    'ui' =&gt; 1,\n    'return_format' =&gt; 'value',  \/\/ 'array' || 'label'\n    'choices' =&gt; [\n        'red' =&gt; __('Red color', 'txtdomain'),\n        'blue' =&gt; __('Blue color', 'txtdomain')\n    ],\n    'default_value' =&gt; 'red',\n]<\/code><\/pre>\n<h3>Campo: caixa de sele\u00e7\u00e3o<\/h3>\n<pre><code>[\n    'type' =&gt; 'checkbox',\n    'layout' =&gt; 'horizontal',  \/\/ 'vertical'\n    'toggle' =&gt; 0,\n    'return_format' =&gt; 'value',  \/\/ 'array' || 'label'\n    'choices' =&gt; [\n        'red' =&gt; __('Red color', 'txtdomain'),\n        'blue' =&gt; __('Blue color', 'txtdomain')\n    ],\n    'default_value' =&gt; ['red'],\n    'allow_custom' =&gt; 1,\n    'save_custom' =&gt; 0,\n]<\/code><\/pre>\n<p>Observe que <code>'default_value'<\/code>pode ser uma matriz de v\u00e1rias op\u00e7\u00f5es.<\/p>\n<h3>Campo: Bot\u00e3o de r\u00e1dio<\/h3>\n<pre><code>[\n    'type' =&gt; 'radio',\n    'layout' =&gt; 'horizontal',  \/\/ 'vertical'\n    'allow_null' =&gt; 0,\n    'return_format' =&gt; 'value',  \/\/ 'array' || 'label'\n    'choices' =&gt; [\n        'red' =&gt; __('Red color', 'txtdomain'),\n        'blue' =&gt; __('Blue color', 'txtdomain')\n    ],\n    'default_value' =&gt; 'red',\n    'other_choice' =&gt; 1,\n    'save_other_choice' =&gt; 0,\n]<\/code><\/pre>\n<p>Definir <code>'other_choice'<\/code>como true adiciona um bot\u00e3o de op\u00e7\u00e3o extra chamado &quot;Outro&quot; com uma entrada de texto onde o usu\u00e1rio pode digitar algo.<\/p>\n<h3>Campo: Verdadeiro\/Falso (alternar)<\/h3>\n<pre><code>[\n    'type' =&gt; 'true_false',\n    'message' =&gt; __('Text after toggler', 'txtdomain'),\n    'default_value' =&gt; 1,\n    'ui' =&gt; 1,\n    'ui_on_text' =&gt; __('Yes', 'txtdomain'),\n    'ui_off_text' =&gt; __('No', 'txtdomain'),\n]<\/code><\/pre>\n<p>O <code>'ui_on_text'<\/code>e <code>'ui_off_text'<\/code>s\u00f3 \u00e9 v\u00e1lido se <code>'ui'<\/code>for 1, pois eles est\u00e3o definindo o que deve aparecer no alternador especial da interface do usu\u00e1rio.<\/p>\n<h3>Campo: Link<\/h3>\n<p>D\u00e1 a voc\u00ea um bot\u00e3o para inserir um link, digitando ou escolhendo o conte\u00fado do seu site WordPress (deve estar familiarizado com a adi\u00e7\u00e3o de um link no editor normal do WordPress).<\/p>\n<pre><code>[\n    'type' =&gt; 'link',\n    'return_format' =&gt; 'url',  \/\/ 'array'\n]<\/code><\/pre>\n<h3>Campo: Postar Objeto<\/h3>\n<p>D\u00e1 uma caixa de sele\u00e7\u00e3o onde voc\u00ea pode escolher entre o conte\u00fado do WordPress. O select permite pesquisar digitando e todo o conte\u00fado \u00e9 dividido por tipo de postagem. Voc\u00ea pode permitir que v\u00e1rias postagens sejam escolhidas ou apenas uma.<\/p>\n<pre><code>[\n    'type' =&gt; 'post_object',\n    'allow_null' =&gt; 1,\n    'multiple' =&gt; 0,\n    'return_format' =&gt; 'object',  \/\/ 'id'\n    'post_type' =&gt; '',  \/\/ or array of post types e.g. ['post', 'page']\n    'taxonomy' =&gt; '',  \/\/ or array of terms e.g. ['category:term-slug']\n]<\/code><\/pre>\n<h3>Campo: Relacionamento<\/h3>\n<pre><code>[\n    'type' =&gt; 'relationship',\n    'return_format' =&gt; 'object',  \/\/ 'id'\n    'post_type' =&gt; '',  \/\/ or array of post types e.g. ['post', 'page']\n    'taxonomy' =&gt; '',  \/\/ or array of terms e.g. ['category:term-slug']\n    'elements' =&gt; ['featured_image'],  \/\/ or ''\n    'filters' =&gt; ['search', 'post_type', 'taxonomy'],\n]<\/code><\/pre>\n<h3>Campo: Escolher termos em uma taxonomia<\/h3>\n<p>O seletor de termos de taxonomia tem quatro &#8220;modos&#8221; ou tipos diferentes, onde dois deles permitem v\u00e1rias escolhas.<\/p>\n<pre><code>[\n    'type' =&gt; 'taxonomy',\n    'return_format' =&gt; 'object',  \/\/ 'id'\n    'taxonomy' =&gt; 'category',\n    'field_type' =&gt; 'select',  \/\/ 'checkbox' || 'radio' || 'multi_select'\n    'add_term' =&gt; 0,\n    'save_terms' =&gt; 0,\n]<\/code><\/pre>\n<h3>Campo: Selecionar usu\u00e1rio<\/h3>\n<pre><code>[\n    'type' =&gt; 'user',\n    'return_format' =&gt; 'array',  \/\/ 'object' || 'id\n    'role' =&gt; '',  \/\/ or array of roles, e.g. ['author']\n    'allow_null' =&gt; 1,\n    'multiple' =&gt; 0,\n]<\/code><\/pre>\n<h3>Campo: Google Maps<\/h3>\n<pre><code>[\n    'type' =&gt; 'google_map',\n    'center_lat' =&gt; '59.917',\n    'center_lng' =&gt; '10.727',\n    'zoom' =&gt; 14,\n    'height' =&gt; 350,\n]<\/code><\/pre>\n<p>Lembre-se de que voc\u00ea precisa fornecer uma chave de API do GoogleMaps v\u00e1lida ao ACF para que esse campo funcione, assim:<\/p>\n<pre><code>add_filter('acf\/fields\/google_map\/api', function($api) {\n    $api['key'] = 'YOURAPIKEY';\n    return $api;\n});<\/code><\/pre>\n<h3>Campo: DataPicker<\/h3>\n<pre><code>[\n    'type' =&gt; 'date_picker',\n    'display_format' =&gt; 'd\/m\/Y',\n    'return_format' =&gt; 'Y-m-d',\n    'first_day' =&gt; 1,\n]<\/code><\/pre>\n<h3>Campo: seletor de data e hora<\/h3>\n<pre><code>[\n    'type' =&gt; 'date_time_picker',\n    'display_format' =&gt; 'd\/m\/Y H:i:s',\n    'return_format' =&gt; 'Y-m-d H:i:s',\n    'first_day' =&gt; 1,\n]<\/code><\/pre>\n<h3>Campo: selecionador de tempo<\/h3>\n<pre><code>[\n    'type' =&gt; 'time_picker',\n    'display_format' =&gt; 'H:i',\n    'return_format' =&gt; H:i',\n]<\/code><\/pre>\n<h3>Campo: Colorpicker<\/h3>\n<pre><code>[\n    'type' =&gt; 'color_picker',\n    'default_value' =&gt; '',  \/\/ or any hex code, e.g. '#FFFFFF'\n]<\/code><\/pre>\n<h3>Campo: Galeria (somente ACF Pro)<\/h3>\n<pre><code>[\n    'type' =&gt; 'gallery',\n    'return_format' =&gt; 'array',  \/\/ 'id' || 'url'\n    'preview_size' =&gt; 'thumbnail',\n    'insert' =&gt; 'append',  \/\/ 'prepend'\n]<\/code><\/pre>\n<h3>Tipos especiais de campos<\/h3>\n<p>O ACF tamb\u00e9m oferece alguns tipos de campo que n\u00e3o economizam valor per se, mas s\u00e3o mais para fins organizacionais. Para tudo isso, defina <code>'name'<\/code>como uma string vazia.<\/p>\n<h4>Mensagem HTML<\/h4>\n<p>Se voc\u00ea precisar simplesmente imprimir algum HTML sem salvar um valor, voc\u00ea pode usar type <code>'message'<\/code>.<\/p>\n<pre><code>[\n    'type' =&gt; 'message',\n    'message' =&gt; '&lt;p&gt;Your HTML here&lt;\/p&gt;',\n    'new_lines' =&gt; 'wpautop',\n    'esc_html' =&gt; 0,\n]<\/code><\/pre>\n<h4>Repetidor (somente ACF Pro)<\/h4>\n<p>Um repetidor cont\u00e9m uma matriz de campos que podem ser repetidos.<\/p>\n<pre><code>[\n    'type' =&gt; 'repeater',\n    'layout' =&gt; 'table',  \/\/ 'block' || 'row'\n    'button_label' =&gt; __('Add new', 'txtdomain'),\n    'sub_fields' =&gt; [],\n]<\/code><\/pre>\n<p>O elemento <code>sub_fields<\/code>espera uma matriz de campos, assim como voc\u00ea configurou os campos acima.<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>Este n\u00e3o \u00e9 de forma alguma um guia exaustivo, pois o ACF oferece uma ampla gama de op\u00e7\u00f5es e personaliza\u00e7\u00f5es. Mas deve abranger as op\u00e7\u00f5es mais usadas e casos de uso personalizados. Pessoalmente, me vejo me referindo a isso com bastante frequ\u00eancia sempre que adiciono campos ACF para clientes. E mesmo para as op\u00e7\u00f5es mais estranhas, este guia \u00e9 suficiente para que eu n\u00e3o precise inchar meus arquivos PHP com o c\u00f3digo de exporta\u00e7\u00e3o do ACF. Espero que isso tenha sido \u00fatil para voc\u00ea tamb\u00e9m!<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uma refer\u00eancia completa sobre como configurar campos e grupos de campos personalizados avan\u00e7ados por c\u00f3digo PHP em vez de colar c\u00f3digo inchado da ferramenta de exporta\u00e7\u00e3o PHP ACF.<\/p>\n","protected":false},"author":1,"featured_media":224889,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,898,722,722,1110,816,816,846,846,867,867],"tags":[1170],"class_list":["post-233869","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-n-a","category-plug-ins","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233869","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=233869"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233869\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/224889"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=233869"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=233869"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=233869"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}