Blog personal de IT, viajes y otros hobbies

ACF Custom Database Tables – Tablas personalizadas para ACF

ACF Custom Database Tables – Tablas personalizadas para ACF

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.

Hookturn
Hookturn es la empresa que está detrás de 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.

ejemplo crecimiento vertical y horizontal base de datos
Ejemplo de crecimiento horizontal y vertical en tablas de base de datos.

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.

diagrama libro autor
Diagrama de Libro / Autor. Donde un libro puede tener uno o más autores.

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.
acf custom datatables nueva opcion
Nueva opción para indicar la creación de una tabla personalizada. En la segunda opción podemos especificar el nombre.
  • Cuando guardamos los cambios de los campos personalizados aparecerá un nuevo mensaje como el siguiente:
nuevo mensaje custom datatables acf

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:
cuadro de dialogo para crear modificar base de datos acf custom datatables
Cuadro de diálogo para aceptar la creación o modificación de la base de datos de nuestro WordPress.

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.
custom datatables acf base de datos final
Estructura final de una de las tablas personalizadas.

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».

alta de custom post types con acf
Alta de registros para ambos Custom Post Types con sus respectivos campos personalizados.

Y este es el resultado final en la tabla wp_libros.

resultado fila libro
Registro 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:

tabla de relacion acf custom datatables

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

tabla relacion custom datatables acf

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.

Anterior

OBS Open Broadcaster Software – Opción gratuita para tus videos

Siguiente

La Catedral de Justo en Mejorada del Campo, Madrid, España 🇪🇸

  1. Jsosa

    Exelente post!!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Funciona con WordPress & Tema de Anders Norén