Usando dbDelta con WordPress para crear y alterar tablas

dbDelta se usa en WordPress para crear y alterar tablas en la base de datos y normalmente lo usarás en register_activation_hook durante el proceso de instalación de un plugin por ejemplo. Tanto si quieres crear como alterar una tabla siempre se le pasa a dbDelta una CREATE TABLE. Ella misma detecta si la tabla ya existe y hace los cambios necesarios en caso de tener que hacer una update.

430px-WP3.8-ERD

Esta función está definida en wp-admin/includes/upgrade.php y por tanto tienes que importarlo ANTES de llamar a dbDeta:

require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );

Pero esta función es un poco especial. No puedes pasarle cualquier sentencia CREATE TABLE. Tal y como se dice en la documentación:

  • Debes poner cada campo es su propia fila en la sentencia SQL.
  • Debes dejar dos espacios entre las palabras PRIMARY KEY y la definición de la clave primaria.
  • Debes usar la palabra clave KEY en vez de si sinónimo INDEX y debes incluir al menos una KEY.
  • No debes usar ningún apóstrofe o acento grave al definir los nombres de los campos.

Basándonos en estas premisas, la siguiente SQL no funcionaría y terminaría SILENCIOSAMENTE sin hacer nada:

global $wpdb;
$sql = "CREATE TABLE table_name(`id` int(10) NOT NULL AUTO_INCREMENT, `extra_id` int(5) NOT NULL,`username` tinytext NOT NULL);";

require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );

Como puedes ver todos los campos están en la misma línea, no hay definida ninguna PRIMARY KEY y los campos usan acentos graves. La sentencia SQL correcta sería:

global $wpdb;
$sql = "CREATE TABLE table_name (
    id int(10) NOT NULL AUTO_INCREMENT,
    extra_id int(5) NOT NULL,
    username tinytext NOT NULL,
    PRIMARY KEY  (id,extra_id)
);";

require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );

He usado esta PRIMARY KEY de 2 campos como ejemplo por que hay otro detalle con dbDelta: no puede haber espacios dentro de la definición de la clave primaria.

Espero que este artículo os resulte útil. Estos “errores” silenciosos son bastante difíciles de descubrir.

You might also like

Cambiar el prefijo de tablas de WordPress para evitar ataques de SQL injection
WordPress usa un prefijo de tablas en caso de que quieras/tengas que instalar varios WordPress en la...

Solucionar “Configuration of pmadb… not OK” en phpMyAdmin
Puede que te aparezca este error en pmpMyAdmin:Para solucionarlo hay que importar/crear la base...

Eliminar una action de WordPress en un tema hijo
Si quieres eliminar una action de WordPress en un tema hijo definido en el tema padre por ejemplo así:function...

Salir del modo de mantenimiento de WordPress cuando falla una actualización
Para salir del modo de mantenimiento de WordPress cuando falla una actualización es tan sencillo como...

Dejar un comentario?

0 Comentarios.

Deje un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.