如何通过激活插件创建表(如果不存在)? 注意:如果表存在,插件工作正常,但如果不存在,我需要创建表 我尝试了什么:
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');
也许我会使用错误的动作?
答案 0 :(得分: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' );
为了进一步阅读,可在食典委中找到Creating Tables with Plugins的精彩指南。
答案 1 :(得分: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');