Creare una tabella in un plugin personalizzato durante l'attivazione?

17 mar 2016, 10:55:13
Visualizzazioni: 49.6K
Voti: 9

Sto cercando di creare un plugin personalizzato dove voglio creare una tabella quando il plugin viene attivato. Ho provato il seguente codice ma non sta creando la tabella nel database

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
Commenti

Hai un tutorial molto dettagliato nel Codex: https://codex.wordpress.org/Creating_Tables_with_Plugins

RRikesh RRikesh
17 mar 2016 11:13:53

Ho provato il tuo codice su un'installazione pulita, funziona.

RRikesh RRikesh
17 mar 2016 11:19:22

ho già installato il plugin e aggiunto questo codice

Arun Kumaresh Arun Kumaresh
17 mar 2016 11:23:43
Tutte le risposte alla domanda 3
2
18

Devi includere il file wpadmin/upgrade-functions.php per creare una tabella esempio:

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

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

    # Controlla se la tabella esiste già, se no, la crea

    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
Commenti

Per favore unisci i tuoi account e mantieniti su uno solo

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

In WordPress 2.1+ dovresti usare $wpdb->prefix invece della variabile globale $table_prefix.

Mateusz Mateusz
12 mar 2020 06:17:27
0

Questo codice funziona per me:

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

Poi 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` bigint(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
Commenti

Spiega in cosa aiuta l'utente il codice pubblicato, semplicemente postare il codice non è di grande aiuto.

bravokeyl bravokeyl
31 dic 2017 15:29:13

utilizzando l'istruzione sql: ... IF NOT EXISTS è la differenza in questa risposta.

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