Мой пользовательский плагин не создал таблицы db в базе данных

Я создал плагин, который создаст таблицу в базе данных при активации плагина.

Когда я включил плагин и проверил базу данных, не было новой таблицы, которую я хочу создать. Вот мой код файла плагина.

<?php /* Plugin Name: wp_course_management Description: WordPress plugin for course management for an education site. Version: 1.0 Author: Ahmad Nawaz Author URI: http://nawaz-ahmad.blogspot.com */ ?> <?php global $jal_db_version; $jal_db_version = "1.0"; function jal_install() { global $wpdb; global $jal_db_version; $table_name = $wpdb->prefix . "classes"; $sql = $wpdb->prepare( "CREATE TABLE %s ( id mediumint(9) NOT NULL AUTO_INCREMENT, time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, name tinytext NOT NULL, text text NOT NULL, url VARCHAR(55) DEFAULT '' NOT NULL, UNIQUE KEY id (id) );", $table_name ); require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql); add_option("jal_db_version", $jal_db_version); } function jal_install_data() { global $wpdb; $welcome_name = "Mr. WordPress"; $welcome_text = "Congratulations, you just completed the installation!"; $rows_affected = $wpdb->insert( $table_name, array( 'time' => current_time('mysql'), 'name' => $welcome_name, 'text' => $welcome_text ) ); } register_activation_hook(__FILE__,'jal_install'); register_activation_hook(__FILE__,'jal_install_data'); ?> 

В чем проблема в моем коде. Пожалуйста помоги.

Поздний ответ, но это может помочь другим понять, почему $ wpdb-> prepare не следует использовать с операторами SQL CREATE .

Ответ заключается в том, что $ wpdb-> prepare окружает строки (% s) с одиночными кавычками. Оператор CREATE, созданный из вышеперечисленного $ wpdb-> prepare, недействителен SQL:

 CREATE TABLE 'wp_classes' ( id mediumint(9) NOT NULL AUTO_INCREMENT, time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, name tinytext NOT NULL, text text NOT NULL, url VARCHAR(55) DEFAULT '' NOT NULL, UNIQUE KEY id (id) ); 

вместо

 CREATE TABLE wp_classes ( id mediumint... 

Вместо этого кода

 $sql = $wpdb->prepare( "CREATE TABLE %s ( id mediumint(9) NOT NULL AUTO_INCREMENT, time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, name tinytext NOT NULL, text text NOT NULL, url VARCHAR(55) DEFAULT '' NOT NULL, UNIQUE KEY id (id) );", $table_name ); 

Я использовал это.

 $sql ="CREATE TABLE ".$table_name." ( id mediumint(9) NOT NULL AUTO_INCREMENT, time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, name tinytext NOT NULL, text text NOT NULL, url VARCHAR(55) DEFAULT '' NOT NULL, UNIQUE KEY id (id) );"; 

и это решило мою проблему.

 <?php /* Plugin Name: wp_course_management Description: WordPress plugin for course management for an education site. Version: 1.0 Author: Ahmad Nawaz Author URI: http://nawaz-ahmad.blogspot.com */ ?> <?php global $jal_db_version; $jal_db_version = "1.0"; function jal_install() { global $wpdb; global $jal_db_version; $table_name = $wpdb->prefix . "classes"; $sql = "CREATE TABLE IF NOT EXISTS $table_name ( id mediumint(9) NOT NULL AUTO_INCREMENT, time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, name tinytext NOT NULL, text text NOT NULL, url VARCHAR(55) DEFAULT '' NOT NULL, UNIQUE KEY id (id) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;"; $wpdb->query($sql); } function jal_install_data() { global $wpdb; $table_name = $wpdb->prefix . "classes"; $welcome_name = "Mr. WordPress"; $welcome_text = "Congratulations, you just completed the installation!"; $rows_affected = $wpdb->insert( $table_name, array( 'time' => current_time('mysql'), 'name' => $welcome_name, 'text' => $welcome_text ) ); } register_activation_hook(__FILE__,'jal_install'); register_activation_hook(__FILE__,'jal_install_data'); ?>