dbDelta nu creează tabele
Am parcurs multe discuții, pagina codex și am încercat să modific diverse lucruri, dar codul meu nu pare să creeze tabelele. Nu reușesc să înțeleg unde greșesc. Am verificat booking_db_version în baza de date, se actualizează când o modific în fișier.
Iată codul
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 ) {
/* Creează tabelul pentru pachete */
$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);
/* Creează tabelul pentru hoteluri */
$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);
/* Creează tabelul pentru addon-uri */
$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);
/* Creează tabelul pentru grupurile de addon-uri */
$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');

Din WordPress-codex despre dbDelta:
Funcția dbDelta analizează structura curentă a tabelului, o compară cu structura dorită și adaugă sau modifică tabelul după caz, fiind foarte utilă pentru actualizări (vezi wp-admin/upgrade-schema.php pentru mai multe exemple de utilizare a dbDelta). Totuși, funcția dbDelta este destul de pretențioasă. De exemplu:
- Trebuie să pui fiecare câmp pe linia sa în instrucțiunea SQL.
- Trebuie să ai două spații între cuvintele PRIMARY KEY și definiția cheii primare.
- Trebuie să folosești cuvântul cheie KEY și nu sinonimul INDEX și trebuie să incluzi cel puțin un KEY.
- Nu trebuie să folosești ghilimele simple sau backtick-uri în jurul numelor de câmpuri.
Ținând cont de aceste precauții, iată următoarele linii din funcția noastră, care vor crea sau actualiza tabelul. Va trebui să înlocuiești structura tabelului tău în variabila $sql.
Am schimbat sql-ul tău: "create table $packagetable (
În asta: "CREATE TABLE " . $packagetable . " (
Iată o copie funcțională a codului tău:
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 ) {
// Crează tabelul pentru pachete
$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);
// Crează tabelul pentru hoteluri
$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);
// Crează tabelul pentru suplimente
$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);
// Crează tabelul pentru grupuri de suplimente
$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');

A funcționat. Am citit că dbDelta este capricios, dar nu mi-am dat seama că scrierea necapitalizată a CREATE TABLE
va cauza eșec.

Deși WordPress nu menționează asta pe pagina lor din codex, nu poți avea o virgulă la finalul ultimei linii. Exemplu: PRIMARY KEY (id),
. dbDelta de fapt afirmă că creează tabelul chiar dacă nu o face

Doar pentru referință, problema cu virgula la sfârșit, PRIMARY KEY (id),
este o problemă SQL, nu dbDelta și nici o problemă WP. De aceea nu există documentație.

Rețineți că atunci când creați mai multe interogări cu dbDelta()
, puteți transmite SQL-urile ca un array către dbDelta
în loc să apelați dbDelta
individual pentru fiecare interogare.

Puteți încerca această funcție:
$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);

Pe lângă toate aceste puncte importante, trebuie să declanșezi cârligul (hook) de activare.
Chiar dacă ai dezvoltat plugin-ul tău și ai scris cod corect, tot trebuie să reactivezi plugin-ul pentru a declanșa cârligul, astfel încât tabela ta să fie creată atunci când plugin-ul este activat.

Cuvintele cheie SQL, cum ar fi CREATE TABLE și UPDATE, trebuie să fie scrise cu majuscule. deci schimbă linia de creare a tabelului în:
"CREATE TABLE " . $packagetable . "(
și
id mediumint(9) NOT NULL AUTO_INCREMENT,
în:
id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,
sau acest lucru:
name text NOT NULL,
în:
name TEXT NOT NULL,
și așa mai departe

"Cuvintele cheie SQL, cum ar fi […], trebuie să fie scrise cu majuscule". Îmi pare rău, dar nu, acest lucru nu este adevărat.

pentru utilizarea funcției dbDelta, ar trebui să folosim majuscule. te rugăm să verifici această pagină: https://codex.wordpress.org/Creating_Tables_with_Plugins

Îmi pare rău, dar nu pot găsi această informație nicăieri în sursă. Am omis ceva? Poate doriți să adăugați în răspunsul dumneavoastră un exemplu de mini-plugin care arată că nu funcționează (și pe care cineva îl poate testa) cu sintaxa scrisă cu litere mici?

în acest link: link, primul paragraf din secțiunea Creating or Updating the Table menționează această problemă.

Acest lucru este valabil doar pentru CREATE TABLE
, CREATE DATABASE
, INSERT INTO
și UPDATE
. Orice altceva fie nu este utilizat într-o comparație case-sensitive, fie este convertit la lowercase. Sugestiile tale nu au niciun efect.
