dbDelta não criando tabelas

15

Eu passei por muitos tópicos, página de codex e tentei mexer com muitas coisas, mas meu código não parece estar criando as tabelas. E não sou capaz de descobrir onde estou errado. Eu verifiquei booking_db_version no banco de dados, ele é atualizado quando eu atualizá-lo no arquivo.

Aqui está o 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 ) {
        /* Create table for packages */
        $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);

        /* Create table for hotels */
        $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);

        /* Create table for 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);

        /* Create table for addon groups */
        $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');
mehulved
fonte

Respostas:

18

Do WordPress-codex sobre dbDelta :

A função dbDelta examina a estrutura atual da tabela, a compara com a estrutura desejada e adiciona ou modifica a tabela conforme necessário, para que seja muito útil para atualizações (consulte wp-admin / upgrade-schema.php para obter mais exemplos de como usar o dbDelta). Observe que a função dbDelta é bastante exigente, no entanto. Por exemplo:

  • Você deve colocar cada campo em sua própria linha na sua instrução SQL.
  • Você deve ter dois espaços entre as palavras PRIMARY KEY e a definição da sua chave primária.
  • Você deve usar a palavra-chave KEY em vez de seu sinônimo INDEX e incluir pelo menos uma KEY.
  • Você não deve usar apóstrofos ou reticulares ao redor dos nomes dos campos.

Com essas advertências, aqui estão as próximas linhas em nossa função, que realmente criarão ou atualizarão a tabela. Você precisará substituir sua própria estrutura de tabela na variável $ sql.

Eu mudei seu sql: "create table $packagetable (

Para isso: "CREATE TABLE " . $packagetable . " (

Aqui está uma cópia de trabalho do seu 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 ) {
        // Create table for packages 
        $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);

        // Create table for hotels 
        $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);

        // Create table for 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)
        ) ". $charset_collate .";";
        dbDelta($sql);

        // Create table for addon groups 
        $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');
Pontus Abrahamsson
fonte
1
Isso funcionou. Eu li que o dbDelta é meticuloso, mas não percebi que não usar letras maiúsculas CREATE TABLEfará com que ele falhe.
mehulved 27/12/12
2
Embora o Wordpress não diga isso em sua página de codex, você não pode ter uma vírgula na última linha. Exemplo: PRIMARY KEY (id),. dbDelta realmente diz que ele cria a mesa, embora isso não acontece
JoeMoe1984
1
Apenas para referência, o problema com a vírgula à direita PRIMARY KEY (id),é um problema de SQL, não dbDelta nem um problema de WP. Portanto, não há documentação.
Jeremy
Observe que, ao criar várias consultas, dbDelta()você pode passar seus SQLs como uma matriz para, em dbDeltavez de chamar dbDeltaindividualmente para cada consulta.
toni_lehtimaki
1

Você pode tentar esta função :

$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);
mirza
fonte
0

Usar 'CREATE TABLE' em vez de 'create table' resolveu o problema para mim.

Kallol
fonte
0

Além de todos esses pontos importantes, você deve ativar o gancho de ativação.

Enquanto você desenvolveu seu plug-in e escreveu o código correto, ainda precisa reativar seu plug - in para acionar o gancho, para que sua tabela seja criada quando o plug-in for ativado.

Adi Prasetyo
fonte
-2

Palavras-chave SQL, como CREATE TABLE e UPDATE, devem estar em maiúsculas. então mude a linha da tabela de criação para:

"CREATE TABLE " . $packagetable . "( 

e

id mediumint(9) NOT NULL AUTO_INCREMENT,

para:

id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,

ou isto:

name text NOT NULL, 

para:

name TEXT NOT NULL, 

e assim por diante

shirin niki
fonte
"Palavras-chave SQL, como [...], devem estar em maiúsculas" . Desculpe, mas não, isso não é verdade.
kaiser
para usar a função dbDelta, devemos usar maiúsculas. por favor, visite esta página: codex.wordpress.org/Creating_Tables_with_Plugins
shirin Niki
Desculpe, mas eu posso ler isso em nenhum lugar na fonte . Perdi algo? Talvez você queira adicionar um exemplo de mini-plug-in à sua resposta que mostre que ele falha (que alguém pode fazer e testar) com sintaxe mais baixa?
Kaiser
neste link: link , o primeiro parágrafo de Criando ou Atualizando a Tabela menciona esse problema.
shirin Niki
Isso só é verdade para CREATE TABLE, CREATE DATABASE, INSERT INTOe UPDATE. Todo o resto não é usado em uma comparação com distinção entre maiúsculas e minúsculas ou convertido em minúsculas . Suas sugestões não têm efeito.
fuxia