Archivos de Tags: create @es

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.