{"id":752,"date":"2023-10-23T10:27:47","date_gmt":"2023-10-23T10:27:47","guid":{"rendered":"https:\/\/cachitoswp.com\/?p=752"},"modified":"2025-06-01T18:15:56","modified_gmt":"2025-06-01T18:15:56","slug":"advanced-custom-fields-with-super-speed","status":"publish","type":"post","link":"https:\/\/cachitoswp.com\/en\/advanced-custom-fields-with-super-speed\/","title":{"rendered":"Advanced Custom Fields with super speed"},"content":{"rendered":"\n<p class=\"has-primary-color has-text-color has-large-font-size wp-block-paragraph\">\u00bfTu sitio web WordPress usa muchos ACF y te va lento el back-end? \u00bfQuieres que funcione m\u00e1s r\u00e1pido, y ahorrar consultas en tu base de datos? Presta atenci\u00f3n, pues te cuento algunas claves a tener en cuenta porque tu sitio puede correr como si no tuvieras ni siquiera instalado ACF.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Los custom fields engordan y entorpecen la base de datos de WordPress. No s\u00f3lo la tabla de _postmeta, tambien la tabla _options.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No ocurre s\u00f3lo con ACF, esto es normal, cualquier plugin que a\u00f1ada campos personalizados a nuestras entradas (Woocommerce, etc), har\u00e1 que la BD sea m\u00e1s densa y por lo tanto las consultas internas a \u00e9sta ser\u00e1n m\u00e1s y m\u00e1s lentas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esto puede hacer que el backend vaya lento, y sea tedioso editar y guardar las entradas, o simplemente movernos dentro de nuestro administrador. Sobretodo si est\u00e1s usando un hosting compartido econ\u00f3mico, en donde los recursos de memoria y l\u00edmites de nuestra configuraci\u00f3n de php ser\u00e1n m\u00e1s limitados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La soluci\u00f3n no siempre debe pasar por adquirir un hosting m\u00e1s potente, puede que nuestro site sea mediano y no nos compense el coste. Pues a optimizar toca, que se puede.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"optimizar-el-backend-y-la-base-de-datos-generando-ficheros-en-tu-tema\">Optimizar el backend y la base de datos generando ficheros en tu tema.<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Puede verse complejo, pero no lo es tanto. De hecho, la base de datos, quiz\u00e1 no haga falta tocarla. S\u00f3lo hay que separar cierta informaci\u00f3n que no necesariamente tiene que estar dentro de \u00e9sta. <\/p>\n\n\n\n    .blockytoys-product-banner {\n\n    background:#fefefe;\n    color: #3c1d04!important;\n}\n    .banner-info-title {\n        color:#ea5515;\n    }\n    .banner-info-button {\n        background-color:#ea5515;\n    }\n\n<a class=\"blockytoys-product-banner category-banner\" rel=\"sponsored\" data-sal=\"flip-up\" data-sal-repeat title=\"OFERTAZA:  Discos, libros y comics, inform\u00e1tica retro y m\u00e1s\" data-product=\"https:\/\/wham-vintage.com\" href=\"https:\/\/wham-vintage.com\">\n    \n    <figure class=\"product-banner-pic\">\n        <img decoding=\"async\" alt=\"Tienda retro de vintage y coleccionismo en Barcelona\" data-sal=\"zoom-in\" data-sal-delay=\"200\" src=\"https:\/\/cachitoswp.com\/wp-content\/uploads\/2023\/10\/mercadillo-vintage-coleccionismo-blockytoys.webp\" loading=\"lazy\" width=\"auto\" height=\"auto\" \/>\n    <\/figure>\n    <div class=\"product-banner-info\">\n<h3 class=\"banner-info-title\">Coleccionismo y vintage<\/h3>\n        <p class=\"banner-info-subtitle\">Discos, libros y comics, inform\u00e1tica retro y m\u00e1s<\/p>\n        <button class=\"banner-info-button\">Explora ahora<\/button>\n    <\/div>\n<\/a>\n\t\t<style>.gcb-editor-form h3 {\n        font-size:14px;\n    }\n    .blockytoys-product-banner.category-banner {\n        text-decoration:none!important;\n        display:flex;\n        cursor:pointer;\n        flex-direction:column;\n        flex-wrap:wrap;\n        align-items:center;\n        justify-content:middle;\n        position:relative;\n        z-index:1;\n        border-radius: 0 15px 0 15px;\n        overflow:hidden;\n    }\n    \n    .blockytoys-product-banner.category-banner::before {\n        content:\"PUBLIACIDEZ\";\n        display:inline-block;\n        position:absolute;\n        left:0;\n        top:0;\n        color:#fff;\n        background:steelblue;\n        padding:2px 6px;\n        line-height:1;\n        font-size:9px;\n        letter-spacing:0.1em;\n    }\n    \n    .product-banner-pic {\n        margin:0;\n        text-align:center;\n    }\n    .product-banner-pic img {\n        width:100%;\n    }\n    .product-banner-info {\n        margin-top:-30px;\n        padding:0 25px 25px 25px;\n        box-sizing:border-box;\n        text-align:center;\n    }\n    .banner-info-title {\n        margin:0;\n        font-size:26px;\n        font-weight:bold;\n    }\n    .banner-info-subtitle {\n        margin:0;\n        font-size:17px;\n        font-weight:normal;\n    }\n    .banner-info-button {\n        margin-top:10px;\n        color:#fff;\n        appearance:none;\n        display:inline-block;\n        min-width:140px;\n        border:0;\n        font-family:inherit;\n        text-transform:uppercase;\n        padding:10px;\n        font-weight:bold;\n        font-size:14px;\n        cursor:pointer;\n    }\n    @media(min-width:768px) {\n        .blockytoys-product-banner.category-banner {\n            flex-direction:column;\n            background-repeat:no-repeat,no-repeat;\n            background-position:0 1000px, 100% 1000px;\n            background-size:110px auto, 120px auto;\n            transition:1s;\n            background-image:url(https:\/\/cachitoswp.com\/wp-content\/uploads\/2023\/06\/nerd-quiere-comprar.png),\n            url(https:\/\/cachitoswp.com\/wp-content\/uploads\/2023\/06\/blockytoys-logo-color.svg);\n        \n        }\n        .sal-animate.blockytoys-product-banner.category-banner {\n            background-position: 0 100%, 96% 89%\n        }\n        .product-banner-pic {\n            width:70%;\n        }\n        .product-banner-info {\n            padding-top:0;\n            width:100%;\n            }\n    }\n    @keyframes blinky {\n        0% {\n            transform:scale(1);\n        }\n        50% {\n            transform:scale(1.2);\n        }\n        100% {\n            transform:scale(1);\n        }\n    }\n    .jastags {\n      font-family: monospace, mono;\n      font-size: 12px;\n      line-height: 1.5;\n      margin: 5px 0 0 0;\n    }<\/style>\n\t\t\n\n<h3 class=\"wp-block-heading\" id=\"pasar-a-nuestro-theme-archivos-todo-lo-que-no-debe-estar-en-nuestra-base-de-datos\">Pasar a nuestro theme (archivos) todo lo que NO debe estar en nuestra base de datos.<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Todo lo que pueda estar en archivos, ponlo en archivos. El acceso a estos es directo y se cachean con mayor facilidad. De lo que sea, no s\u00f3lo ACF, cualquier estilo, script, funci\u00f3n, si puede estar en tu functions.php, o en archivos incluidos, ser\u00e1 accedida con mayor velocidad que si est\u00e1 en tu base de datos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Los plugins nos facilitan la vida, pero hay que saber cuando se deben volcar al theme ciertas cosas. Unos ejemplos de informaci\u00f3n que podemos tener en nuestra base de datos y que puede ser externalizada a archivos es:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Estilos en el css personalizado del backend, o de algunos campos de plugin<\/li>\n\n\n\n<li>Definiciones de Custom Post Types o taxonom\u00edas creadas con alg\u00fan generador visual, del tipo CPT UI o similares.<\/li>\n\n\n\n<li>Definiciones de grupos de campos personalizados<\/li>\n\n\n\n<li>Definiciones e info en cajitas de campos de builders, visual composers y editores visuales, de tipo elementor, divi y similares (esto es NEFASTO).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">El css es tan sencillo como quitarlo del backend e incluirlo al css del theme, ya sea en el style.css de nuestro tema hijo, o incorpor\u00e1ndolo a los estilos cargados desde nuestro theme usando la funci\u00f3n enqueue. Incluso meter a saco un &lt;link rel=\u00bbstylesheet\u00bb&#8230; en el &lt;head&gt; es mejor que tenerlo en el admin. Si luego minificas o juntas pues mejor. Todo que sea cacheabe siempre.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Los custom post types y\/o taxonom\u00edas personalizados, tambi\u00e9n debes pasarlos al php de tu plantilla. No est\u00e1 mal usar un generador que te permita dise\u00f1ar y administrar tus CPT, pero una vez ya los tengas, usa la herramienta que te ofrecen estos plugins para generar el c\u00f3digo PHP que registra estos tipos de contenido y p\u00e1salo al theme. Siendo leidos del theme ahorraremos consultas a la bbdd cada vez que se cargue el backend.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nos vamos a centrar ahora en el tercer punto, del cuarto s\u00f3lo puedo decirte que no uses jam\u00e1s elementor ni similares. P\u00e1sate al editor de bloques de WordPress, Gutenberg, porque este se cre\u00f3 para mejorar y barrer el caos y destrozo que generan estos editores visuales en los sites de WordPress. <\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"acelerar-los-acf-generando-archivos-php-o-json\">Acelerar los ACF generando archivos PHP o JSON.<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Nuestros grupos y campos, creados usando ACF se pueden pasar a archivos PHP o JSON. El m\u00e9todo m\u00e1s r\u00e1pido y eficiente, es generar el c\u00f3digo PHP que registra nuestros campos e incorporarlo en nuestro theme. Pero una vez est\u00e1n en este formato, son m\u00e1s \u00abinmanejables\u00bb, a la hora de hacer cambios o ser reutilizados en diferentes proyectos. Por esto, existe el m\u00e9todo JSON, que es m\u00e1s vers\u00e1til.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"630\" src=\"https:\/\/cachitoswp.com\/wp-content\/uploads\/2023\/10\/acf-json.jpg\" alt=\"Campos de ACF en archivos JSON\" class=\"wp-image-757\" style=\"width:400px\" srcset=\"https:\/\/cachitoswp.com\/wp-content\/uploads\/2023\/10\/acf-json.jpg 1200w, https:\/\/cachitoswp.com\/wp-content\/uploads\/2023\/10\/acf-json-640x336.jpg 640w, https:\/\/cachitoswp.com\/wp-content\/uploads\/2023\/10\/acf-json-768x403.jpg 768w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">La generaci\u00f3n de archivos JSON de nuestras definiciones de grupos de custom fields, est\u00e1 automatizada si creamos un directorio \u00ab\/acf-json\u00bb en la raiz de nuestra plantilla o theme.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si no hay ning\u00fan problema de usuarios\/permisos en el sistema de archivos, cada vez que guardamos los cambios en un grupo de campos, se deber\u00eda generar el archivo group_xxxxxxx.json en esta carpeta<strong>. Si no nos funciona, te voy a explicar los pasos para hacerlo de forma manual. Es MUY sencillo:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Usando la herramienta de exportaci\u00f3n, exporta tu grupo a fichero JSON. No exportes m\u00e1s de un grupo a la vez, debes hacerlo de uno en uno. Edita el fichero.<\/li>\n\n\n\n<li>Primero, copia el nombre del grupo del inicio del json, y guarda el fichero usando ese nombre punto json. O bi\u00e9n renombra de acf_export&#8230;json a group_xxxx.json.<\/li>\n\n\n\n<li>Ahora s\u00f3lo tienes que borrar del array json exportado los s\u00edmbolos [ y ] del comienzo y del final.<\/li>\n\n\n\n<li>Por \u00faltimo, tras el \u00faltimo dato del array json, \u00abshow_in_rest\u00bb: (0 o 1), a\u00f1adiremos otra l\u00ednea con el dato &#8216;modified&#8217;:TIMESTAMP en donde timestamp pondremos un timestamp de la hora actual. Usa google y busca \u00abactual timestamp\u00bb, obtendr\u00e1s la fecha y hora actual en formato timestamp. Copia el n\u00famero y p\u00e9galo en el valor de modified.<\/li>\n\n\n\n<li>Sube el archivo group_loquesea.json usando git o ftp a la carpetita acf-json de tu theme. Y ya est\u00e1, tu wp dara prioridad a tu json.<\/li>\n\n\n\n<li>Si tienes muchos grupos de campos, y los pasas todos a ficheros, sea usando json o php, acelerar\u00e1s tu site un 1000%, garantizado.<\/li>\n<\/ol>\n\n\n<h2 class=\"wp-block-heading\" id=\"acf-todavia-mas-rapidos-que-te-cagas-acf-custom-database-tables\">ACF todav\u00eda m\u00e1s r\u00e1pidos que te cagas: ACF Custom Database Tables<\/h2>\n\n\n<p class=\"wp-block-paragraph\">La panacea es ya algo superpro que te voy a contar ahora. La info de los custom fields (no sus definiciones, sino sus valores) sigue engordando nuestros termmeta o postmeta. Leer de cada post estos campos meta, tambi\u00e9n es tedioso para el rendimiento de nuestra bbdd.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si ya has optimizado alguna vez una base de datos, sabes que por ejemplo, tras cada actualizaci\u00f3n de woocommerce, tu admin te avisa de que se est\u00e1 haciendo un trabajo en \u00e9sta en segundo plano. Es una operaci\u00f3n de limpieza y tambi\u00e9n de generaci\u00f3n de \u00edndices. Podemos generar \u00edndices y optimizaciones de nuestras tablas usando phpMyAdmin, o bien con plugins como WP Optimize, herramientas muy recomendables. Pero te voy a decir 2 plugins m\u00e1s que van a hacer que tu site se tome 5 red bulls:<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"tablas-exclusivas-para-tus-custom-fields-con-acf-custom-database-tables-like-a-boss\">Tablas exclusivas para tus custom fields con ACF Custom Database Tables LIKE A BOSS<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Este plugin nos generar\u00e1 de los acf que le digamos, tablas aparte. Los datos de cada post, se guardar\u00e1n en la nueva tabla pero tambi\u00e9n se seguir\u00e1n guardando en postmeta. Pero, el valor de cada campo se mirar\u00e1 primero en la tabla custom. Por lo que la velocidad aumentar\u00e1, porque esa tabla ser\u00e1 infinitamente m\u00e1s peque\u00f1a que la tabla postmeta.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-plugin-directory wp-block-embed-plugin-directory\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"XhwCOIvm9o\"><a href=\"https:\/\/wordpress.org\/plugins\/acf-to-custom-database-tables\/\">ACF to Custom Database Tables<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8220;ACF to Custom Database Tables&#8221; &#8212; Plugin Directory\" src=\"https:\/\/wordpress.org\/plugins\/acf-to-custom-database-tables\/embed\/#?secret=3jXK40HhxW#?secret=XhwCOIvm9o\" data-secret=\"XhwCOIvm9o\" width=\"500\" height=\"282\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><figcaption class=\"wp-element-caption\">Como nota, lo he probado y funciona de maravilla. Pero s\u00f3lo me ha funcionado con grupos ACF de post, p\u00e1ginas o cpt. Para grupos asignados a un term me pet\u00f3.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Bonus track<\/strong> (esto \u00faltimo para toda tu base de datos, no s\u00f3lo porque uses ACF): A\u00f1ade \u00edndices de alto rendimiento a las tablas de tu base de datos con este plugin:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-plugin-directory wp-block-embed-plugin-directory\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"YbW8tOAx62\"><a href=\"https:\/\/wordpress.org\/plugins\/index-wp-mysql-for-speed\/\">Index WP MySQL For Speed<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8220;Index WP MySQL For Speed&#8221; &#8212; Plugin Directory\" src=\"https:\/\/wordpress.org\/plugins\/index-wp-mysql-for-speed\/embed\/#?secret=u25i1Bck55#?secret=YbW8tOAx62\" data-secret=\"YbW8tOAx62\" width=\"500\" height=\"282\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Si sigues los pasos de esta mini-guia, tu WordPress volar\u00e1 y tu backend ir\u00e1 como la seda. Y t\u00fa, \u00bftienes tambi\u00e9n alg\u00fan consejo bueno para optimizar acf para que el admin no vaya lento? \u00a1Pues comp\u00e1rtelo en los comentarios! \u00a1Que para eso est\u00e1n!<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"apendice-comparativa-de-rendimiento-de-custom-fields-en-bbdd-en-json-y-en-php\">Ap\u00e9ndice: Comparativa de rendimiento de custom fields en BBDD, en json y en php<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Hilo de twitter de recomendada lectura:<\/p>\n\n\n\n<blockquote class=\"twitter-tweet\"><p lang=\"en\" dir=\"ltr\">An interesting question some people keep asking me. I wanted to write an article to explain it. But let&#39;s make a thread instead!\ud83d\udcdc <a href=\"https:\/\/t.co\/aXCb4nHPEz\">https:\/\/t.co\/aXCb4nHPEz<\/a><\/p>&mdash; hwk (@hwkfr) <a href=\"https:\/\/twitter.com\/hwkfr\/status\/1241727434967441410?ref_src=twsrc%5Etfw\">March 22, 2020<\/a><\/blockquote> <script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfTu sitio web WordPress usa muchos ACF y te va lento el back-end? \u00bfQuieres que funcione m\u00e1s r\u00e1pido, y ahorrar consultas en tu base de datos? Presta atenci\u00f3n, pues te cuento algunas claves a tener en cuenta porque tu sitio puede correr como si no tuvieras ni siquiera instalado ACF. Los custom fields engordan y [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":753,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[1,7,16],"tags":[35,26,36,31],"class_list":["post-752","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-diseno-desarrollo-web-wordpress","category-plugins","category-tutoriales","tag-acf","tag-base-de-datos","tag-json","tag-plugins-muy-utiles"],"mb":[],"mfb_rest_fields":["title"],"_links":{"self":[{"href":"https:\/\/cachitoswp.com\/en\/wp-json\/wp\/v2\/posts\/752","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cachitoswp.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cachitoswp.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cachitoswp.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cachitoswp.com\/en\/wp-json\/wp\/v2\/comments?post=752"}],"version-history":[{"count":1,"href":"https:\/\/cachitoswp.com\/en\/wp-json\/wp\/v2\/posts\/752\/revisions"}],"predecessor-version":[{"id":1310,"href":"https:\/\/cachitoswp.com\/en\/wp-json\/wp\/v2\/posts\/752\/revisions\/1310"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cachitoswp.com\/en\/wp-json\/wp\/v2\/media\/753"}],"wp:attachment":[{"href":"https:\/\/cachitoswp.com\/en\/wp-json\/wp\/v2\/media?parent=752"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cachitoswp.com\/en\/wp-json\/wp\/v2\/categories?post=752"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cachitoswp.com\/en\/wp-json\/wp\/v2\/tags?post=752"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}