2011-05-29 78 views
1

这是我的完整的WordPress插件文件:WP自定义插件:创建表并插入一次数据。

<?php 
function wp_create_table_install() 
{ 
    global $wpdb; 

    $table_name = $wpdb->prefix.'createtable'; 
    $sql = 'CREATE TABLE '.$table_name.'(
     id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
     name VARCHAR(75) 
    );'; 

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

function wp_create_table_insert_data() 
{ 
    global $wpdb; 

    $table_name = $wpdb->prefix.'createtable'; 
    $id = 1; 
    $name = 'WP Create Table!'; 

    $wpdb->insert($table_name, array('id' => $id, 'name' => $name)); 
} 

register_activation_hook(__FILE__, 'wp_create_table_install'); 
register_activation_hook(__FILE__, 'wp_create_table_insert_data'); 
?> 

当我激活插件,它总是试图创建一个表并插入数据。我怎么能这样做,只是在第一次插件激活?

谢谢。

回答

0

在运行CREATE TABLE之前,您可以查询information_schema.tables以检查表是否已存在。

+0

好的,这解决了问题,以及插入查询呢?谢谢。 – thom 2011-05-29 17:16:27

+0

很明显,如果你不想插入表,如果表已经存在,那么你就不会在Demian写的检查之后做。 – vlood 2011-06-02 08:22:55

1

更快的方法是在您的CREATE语句中添加[IF NOT EXISTS],以便在您的表已经存在时不会收到错误。

0

不幸的是,没有办法在“安装”上运行某些东西 - 令人惊讶的是,与激活相比,WordPress不提供任何安装钩子!

人们应对这种情况的方式是设置和测试一个选项 - 如果该选项未设置,则创建表,如果设置了,则不执行任何操作或执行数据库升级。选项被读入并缓存,所以这样做没有性能损失。

$opt = get_option(MYPLUGIN_OPTIONS); 

$opt['dbversion'] = 100; 
... 
update_option(MYPLUGIN_OPTIONS, $opt); 
相关问题