ACF Custom Database Tables es un plugin de pago (99,00$AUD) de la empresa Hookturn, que extiende ACF (Advanced Custom Fields) y que gestiona automáticamente los datos en tablas personalizadas. Con esta herramienta cada campo de ACF se transforma en una columna de una tabla. Sin dudas es una opción más que interesante para proyectos que tengan una gran carga de consulta de base de datos. Me puse en contacto con Aaron Rutley (co-creador del plugin) quien amablemente me cedió una licencia para que pudiera trastear y escribir esta review donde os detallaré por qué, cómo y cuándo se debe utilizar este plugin.

¿Por qué crear nuevas tablas?
Son varios los motivos por los que podríamos optar por guardar nuestros datos de WordPress en nuevas tablas, vamos a ver algunos de ellos en detalle:
Mayor seguridad
Al día de la fecha existen 55,214 plugins, donde muchos de ellos guardan sus configuraciones o datos en tablas como wp_options
o wp_postmeta
¿Compartirías la información valiosa de tu negocio junto a la de otros plugins con posibles fallos de seguridad? En el caso de información muy sensible yo crearía una nueva tabla personalizada dónde con un nombre totalmente ajeno a la estructura por defecto de WordPress ya estaríamos más protegidos.
Estructura horizontal
WordPress debe su éxito a la estructura de crecimiento vertical conocida como key => value
, aunque esta estructura dificulta muchas tareas como la creación de consultas complejas o extracción de datos. Este plugin crea tablas personalizadas de crecimiento horizontal (cada campo es una columna) permitiendo una mejor legibilidad, facilidad de exportación y búsquedas mucho más rápidas.

Operaciones más rápidas
Al guardar la información en tablas personalizadas hará que la escritura, recuperación y borrado de las mismas sean mucho más rápida. No es lo mismo buscar un registro único en una tabla personaliza a buscar entre cientos, miles o millones de registros compartidos con otras entidades (otros custom post types, menús, adjuntos, etc).
Mayor escalabilidad
Al tener la información separada permitirá que la escalabilidad de nuestro proyecto sea más optima. Si sabemos de antemano que un tipo de entidad puede tener millones de registros y/o que debemos realizar consultas SQL muy complejas sobre ellas, lo ideal es separarlo en una tabla personalizada para consumir la menor cantidad de recursos posibles del servidor (procesador, memoria, etc).
Ejemplo de uso
Obviamete que para probar el plugin he creado una pequeña estructura de información que me permitió ver y trastear el comportamiento en la base de datos. Para ello diseñé una estructura muy básica de Libros => Autores que podemos ver en el siguiente diagrama.

Implementación:
- Primero he creado los Custom Post Types «Libros» y «Autores».
- He dado de alta los grupos de campos personalizados con ACF para cada Custom Post Type.
- El plugin añade una nueva opción al formulario de ACF, dando la posibilidad a los desarrolladores de crear una tabla personalizada para cada grupo de campos.

- Cuando guardamos los cambios de los campos personalizados aparecerá un nuevo mensaje como el siguiente:

El plugin generará un fichero JSON que se guardará en la carpeta de uploads. Este fichero contienen toda la información necesaria para crear la(s) tabla(s) en la base de datos. Este último proceso debe ser manual, ya que el usuario debe indicar explícitamente que es consciente que esta acción conlleva una modificación en la base de datos.
- Al pinchar sobre el botón «Manage Database Tables» (Administrar las tablas de base de datos) nos llevará a una página de configuración con los siguientes datos:

El sistema nos indica que ha encontrado un JSON (el de libros en este caso) y que está listo para crear o modificar la base de datos. Para ello nos piden una verificación que he marcado con lineas punteadas en azul. En inglés indica «Entiendo que este proceso modificará mi base de datos y que he realizado una copia de seguridad en caso que tenga que deshacer los cambios«.
En cristiano lo que te están diciendo es que al modificar la base de datos se puede liar (aunque no debería) y que obviamente no se harán cargo ante cualquier problema que surja. Por ello mismo te recomiendo que siempre hagas pruebas en local y/o que realices una copia de seguridad de todo tu contenido.
- Repetimos los pasos para la entidad «Autores» y ya tenemos las tablas personalizadas en nuestra base de datos.

Ahora ya podemos dar de alta nuestros dos registros. Primero el autor, ya que lo necesitaremos luego para seleccionarlo en la relación de la entidad «Libro».

Y este es el resultado final en la tabla wp_libros.

¿Qué hay de la compatibilidad?
No os preocupéis porque el plugin sigue generando un registro en la tabla wp_posts
como así también las relaciones con su tabla wp_postmeta
. Sí, el plugin duplica el contenido con el único fin de mantener la compatibilidad con el resto de los plugins que no saben absolutamente nada de la existencia de tablas personalizadas.
Pero hay buenas noticias, podemos desactivar la creación de los registros duplicados, mediante el uso de los filtros:
<?php
/*
* Deshabilita la creación de valores meta en las tabla wp_postmeta
*/
add_filter( 'acfcdt/settings/store_acf_values_in_core_meta', '__return_false' );
Tablas de Relaciones
Se pueden crear tablas de relaciones a partir de campos específicos de ACF. Estos son los tipos de campos ACF de los cuales podemos crear tablas relacionadas:
- Relación
- Objeto Post
- Taxonomía
- Link de página
- Usuario
Una vez seleccionado el campo de relación debemos agregar un pequeño filtro para que el plugin cree las nuevas tablas:
<?php
/*
* Este código crea las tablas de relación para los campos del tipo relación en forma global.
*/
add_filter( 'acfcdt/settings/enable_join_tables_globally', '__return_true' );
Al guardar los campos personalizados, podemos ver cómo aparece una nueva línea en el mensaje indicando la creación de la nueva tabla para la Relación entre ambas entidades:

Y ahora sí podemos ver cómo queda finalmente el registro del libro en su nueva tabla de relación.

El post_id 50, el libro «Don Quijote de la Mancha» tiene como autor al autor 48 «Miguel de Cervantes». La columna _sort_order es utilizada por el propio plugin.
Limitaciones del plugin
El plugin de momento tiene limitaciones para implementar los campos:
- Repetidor
- Grupo
- Contenido flexible
- Clon
Estos son campos más complejos que estarán representados en sub-tablas en versiones posteriores del plugin.
Conclusión
Como aclaré al principio del artículo, este plugin es específico para proyectos que requieran de búsquedas complejas a base de datos. El hecho de realizarlas sobre tablas horizontales permitirá consultas SQL menos complejas y por ende un mejor tiempo de respuesta y un uso más efectivo de los recursos del servidor. El plugin permite muchas más configuraciones mediante código las cuales están muy bien documentadas.
Me resta aún aprender cómo abstraer toda esta configuración para incluirlo en plugins independientes. Si bien ACF tiene una funcionalidad local-JSON que crea ficheros JSON «on the fly», este lo realiza en una carpeta del tema activo, algo que no termina de agradarme del todo.
Jsosa
Exelente post!!