web-dev-qa-db-ja.com

DbDeltaを使用してプラグインのアクティブ化時に新しいデータベーステーブルを作成できません

私のプラグインがdbDelta()を使用してアクティブ化されたときに新しいデータベーステーブルを作成しようとしていますが、新しいテーブルが作成されていないようです。私はWordPressの開発に慣れていないので、どこに問題があるのか​​私に知らせてください。

<?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');
}
?>

これは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 );
}
?>
1
Himanshu

これはプラグインを有効にしたときにテーブルを作成するinstaller.phpの更新版です。

新しいテーブルの作成に進む前に、カスタムテーブルが存在するかどうかを確認するためのチェックが追加されました。

バージョン番号も追加されています。それはオプションテーブルに格納されています。更新中にデータベースを変更する必要がある場合、これは将来的に役立ちます。

<?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 );
    }

元のコードにはいくつか問題がありました。

if(!isset($table_name)){

$table_nameは既に設定されているので、これは常にtrueを返していました。

この行の最後にはカンマがありません。

id mediumint(9) NOT NULL AUTO_INCREMENT

テーブル名の中の特定の文字はテーブル名をバッククォートで囲む必要があります、 これはハイフンを含みます

student-id mediumint(9) NOT NULL,
student-name text NOT NULL,
marks-obtained int(9) NOT NULL,

デバッグを容易にするために、このような問題が発生したときはPHPエラーログを確認することをお勧めします。

1
Dave Romsey

何かエラーがありますか?それはあなたが持っている単なるSQLの問題であるように感じます。 SQLクエリを手動でテストし、それが機能するかどうかを確認しましたか?

私は以下を使用してそれが動作し、私はまた将来の更新のためにテーブルのバージョンを設定してチェックします。

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'));
}

また、プラグインの起動時にdbのバージョンを確認し、必要に応じて更新します。

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);
   }
}
1
jamietelin