dbDelta no crea tablas
Revisé muchos hilos, la página del codex y probé diferentes cosas pero mi código no parece estar creando las tablas. No logro identificar dónde está el error. Verifiqué booking_db_version en la base de datos y se actualiza cuando lo modifico en el archivo.
Aquí está el código
global $booking_db_version;
$booking_db_version = "1.0.0";
function booking_install() {
global $wpdb;
global $booking_db_version;
global $tableprefix;
$installed_version = get_option('booking_db_option');
$tableprefix = $wpdb->prefix . 'booking_';
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
if ( $installed_version !== $booking_db_version ) {
/* Crear tabla para paquetes */
$packagetable = $tableprefix . 'packages';
$sql = "create table $packagetable (
id mediumint(9) NOT NULL AUTO_INCREMENT,
name text NOT NULL,
description text NOT NULL,
city1 text NOT NULL,
city2 text NOT NULL,
PRIMARY KEY (id)
);";
dbDelta($sql);
/* Crear tabla para hoteles */
$hoteltable = $tableprefix . 'hotels';
$sql = "create table $hoteltable (
id mediumint(9) NOT NULL AUTO_INCREMENT,
name text NOT NULL,
city text NOT NULL,
price decimal(10,2) NOT NULL,
PRIMARY KEY (id)
);";
dbDelta($sql);
/* Crear tabla para addons */
$addontable = $tableprefix . 'addons';
$sql = "create table $addontable (
id mediumint(9) NOT NULL AUTO_INCREMENT,
name text NOT NULL,
addongroup text NOT NULL,
price decimal(10,2) NOT NULL,
PRIMARY KEY (id)
);";
dbDelta($sql);
/* Crear tabla para grupos de addons */
$addongrouptable = $tableprefix . 'addon_groups';
$sql = "create table $addongrouptable (
id mediumint(9) NOT NULL AUTO_INCREMENT,
name text NOT NULL,
perhead text NOT NULL,
PRIMARY KEY (id)
);";
dbDelta($sql);
update_option('booking_db_version', $booking_db_version);
}
}
register_activation_hook(__FILE__, 'booking_install');

Del WordPress-codex sobre dbDelta:
La función dbDelta examina la estructura actual de la tabla, la compara con la estructura deseada y agrega o modifica la tabla según sea necesario, por lo que puede ser muy útil para actualizaciones (consulte wp-admin/upgrade-schema.php para más ejemplos de cómo usar dbDelta). Sin embargo, ten en cuenta que la función dbDelta es bastante exigente. Por ejemplo:
- Debes poner cada campo en su propia línea en tu sentencia SQL.
- Debes tener dos espacios entre las palabras PRIMARY KEY y la definición de tu clave primaria.
- Debes usar la palabra KEY en lugar de su sinónimo INDEX y debes incluir al menos una KEY.
- No debes usar apóstrofes o backticks alrededor de los nombres de los campos.
Con esas advertencias, aquí están las siguientes líneas en nuestra función, que realmente crearán o actualizarán la tabla. Necesitarás sustituir tu propia estructura de tabla en la variable $sql.
Cambié tu sql: "create table $packagetable (
A esto: "CREATE TABLE " . $packagetable . " (
Aquí tienes una copia funcional de tu código:
global $booking_db_version;
$booking_db_version = "1.0.0";
function booking_install() {
global $wpdb;
global $booking_db_version;
global $tableprefix;
$installed_version = get_option('booking_db_option');
$tableprefix = $wpdb->prefix . 'booking_';
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
if ( $installed_version !== $booking_db_version ) {
// Crear tabla para paquetes
$packagetable = $tableprefix . 'packages';
$sql = "CREATE TABLE " . $packagetable . " (
id INT NOT NULL AUTO_INCREMENT,
name TEXT NOT NULL,
description TEXT NOT NULL,
city1 TEXT NOT NULL,
city2 TEXT NOT NULL,
PRIMARY KEY (id)
) ". $charset_collate .";";
dbDelta($sql);
// Crear tabla para hoteles
$hoteltable = $tableprefix . 'hotels';
$sql = "CREATE TABLE " . $hoteltable . " (
id mediumint(9) NOT NULL AUTO_INCREMENT,
name text NOT NULL,
city text NOT NULL,
price decimal(10,2) NOT NULL,
PRIMARY KEY (id)
) ". $charset_collate .";";
dbDelta($sql);
// Crear tabla para complementos
$addontable = $tableprefix . 'addons';
$sql = "CREATE TABLE " . $addontable . " (
id mediumint(9) NOT NULL AUTO_INCREMENT,
name text NOT NULL,
addongroup text NOT NULL,
price decimal(10,2) NOT NULL,
PRIMARY KEY (id)
) ". $charset_collate .";";
dbDelta($sql);
// Crear tabla para grupos de complementos
$addongrouptable = $tableprefix . 'addon_groups';
$sql = "CREATE TABLE " . $addongrouptable . " (
id mediumint(9) NOT NULL AUTO_INCREMENT,
name text NOT NULL,
perhead text NOT NULL,
PRIMARY KEY (id)
) ". $charset_collate .";";
dbDelta($sql);
update_option('booking_db_version', $booking_db_version);
}
}
register_activation_hook(__FILE__, 'booking_install');

Eso funcionó. Leí que dbDelta es delicado pero no me di cuenta de que no capitalizar CREATE TABLE
haría que fallara.

Aunque WordPress no lo menciona en su página del codex, no puedes tener una coma al final de la última línea. Ejemplo: PRIMARY KEY (id),
. dbDelta incluso dice que crea la tabla aunque en realidad no lo hace

Solo como referencia, el problema con la coma al final, PRIMARY KEY (id),
, es un problema de SQL, no de dbDelta ni de WordPress. Por eso no hay documentación al respecto.

Ten en cuenta que al crear múltiples consultas con dbDelta()
, puedes pasar tus sentencias SQL como un array a dbDelta
en lugar de llamar a dbDelta
individualmente para cada consulta.

Puedes probar esta función:
$table_name = "ratings";
$table_columns = "id INT(6) UNSIGNED AUTO_INCREMENT,
rate tinyint(1) NOT NULL,
ticket_id bigint(20) NOT NULL,
response_id bigint(20) NOT NULL,
created_at TIMESTAMP";
$table_keys = "PRIMARY KEY (id),
KEY ratings_rate (rate),
UNIQUE KEY ratings_response_id (response_id)";
create_table($table_name, $table_columns, $table_keys);

Además de todos esos puntos importantes, debes activar el hook de activación.
Aunque hayas desarrollado tu plugin y escrito el código correctamente, aún necesitas reactivar tu plugin para activar el hook, de modo que tu tabla se creará cuando el plugin esté activado.

Las palabras clave de SQL, como CREATE TABLE y UPDATE, deben ir en mayúsculas. así que cambia la línea de create table a:
"CREATE TABLE " . $packagetable . "(
y
id mediumint(9) NOT NULL AUTO_INCREMENT,
a:
id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,
o esto:
name text NOT NULL,
a:
name TEXT NOT NULL,
y así sucesivamente

"Las palabras clave de SQL, como [...], deben estar en mayúsculas". Lo siento, pero no, esto no es cierto.

para usar la función dbDelta, debemos usar mayúsculas. Por favor, revisa esta página: https://codex.wordpress.org/Creating_Tables_with_Plugins

Lo siento, pero no puedo leer eso en ninguna parte del código fuente. ¿Me he perdido algo? ¿Quizás quieras añadir un mini-plugin de ejemplo a tu respuesta que muestre que falla (y que alguien pueda tomar y probar) con la sintaxis en minúsculas?

en este enlace: enlace, el primer párrafo de Crear o Actualizar la Tabla menciona este problema.

Esto solo es cierto para CREATE TABLE
, CREATE DATABASE
, INSERT INTO
y UPDATE
. Todo lo demás o no se usa en una comparación que distinga mayúsculas y minúsculas o se convierte a minúsculas. Tus sugerencias no tienen efecto.
