Wordpress 如何在插件激活时创建表格

O.T*_*.T. 0 php wordpress

这是我的代码,我将创建查询写入函数并在register_activation_hook()函数中调用它,但它不起作用。

function test_contact_form() {      
        global $wpdb; 
        $connection = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
        mysql_select_db(DB_NAME);        
        if (!$connection){ die('Error: ' . mysql_error());}

    require_once( ABSPATH . '/wp-admin/includes/upgrade.php' );

    $db_table_name = $wpdb->prefix . 'contactus_detail';  // table name
    if( $wpdb->get_var( "SHOW TABLES LIKE '$db_table_name'" ) != $db_table_name ) {
        if ( ! empty( $wpdb->charset ) )
            $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
        if ( ! empty( $wpdb->collate ) )
            $charset_collate .= " COLLATE $wpdb->collate"; 
        $sql = "CREATE TABLE " . $db_table_name . " (
            id int(11) NOT NULL auto_increment,
                        ip varchar(15) NOT NULL,
                        name varchar(60) NOT NULL,
                        emailid varchar(200) NOT NULL,
                        mobileno varchar(10) NOT NULL,
                        message varchar(1000) NOT NULL,
                        PRIMARY KEY (id) 
        ) $charset_collate;";


dbDelta( $sql ); // create query 
        }  
    }
    register_activation_hook(__FILE__, 'test_contact_form');
Run Code Online (Sandbox Code Playgroud)

Guf*_*san 5

我修改了@SelvaKumar 的答案。就像一旦插件被激活一样,一个$db_table_name表将被创建到 WordPress 中。如果有人停用插件然后激活插件,这将尝试$db_table_name再次创建表并引发错误。

在这段代码中,我们需要检查一个表是否已经存在,那么这个脚本不应该更多。

function test_contact_form()
{      
  global $wpdb; 
  $db_table_name = $wpdb->prefix . 'contactus_detail';  // table name
  $charset_collate = $wpdb->get_charset_collate();

 //Check to see if the table exists already, if not, then create it
if($wpdb->get_var( "show tables like '$db_table_name'" ) != $db_table_name ) 
 {
       $sql = "CREATE TABLE $db_table_name (
                id int(11) NOT NULL auto_increment,
                ip varchar(15) NOT NULL,
                name varchar(60) NOT NULL,
                emailid varchar(200) NOT NULL,
                mobileno varchar(10) NOT NULL,
                message varchar(1000) NOT NULL,
                UNIQUE KEY id (id)
        ) $charset_collate;";

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

register_activation_hook( __FILE__, 'test_contact_form' );
Run Code Online (Sandbox Code Playgroud)