J'essaie de créer une nouvelle table de base de données lorsque mon plug-in est activé à l'aide de dbDelta (). Cependant, aucune nouvelle table ne semble être en train de créer. Depuis que je suis nouveau dans le développement WordPress, laissez-moi savoir où je me trompe.
<?php
/*
Plugin Name: Xenon-Result
Plugin URI: https://developer.wordpress.org/plugins/the-basics/
Description: Basic WordPress Plugin Header Comment
Version: 1.0
Author: Himanshu Gupta
Author URI: https://developer.wordpress.org/
License: GPL2
License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/
function installer(){
include('installer.php');
}
register_activation_hook( __file__, 'installer' ); //executes installer php when installing plugin to create new database
add_action('admin_menu','result_menu'); //wordpress admin menu creation
function result_menu()
{
add_menu_page('Result','Result','administrator','xenon-result');
add_submenu_page( 'xenon-result', 'Manage Marks', ' Manage Marks', 'administrator', 'Manage-Xenon-Marks', 'Xenon_Marks' );
}
function Xenon_Marks()
{
include('new/result-add-marks.php');
}
?>
Ceci est le fichier installer.php:
<?php
global $wpdb;
$table_name = $wpdb->prefix . "xenonresult";
$charset_collate = $wpdb->get_charset_collate();
if(!isset($table_name)){
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT
student-id mediumint(9) NOT NULL,
student-name text NOT NULL,
marks-obtained int(9) NOT NULL,
result text NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
}
?>
Voici une version mise à jour de installer.php
qui crée la table lors de l'activation du plugin.
Une vérification a été ajoutée pour voir si la table personnalisée existe avant de procéder à la création de la nouvelle table.
Un numéro de version a également été ajouté. Il est stocké dans la table d'options. Cela aidera dans l’avenir si la base de données doit être modifiée lors d’une mise à jour.
<?php
global $wpdb;
$table_name = $wpdb->prefix . "xenonresult";
$xenonresult_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,
`student-id` mediumint(9) NOT NULL,
`student-name` text NOT NULL,
`marks-obtained` int(9) NOT NULL,
result text NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
add_option( 'xenonresult_db_version', $xenonresult_db_version );
}
Il y avait quelques problèmes avec le code original:
if(!isset($table_name)){
Cela retournait toujours true
car $table_name
était déjà défini.
Il manque une virgule à cette ligne à la fin:
id mediumint(9) NOT NULL AUTO_INCREMENT
Certains caractères dans les noms de table exigent que le nom de la table soit placé entre guillemets, ceci inclut les traits d'union :
student-id mediumint(9) NOT NULL,
student-name text NOT NULL,
marks-obtained int(9) NOT NULL,
Pour faciliter le débogage, il est conseillé de consulter le journal des erreurs PHP lorsque vous rencontrez de tels problèmes.
Avez-vous des erreurs? On a l'impression que c'est juste un problème SQL que vous avez. Avez-vous testé votre requête SQL manuellement et voir si cela fonctionne?
J'utilise ce qui suit et cela fonctionne, j'ai également définir et vérifier la version du tableau pour les mises à jour futures:
public function createDb()
{
global $wpdb;
$charsetCollate = $wpdb->get_charset_collate();
require_once(constant('ABSPATH') . 'wp-admin/includes/upgrade.php');
$tableName = $wpdb->prefix . 'mypluginname';
$sql = "CREATE TABLE $tableName (
id bigint(20) NOT NULL AUTO_INCREMENT,
Word varchar(255) DEFAULT '' NOT NULL,
length int(9) DEFAULT 0 NOT NULL,
UNIQUE KEY id (id)
) $charsetCollate;";
dbDelta($sql);
update_option('myplugin_db_version', constant('MYPLUGIN_DB_VERSION'));
}
De plus, au démarrage de mon plugin, je vérifie la version de la base de données et la mets à jour si nécessaire.
public function __construct()
{
$installedDbVersion = get_option("myplugin_db_version");
$pluginDbVersion = constant('MYPLUGIN_DB_VERSION');
if ((float)$installedDbVersion !== constant('MYPLUGIN_DB_VERSION') &&
$installedDbVersion !== false
) {
$this->createDb();
$message = "Updated plugin tables from version ";
$message .= "{$installedDbVersion} to {$pluginDbVersion}";
trigger_error($message, E_USER_NOTICE);
}
}