Crear una tabla en un plugin personalizado al activarlo

17 mar 2016, 10:55:13
Vistas: 49.6K
Votos: 9

Estoy tratando de crear un plugin personalizado donde quiero crear una tabla cuando el plugin se activa. He probado el siguiente código pero no está creando la tabla en la base de datos

function create_plugin_database_table() {
 global $wpdb;
 $table_name = $wpdb->prefix . 'sandbox';
 $sql = "CREATE TABLE $table_name (
 id mediumint(9) unsigned NOT NULL AUTO_INCREMENT,
 title varchar(50) NOT NULL,
 structure longtext NOT NULL,
 author longtext NOT NULL,
 PRIMARY KEY  (id)
 );";

 require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
 dbDelta( $sql );
}

register_activation_hook( __FILE__, 'create_plugin_database_table' );
3
Comentarios

Tienes un tutorial muy detallado en el Codex: https://codex.wordpress.org/Creating_Tables_with_Plugins

RRikesh RRikesh
17 mar 2016 11:13:53

Probé tu código en una instalación limpia, funciona.

RRikesh RRikesh
17 mar 2016 11:19:22

ya instalé el plugin y agregué este código

Arun Kumaresh Arun Kumaresh
17 mar 2016 11:23:43
Todas las respuestas a la pregunta 3
2
18

Debes incluir el archivo wpadmin/upgrade-functions.php para crear una tabla. Ejemplo:

function create_plugin_database_table()
{
    global $table_prefix, $wpdb;

    $tblname = 'pin';
    $wp_track_table = $table_prefix . "$tblname ";

    // Verificar si la tabla ya existe, si no, crearla
    if($wpdb->get_var( "show tables like '$wp_track_table'" ) != $wp_track_table) 
    {
        $sql = "CREATE TABLE `". $wp_track_table . "` ( ";
        $sql .= "  `id`  int(11)   NOT NULL auto_increment, ";
        $sql .= "  `pincode`  int(128)   NOT NULL, ";
        $sql .= "  PRIMARY KEY `order_id` (`id`) "; 
        $sql .= ") ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; ";
        require_once( ABSPATH . '/wp-admin/includes/upgrade.php' );
        dbDelta($sql);
    }
}

register_activation_hook( __FILE__, 'create_plugin_database_table' );
17 mar 2016 12:10:15
Comentarios

Por favor, fusiona tus cuentas y quédate con una sola

Pieter Goosen Pieter Goosen
17 mar 2016 14:19:08

En WordPress 2.1+ necesitarías usar $wpdb->prefix en lugar de la variable global $table_prefix.

Mateusz Mateusz
12 mar 2020 06:17:27
0

Este código funciona para mí:

function installer(){
    include('installer.php');
}
register_activation_hook(__file__, 'installer');

Luego en installer.php:

global $wpdb;
$table_name = $wpdb->prefix . "my_products";
$my_products_db_version = '1.0.0';
$charset_collate = $wpdb->get_charset_collate();

if ( $wpdb->get_var("SHOW TABLES LIKE '{$table_name}'") != $table_name ) {

    $sql = "CREATE TABLE $table_name (
            ID mediumint(9) NOT NULL AUTO_INCREMENT,
            `product-model` text NOT NULL,
            `product-name` text NOT NULL,
            `product-description` int(9) NOT NULL,
            PRIMARY KEY  (ID)
    ) $charset_collate;";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
    add_option('my_db_version', $my_products_db_version);
}
15 mar 2018 00:20:47
2
function astro_plugin_table_install() {
    global $wpdb;
    global $charset_collate;
    $table_name = $wpdb->prefix . 'pin';
     $sql = "CREATE TABLE IF NOT EXISTS $table_name (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `pincode` bignit(128) DEFAULT NOT NULL,
       PRIMARY KEY (`id`)
    )$charset_collate;";
     require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
     dbDelta( $sql );
}
register_activation_hook(__FILE__,'astro_plugin_table_install');
28 dic 2017 16:02:39
Comentarios

Explica cómo el código publicado ayuda al usuario, solo publicar el código no ayuda mucho.

bravokeyl bravokeyl
31 dic 2017 15:29:13

usando la sentencia sql: ... IF NOT EXISTS es la diferencia de esta respuesta.

hamid araghi hamid araghi
24 sept 2021 12:44:47