2014-09-22 109 views
0

如何通過激活插件創建表格(如果不存在)? 注:插件工作正常,如果表存在,但我需要創建表,如果不存在 我做的嘗試:Wordpress通過插件創建表格

function alicelf_bookmark() { 
    global $wpdb; 
    $table_name = $wpdb->prefix . "alice_user_bookmarks"; 
    $charset_collate = ''; 

    if (! empty($wpdb->charset)) 
     $charset_collate = "DEFAULT CHARACTER SET {$wpdb->charset}"; 

    if (! empty($wpdb->collate)) 
     $charset_collate .= " COLLATE {$wpdb->collate}"; 

    $sql = "CREATE TABLE IF NOT EXISTS $table_name (
     id INT NOT NULL AUTO_INCREMENT, 
     user_id INT, 
     name VARCHAR(255), 
     shipping_address VARCHAR(255), 
     user_notes TEXT, 
    ) $charset_collate;"; 

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); 
    dbDelta($sql); 
    //some other plugin stuff.. 
} 
add_action('wp_footer', 'alicelf_bookmark'); 

也許我錯用行動?

回答

3

。你知道它會在第一次安裝時改變(從無到第一版)。稍後它可以在用戶更新插件時更改。

這樣做的好方法是在選項表中存儲數據庫版本號,並檢查它是否已更新。如果選項表中的版本號與插件中的版本號不匹配,則需要安裝。

這使我們知道你的插件應該如何處理表結構中的變化。一個簡單的方法可以包括大量的if-tests和自定義的ALTER TABLE查詢(當從1.0升級到3.0時,需要從1.0升級到3.0時,不需要同樣的查詢)。這可能很難以非常快的速度工作。

將ALTER TABLE語句留給WordPress自己的dbDelta函數通常會更好,它會生成您需要的語句。

<?php 
$prefix_table_name = $wpdb->prefix . 'prefix_table_name'; 
$prefix_db_version = '1.0'; 
$prefix_db_installed_version = get_option('prefix_db_version'); 

/** 
* Create or update tables if needed. 
*/ 
function prefix_install_db() { 
    global $wpdb; 

    if ($prefix_db_installed_version == $prefix_db_version) 
     return; // Database is current version, no need to do anything 

    // We'll need dbDelta() 
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); 

    $sql = "CREATE TABLE " . $prefix_table_name . " (
     ID bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, 
     email varchar(320) NOT NULL, 
     PRIMARY KEY ID(ID) 
    );"; 
    dbDelta($sql); 

    update_option('prefix_db_version' , $prefix_db_version); 
} 
add_action('plugins_loaded', 'prefix_install_db'); 

如需進一步閱讀,可以在Codex中找到有關Creating Tables with Plugins的重要指導。

+0

嗯,我不知道插件版本。 謝謝你,我會更新我的代碼。 – WebArtisan 2014-09-22 18:25:57

0

找到解決方法:只需要寄存器激活,當你的插件需要它自己的表,你將要考慮到這個表可以隨時間變化而不是wp_head改變wp_footer

add_action('wp_head', 'alicelf_bookmark'); 

//also move away your activation and sql create table to another func for escape some errors 
//when you enable plugin and table exists 
function activator_bookmark(){ 
//do code 
} 

register_activation_hook(FILE,'activator_bookmark');