{"id":233803,"date":"2023-02-23T17:17:00","date_gmt":"2023-02-23T14:17:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233803"},"modified":"2022-11-11T12:30:17","modified_gmt":"2022-11-11T09:30:17","slug":"referencia-completa-para-agregar-grupos-de-campos-personalizados-avanzados-y-campos-por-codigo","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/referencia-completa-para-agregar-grupos-de-campos-personalizados-avanzados-y-campos-por-codigo\/","title":{"rendered":"Referencia completa para agregar grupos de campos personalizados avanzados y campos por c\u00f3digo"},"content":{"rendered":"\n<p>El complemento <a href=\"https:\/\/www.advancedcustomfields.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Campos personalizados avanzados<\/a> (ACF) admite la configuraci\u00f3n completa de campos y grupos mediante c\u00f3digo PHP en su tema o complemento. Los beneficios de hacer esto es que todos sus campos estar\u00e1n disponibles independientemente de la instancia de WordPress en la que est\u00e9 trabajando (por ejemplo, si necesita cambiar entre local, servidor de prueba y servidor en vivo). Puede configurar todos los campos en el administrador de ACF y usar la herramienta de exportaci\u00f3n para exportarlo a 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=\"Referencia completa para agregar grupos de campos personalizados avanzados y campos por c\u00f3digo\" ><\/a><\/p>\n<p>Sin embargo, si hace esto con frecuencia, puede notar que la exportaci\u00f3n PHP de ACF contiene una gran cantidad de c\u00f3digo que hace que sus archivos PHP sean innecesariamente largos. En algunos casos, es mejor escribir el c\u00f3digo usted mismo, con el m\u00ednimo necesario, para obtener un c\u00f3digo m\u00e1s limpio en su tema o complemento. Esta gu\u00eda tiene como objetivo brindarle una referencia completa sobre c\u00f3mo escribir manualmente agregando campos y grupos ACF en PHP. Tenga en cuenta que no entrar\u00e1 en detalles sobre cada tipo de campo, ya que se supone que ya est\u00e1 familiarizado con los diferentes campos posibles en ACF.<\/p>\n<h2>Pero primero; algunas precauciones<\/h2>\n<p>Para mantener buenos est\u00e1ndares de c\u00f3digo y garantizar que su sitio de WordPress no se bloquee, siempre debe verificar si las funciones o clases que usa su c\u00f3digo realmente existen. Especialmente cuando se trata de complementos que pueden desactivarse f\u00e1cilmente o ni siquiera instalarse en un sitio, siempre debe envolver el c\u00f3digo espec\u00edfico de su complemento en una prueba if que verifique si las funciones que usa existen, antes de usarlas.<\/p>\n<p>En cuanto a ACF, puede hacerlo comprobando si existe la clase <code>'acf'<\/code>o si existe la funci\u00f3n para agregar campos y grupos, <code>'acf_add_local_field_group'<\/code>. Envuelva cualquiera de ellos alrededor del c\u00f3digo a continuaci\u00f3n.<\/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 agregar metaboxes (grupos) y campos, usamos el gancho llamado <code>acf\/init<\/code>. Dentro de la funci\u00f3n llamamos a la funci\u00f3n <code>acf_add_local_field_group()<\/code>con una matriz como par\u00e1metro. Dentro de esa matriz est\u00e1 la configuraci\u00f3n completa del grupo y todos sus campos. Las m\u00e1s importantes son las claves de matriz <code>'fields'<\/code>y <code>'location'<\/code>. Para la clave de matriz <code>'fields'<\/code>, proporciona la matriz para todos los campos, y para la clave <code>'location'<\/code>, proporciona la configuraci\u00f3n de d\u00f3nde debe aparecer el metabox. Esta publicaci\u00f3n detallar\u00e1 las posibles opciones que tiene para cada uno de estos a continuaci\u00f3n.<\/p>\n<p>Esto es lo m\u00ednimo para agregar un grupo, adem\u00e1s de los campos y la ubicaci\u00f3n:<\/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 necesita una clave \u00fanica, pero el nombre real en s\u00ed mismo no importa mucho (para nosotros). Si est\u00e1 agregando m\u00e1s grupos, no olvide cambiar el <code>'key'<\/code>campo. El t\u00edtulo del metabox se puede establecer en el elemento clave de matriz, lo adivin\u00f3, <code>'title'<\/code>. Si est\u00e1 agregando varios metaboxes en la misma ubicaci\u00f3n (por ejemplo, en la edici\u00f3n posterior), puede controlar cu\u00e1l viene primero al proporcionar diferentes n\u00fameros en <code>'menu_order'<\/code>.<\/p>\n<p>Puede controlar el dise\u00f1o del metabox proporcionando <code>default<\/code>eller <code>seamless<\/code>en formato <code>'style'<\/code>. Sin embargo, con el nuevo editor de Gutenberg esto tiene mucha menos importancia. Lo mismo ocurre con la clave <code>'position'<\/code>donde en los viejos tiempos pod\u00edas colocar el metabox debajo del contenido de la publicaci\u00f3n (<code>'normal'<\/code>), al costado (<code>'side'<\/code>) o justo despu\u00e9s del t\u00edtulo de la publicaci\u00f3n (<code>'acf_after_title'<\/code>).<\/p>\n<p>\u00a1Bien! Profundicemos en los dos elementos m\u00e1s interesantes de la matriz; comenzando con la ubicaci\u00f3n, que define d\u00f3nde aparece el metabox.<\/p>\n<h2>Ubicaci\u00f3n<\/h2>\n<p>Esto es todo acerca de lo que pones en la llave <code>'location'<\/code>. Pero antes de analizar las posibles opciones, debemos comprender su estructura de matriz.<\/p>\n<p><code>'location'<\/code>acepta una matriz con una matriz de elementos en una matriz! Sostener. S\u00ed, porque es posible proporcionar y combinar la l\u00f3gica AND y OR en la ubicaci\u00f3n (por ejemplo, &quot;mostrar en la edici\u00f3n de publicaciones, pero no si el tipo de publicaci\u00f3n es &#8216;libro&#8217;&quot;, o &quot;mostrar en la pantalla de edici\u00f3n de usuarios y tambi\u00e9n crear una nueva pantalla de usuario, pero para ambos casos no si el rol actual es autor&quot;). La forma en que significa si es un AND o un OR es estructurando las matrices. Es mucho m\u00e1s f\u00e1cil mostrar que explicar con palabras:<\/p>\n<p>As\u00ed es como combina dos elementos de ubicaci\u00f3n con la l\u00f3gica AND (ambos deben ser verdaderos):<\/p>\n<pre><code>'location' =&gt; [\n    [\n        [\n            \/\/ location 1\n        ],\n        [\n            \/\/ location 2\n        ]\n    ]\n]<\/code><\/pre>\n<p>Y esto es para combinar ubicaciones con l\u00f3gica OR (solo una debe ser verdadera):<\/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>\u00bfVer la diferencia?<\/p>\n<p>Bien, sigamos adelante. Cada opci\u00f3n de ubicaci\u00f3n consta de una matriz de tres elementos; <code>'param'<\/code>que es donde agregamos todas las diferentes ubicaciones, <code>'operator'<\/code>, y <code>'value'<\/code>. El operador es c\u00f3mo comparar el valor, y puede ser <code>'=='<\/code>igual o <code>'!='<\/code>diferente.<\/p>\n<p>Repasemos las posibles opciones una por una.<\/p>\n<h3>Ubicaci\u00f3n por tipo de publicaci\u00f3n<\/h3>\n<pre><code>[\n    'param' =&gt; 'post_type',\n    'operator' =&gt; '==',\n    'value' =&gt; 'post'\n]<\/code><\/pre>\n<p>Establezca el tipo de publicaci\u00f3n que desee en <code>'value'<\/code>. Tenga en cuenta que no puede proporcionar una matriz de varios tipos de publicaciones, debe combinar varias de estas matrices en una configuraci\u00f3n AND.<\/p>\n<h3>Ubicaci\u00f3n por estado de la publicaci\u00f3n<\/h3>\n<pre><code>[\n    'param' =&gt; 'post_status',\n    'operator' =&gt; '==',\n    'value' =&gt; 'publish'\n]<\/code><\/pre>\n<p>Establezca el estado de publicaci\u00f3n deseado como <code>'value'<\/code>. Nuevamente, tenga en cuenta que no puede proporcionar una matriz de m\u00faltiples estados de publicaci\u00f3n, deber\u00e1 proporcionar cada valor deseado en una configuraci\u00f3n AND u OR.<\/p>\n<h3>Ubicaci\u00f3n por plantilla 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>Esto se muestra solo si la p\u00e1gina seleccionada (o el tipo de publicaci\u00f3n personalizada con soporte de plantilla de p\u00e1gina) ha elegido el nombre de plantilla de p\u00e1gina proporcionado.<\/p>\n<h3>Ubicaci\u00f3n por t\u00e9rmino taxon\u00f3mico asignado<\/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>Esta ubicaci\u00f3n es para cuando una publicaci\u00f3n tiene asignado un t\u00e9rmino espec\u00edfico. Deber\u00e1 proporcionar el nombre de la taxonom\u00eda, dos puntos y el slug del t\u00e9rmino como valor.<\/p>\n<h3>Ubicaci\u00f3n por tipo de p\u00e1gina<\/h3>\n<p>ACF agrupa las propiedades especiales de las p\u00e1ginas como &quot;tipo de p\u00e1gina&quot;. Se trata principalmente de si la p\u00e1gina actual es o no una p\u00e1gina principal o secundaria, pero tambi\u00e9n para las p\u00e1ginas de orientaci\u00f3n configuradas como p\u00e1gina principal de WordPress o p\u00e1gina de 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>Ubicaci\u00f3n: taxonom\u00eda<\/h3>\n<p>Una ubicaci\u00f3n para editar o agregar un t\u00e9rmino en una taxonom\u00eda.<\/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>Proporcione el nombre de la taxonom\u00eda como <code>'value'<\/code>. Tenga en cuenta que no puede proporcionar una matriz de m\u00faltiples taxonom\u00edas, pero puede proporcionar <code>'all'<\/code>para orientar todas las taxonom\u00edas.<\/p>\n<h3>Ubicaci\u00f3n: usuario<\/h3>\n<p>Esta ubicaci\u00f3n es para agregar o editar un perfil de usuario.<\/p>\n<pre><code>[\n    'param' =&gt; 'user_form',\n    'operator' =&gt; '==',\n    'value' =&gt; 'all'  \/\/ 'edit' || 'register'\n]<\/code><\/pre>\n<p>Proporcione <code>'edit<\/code>&#8216; para apuntar solo a la pantalla de edici\u00f3n de usuarios existentes, <code>'register'<\/code>para apuntar solo al formulario al registrar un nuevo usuario, o &#8216; <code>all'<\/code>para ambos de los anteriores.<\/p>\n<h3>Ubicaci\u00f3n: elemento del men\u00fa<\/h3>\n<p>Desde ACF 5.6, tambi\u00e9n puede agregar grupos de campos a los elementos del men\u00fa.<\/p>\n<pre><code>[\n    'param' =&gt; 'nav_menu_item',\n    'operator' =&gt; '==',\n    'value' =&gt; 'all'\n]<\/code><\/pre>\n<p>Puede configurar <code>value<\/code>para <code>all<\/code>aplicar el grupo a todos los elementos del men\u00fa, o puede especificar men\u00fas por ubicaci\u00f3n (ubicaciones registradas en su tema) o por ID de men\u00fa. Para uso de ubicaci\u00f3n <code>'location\/&lt;name&gt;'<\/code>, por lo que para una ubicaci\u00f3n llamada &#8216; <code>primary<\/code>&#8216; puede establecer un valor <code>'location\/primary'<\/code>para aplicar su grupo a un men\u00fa asignado solo a esta ubicaci\u00f3n. Si desea apuntar a un ID de men\u00fa espec\u00edfico, establezca el valor en una cadena de ese ID.<\/p>\n<h3>Ubicaci\u00f3n: widget<\/h3>\n<p>ACF incluso le proporciona una ubicaci\u00f3n dentro de la configuraci\u00f3n del widget sin modificar el c\u00f3digo central del 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>Puede apuntar a todos los widgets con <code>'all'<\/code>como <code>'value'<\/code>, o apuntar a un widget espec\u00edfico. Necesitar\u00e1 saber el &quot;ID interno&quot; del widget con el que est\u00e1n registrados.<\/p>\n<h3>Ubicaci\u00f3n: p\u00e1gina de opciones de ACF (solo Pro)<\/h3>\n<p>Con ACF Pro puede usar ACF para configurar p\u00e1ginas de administraci\u00f3n personalizadas.<\/p>\n<pre><code>[\n    'param' =&gt; 'options_page',\n    'operator' =&gt; '==',\n    'value' =&gt; 'acf-options-myoptionspage'\n]<\/code><\/pre>\n<p>Proporcione el nombre que estableci\u00f3 en <code>acf_add_options_page<\/code>&#8216;s <code>menu_slug<\/code>as <code>'value'<\/code>.<\/p>\n<h3>Ubicaci\u00f3n: bloque (solo Pro 5.8+)<\/h3>\n<p>ACF Pro (5.8+) tiene una funci\u00f3n para agregar bloques de Gutenberg con campos de ACF y controlar su salida con PHP. Bastante ingenioso para aquellos que a\u00fan no se han sumergido en agregar bloques personalizados de Gutenberg y el Javascript requerido.<\/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>Ahora estamos entrando en la parte m\u00e1s interesante; los campos mismos. ACF ofrece una (realmente) amplia gama de tipos de campo, y lo reiterar\u00e9; esta gu\u00eda no le muestra qu\u00e9 es cada campo y c\u00f3mo funcionan o c\u00f3mo se ven.<\/p>\n<p>En la matriz principal que proporciona <code>'fields'<\/code>, <code>acf_add_local_field_group()<\/code>proporciona una matriz donde cada campo es su propia matriz.<\/p>\n<p>El m\u00ednimo absoluto requerido para cada campo es el siguiente: un \u00fanico <code>'key'<\/code>que puede ser cualquier cosa que desee y probablemente nunca necesite consultarlo. Tambi\u00e9n necesita <code>'name'<\/code>cu\u00e1l es la clave meta (publicaci\u00f3n, usuario, t\u00e9rmino) en la que se guarda el valor del campo, y esta es la clave a la que se referir\u00e1 cuando obtenga el valor de los campos. Debe proporcionar un <code>'label'<\/code>y finalmente el crucial <code>'type'<\/code>que define qu\u00e9 tipo de campo estamos manejando. El resto de los campos depende de <code>'type'<\/code>como veremos cuando analicemos cada tipo de campo a continuaci\u00f3n.<\/p>\n<p>Este es el c\u00f3digo esqueleto para agregar un 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>Tenga en cuenta que necesitar\u00e1 lo anterior para cada campo, pero para no repetir el mismo c\u00f3digo, cada tipo de campo a continuaci\u00f3n solo incluir\u00e1 <code>'type'<\/code>y cualquier otro elemento necesario para ese tipo de campo.<\/p>\n<h3>Campo: entrada de texto<\/h3>\n<p>El campo m\u00e1s simple de todos. Todo lo que realmente necesitamos es:<\/p>\n<pre><code>[\n    'type' =&gt; 'text',\n]<\/code><\/pre>\n<p>Pero para personalizar a\u00fan m\u00e1s su entrada de texto, tambi\u00e9n puede proporcionar cualquiera de los siguientes:<\/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: \u00e1rea de texto<\/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: Control deslizante de rango<\/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: Contrase\u00f1a<\/h3>\n<p>Igual que la entrada de texto, excepto que todo lo que escriba en \u00e9l se cubrir\u00e1 con * como es de esperar en un campo de contrase\u00f1a.<\/p>\n<pre><code>[\n    'type' =&gt; 'password',\n    'prepend' =&gt; 'Prepend text',\n    'append' =&gt; 'Appended text',\n]<\/code><\/pre>\n<h3>Campo: Imagen<\/h3>\n<p>Selecci\u00f3n de una sola imagen.<\/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: Archivo<\/h3>\n<p>Similar a la imagen de arriba, excepto que no muestra una vista previa del archivo.<\/p>\n<pre><code>[\n    'type' =&gt; 'file',\n    'return_format' =&gt; 'array',  \/\/ 'id' || 'url'\n]<\/code><\/pre>\n<p>Tambi\u00e9n puede proporcionarlo <code>'mime_types' =&gt; '',<\/code>y configurarlo, por ejemplo, <code>'pdf,docx'<\/code>para que solo permita archivos PDF y DOCX.<\/p>\n<h3>Campo: Editor WYSIWYG<\/h3>\n<p>WYSIWYG es un editor de &quot;Lo que ves es lo que obtienes&quot;, con el que est\u00e1bamos familiarizados antes de que llegara 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>El par\u00e1metro <code>'media_upload'<\/code>y <code>'delay'<\/code>puede ser 1 (verdadero) o 0 (falso).<\/p>\n<h3>Campo: Seleccionar<\/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: casilla de verificaci\u00f3n<\/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>Tenga en cuenta que <code>'default_value'<\/code>puede ser una matriz de m\u00faltiples opciones.<\/p>\n<h3>Campo: Bot\u00f3n de opci\u00f3n<\/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>La configuraci\u00f3n <code>'other_choice'<\/code>en verdadero agrega un bot\u00f3n de opci\u00f3n adicional con la etiqueta &quot;Otro&quot; con una entrada de texto donde el usuario puede escribir algo.<\/p>\n<h3>Campo: Verdadero\/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>El <code>'ui_on_text'<\/code>y <code>'ui_off_text'<\/code>solo es v\u00e1lido si <code>'ui'<\/code>es 1, ya que est\u00e1n definiendo lo que deber\u00eda aparecer en el selector de interfaz de usuario especial.<\/p>\n<h3>Campo: Enlace<\/h3>\n<p>Le da un bot\u00f3n para ingresar un enlace, ya sea escribiendo o eligiendo contenido en su sitio de WordPress (debe estar familiarizado al agregar un enlace en el editor normal de WordPress).<\/p>\n<pre><code>[\n    'type' =&gt; 'link',\n    'return_format' =&gt; 'url',  \/\/ 'array'\n]<\/code><\/pre>\n<h3>Campo: Publicar objeto<\/h3>\n<p>Da un cuadro de selecci\u00f3n donde puede elegir contenido de WordPress. La selecci\u00f3n le permite buscar escribiendo y todo el contenido se divide por tipo de publicaci\u00f3n. Puede permitir que se elijan varias publicaciones o solo una.<\/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: Relaci\u00f3n<\/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: Elija t\u00e9rminos en una taxonom\u00eda<\/h3>\n<p>El selector de t\u00e9rminos de taxonom\u00eda tiene cuatro &quot;modos&quot; o tipos diferentes donde dos de ellos permiten m\u00faltiples opciones.<\/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: Seleccionar usuario<\/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>Tenga en cuenta que debe proporcionar una clave API de GoogleMaps v\u00e1lida a ACF para que este campo funcione, as\u00ed:<\/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: Selector de fecha<\/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: Selector de fecha y 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: Selector de tiempo<\/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: Selector de color<\/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: Galer\u00eda (solo 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 especiales de campos.<\/h3>\n<p>ACF tambi\u00e9n ofrece algunos tipos de campos que no guardan un valor per se, pero son m\u00e1s para fines organizacionales. Para todos estos establecidos <code>'name'<\/code>en una cadena vac\u00eda.<\/p>\n<h4>Mensaje HTML<\/h4>\n<p>Si necesita simplemente imprimir algo de HTML sin que realmente guarde un valor, puede 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 (solo ACF Pro)<\/h4>\n<p>Un repetidor contiene una serie de campos que se pueden repetir.<\/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>El elemento <code>sub_fields<\/code>espera una matriz de campos, tal como configur\u00f3 los campos arriba.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Esta no es una gu\u00eda exhaustiva, ya que ACF ofrece una amplia gama de opciones y personalizaciones. Pero deber\u00eda cubrir las opciones m\u00e1s utilizadas y los casos de uso personalizados. Personalmente, me encuentro refiri\u00e9ndome a esto con bastante frecuencia cada vez que agrego campos ACF para clientes. E incluso para las opciones m\u00e1s extra\u00f1as, esta gu\u00eda es suficiente para no tener que inflar mis archivos PHP con el c\u00f3digo de exportaci\u00f3n de ACF. \u00a1Espero que esto haya sido \u00fatil para ti tambi\u00e9n!<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una referencia completa sobre c\u00f3mo configurar bien los campos y grupos de campos personalizados avanzados por c\u00f3digo PHP en lugar de pegar c\u00f3digo inflado de la herramienta de exportaci\u00f3n ACF PHP.<\/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":[892,892,810,716,716,1110,810,840,840,861,861],"tags":[1172],"class_list":["post-233803","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-complementos","category-desarrollador","category-n-a","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233803","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=233803"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233803\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/224889"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=233803"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=233803"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=233803"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}