dbDelta non crea le tabelle
Ho esaminato molti thread, la pagina del codex e ho provato a modificare diverse cose, ma il mio codice sembra non creare le tabelle. Non riesco a capire dove sto sbagliando. Ho controllato booking_db_version nel database e viene aggiornata quando la modifico nel file.
Ecco il codice
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 ) {
/* Crea tabella per i pacchetti */
$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);
/* Crea tabella per gli hotel */
$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);
/* Crea tabella per gli addon */
$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);
/* Crea tabella per i gruppi di addon */
$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');

Dal WordPress-codex riguardo dbDelta:
La funzione dbDelta esamina la struttura corrente della tabella, la confronta con la struttura desiderata e aggiunge o modifica la tabella secondo necessità, quindi può essere molto utile per gli aggiornamenti (vedi wp-admin/upgrade-schema.php per ulteriori esempi su come usare dbDelta). Tuttavia, nota che la funzione dbDelta è piuttosto esigente. Ad esempio:
- Devi inserire ogni campo nella sua riga nell'istruzione SQL.
- Devi avere due spazi tra le parole PRIMARY KEY e la definizione della tua chiave primaria.
- Devi usare la parola chiave KEY invece del suo sinonimo INDEX e devi includere almeno una KEY.
- Non devi usare apici o backtick intorno ai nomi dei campi.
Con queste avvertenze, ecco le righe successive nella nostra funzione, che creeranno o aggiorneranno effettivamente la tabella. Dovrai sostituire la tua struttura di tabella nella variabile $sql.
Ho modificato il tuo sql: "create table $packagetable (
In questo: "CREATE TABLE " . $packagetable . " (
Ecco una copia funzionante del tuo codice:
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 ) {
// Crea tabella per i pacchetti
$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);
// Crea tabella per gli hotel
$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);
// Crea tabella per gli addon
$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);
// Crea tabella per i gruppi di addon
$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');

Ha funzionato. Ho letto che dbDelta è capriccioso ma non avevo capito che non capitalizzare CREATE TABLE
avrebbe causato un fallimento.

Anche se WordPress non lo menziona nella sua pagina del codex, non puoi avere una virgola finale nell'ultima riga. Esempio: PRIMARY KEY (id),
. dbDelta afferma effettivamente di creare la tabella anche se non lo fa

Solo per riferimento, il problema con la virgola finale, PRIMARY KEY (id),
è un problema SQL, non di dbDelta né di WordPress. Da qui l'assenza di documentazione.

Nota che quando crei più query con dbDelta()
puoi passare i tuoi SQL come un array a dbDelta
invece di chiamare dbDelta
individualmente per ogni query.

Puoi provare questa funzione:
$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);

Oltre a tutti questi importanti punti, dovresti attivare l'hook di attivazione.
Anche se hai sviluppato il tuo plugin e scritto il codice corretto, devi comunque riattivare il tuo plugin per attivare l'hook, in modo che la tua tabella venga creata quando il plugin viene attivato.

Le parole chiave SQL, come CREATE TABLE e UPDATE, devono essere in maiuscolo. quindi cambia la riga di creazione della tabella in:
"CREATE TABLE " . $packagetable . "(
e
id mediumint(9) NOT NULL AUTO_INCREMENT,
in:
id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,
o questo:
name text NOT NULL,
in:
name TEXT NOT NULL,
e così via

"Le parole chiave SQL, come […], devono essere in maiuscolo". Scusa, ma no, questo non è vero.

per utilizzare la funzione dbDelta, dovremmo usare il maiuscolo. per favore controlla questa pagina: https://codex.wordpress.org/Creating_Tables_with_Plugins

Scusa, ma non riesco a leggerlo da nessuna parte nel sorgente. Mi sono perso qualcosa? Forse vorresti aggiungere un mini-plugin di esempio alla tua risposta che dimostri che fallisce (che qualcuno può prendere e testare) con la sintassi in minuscolo?

in questo link: link , il primo paragrafo di "Creazione o Aggiornamento della Tabella" menziona questo problema.

Questo è vero solo per CREATE TABLE
, CREATE DATABASE
, INSERT INTO
, e UPDATE
. Tutto il resto o non viene utilizzato in un confronto case-sensitive o viene convertito in minuscolo. I tuoi suggerimenti non hanno alcun effetto.
