无法通过php oop方法在激活WordPress插件时创建自定义数据库表

时间:2015-12-30 作者:Kazi Emam Mahedi Sohel

我正在尝试使用php OOP概念创建一些关于wordpress插件激活的自定义数据库表。但插件激活后不会创建数据库。这是我的密码

class wpe_Main {
    public function __construct() {
        register_activation_hook( __FILE__, array($this,\'create_wpe_enquiry_table\'));
    }

    public function create_wpe_enquiry_table(){
        global $wpdb;
        $sql_enquiry = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}wpe_enquiry (
        `id` int(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        `userid` int(11) NOT NULL,
        `enquiry_type_id` varchar(3) NOT NULL,
        `contact_email` varchar(200) NOT NULL,
        `contact_number` varchar(50) NOT NULL,
        `contact_messenger` varchar(200) NOT NULL,
        `query_title` varchar(200) NOT NULL,
        `query_content` text NOT NULL,
        `attachment1` varchar(200) NOT NULL,
        `attachment2` varchar(200) NOT NULL,
        `attachment3` varchar(200) NOT NULL,
        `user_ip` varchar(50) NOT NULL,
        `query_cdate`  DATETIME DEFAULT CURRENT_TIMESTAMP,
        `query_udate` DATETIME ON UPDATE CURRENT_TIMESTAMP,
        `status` varchar(2) NOT NULL
        ) ENGINE=MyISAM DEFAULT CHARSET=utf8";

        $sql_enquiry_reply = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}wpe_query_reply (
        `id` int(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        `quiry_id` int(11) NOT NULL,
        `reply_content` text NOT NULL,
        `user_ip` varchar(50) NOT NULL,
        `reply_cdate`  DATETIME DEFAULT CURRENT_TIMESTAMP,
        `reply_udate` DATETIME ON UPDATE CURRENT_TIMESTAMP,
        `status` varchar(2) NOT NULL
        ) ENGINE=MyISAM DEFAULT CHARSET=utf8";

        $sql_enquiry_type = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}wpe_query_part (
        `id` int(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        `part_value` int(11) NOT NULL,
        `part_name` varchar(200) NOT NULL,
        `user_ip` varchar(50) NOT NULL,
        `reply_cdate`  DATETIME DEFAULT CURRENT_TIMESTAMP
        ) ENGINE=MyISAM DEFAULT CHARSET=utf8";

    require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
    dbDelta( $sql_enquiry );
    dbDelta( $sql_enquiry_reply );
    dbDelta( $sql_enquiry_type );
}
}
$wpuf = new wpe_Main();

2 个回复
最合适的回答,由SO网友:WPTC-Troop 整理而成

是你的班级wpe_Main file是插件的邮件文件吗?

因为__FILE__ 应返回主插件文件路径。所以如果你的wpe_Main 类位于子目录中,则寄存器激活将不起作用。

如果你愿意,你可以像下面这样尝试避免__FILE__ 混乱

插件路径:wp-content/plugin/sampleplugin/sample.php

那么钩子应该如下所示

register_activation_hook( \'sampleplugin/sample.php\', 
array($this,\'create_wpe_enquiry_table\'));
Updated 评论之后

如果你的类在主插件文件中,那么for sure 该函数正在插件激活时执行。您没有创建的表可能是SQL错误或键入错误。所以请检查负责创建表的函数。

对于激活功能的简单测试,请尝试以下代码

update_option(\'activation_test\',\'its working\');
然后检查选项,您可以看到它应该被更新,或者您甚至可以发送邮件进行测试。

测试激活功能是您的优势。最后register_activation_hook will work on OOPS without any problem. 检查Reference

SO网友:birgire

你没有使用dbDelta() 这里,当您使用IF NOT EXISTS 条款

使用IF NOT EXISTS 当您使用IF NOT EXISTS 签入:

CREATE TABLE IF NOT EXISTS
那么dbDelta() 将进行以下匹配:

if ( preg_match( "|CREATE TABLE ([^ ]*)|", $qry, $matches ) ) {
    $cqueries[ trim( $matches[1], \'`\' ) ] = $qry;
在这里$matches 是:

Array
(
    [0] => CREATE TABLE IF
    [1] => IF
)
以及

trim( $matches[1], \'`\' )
给出表名IF.

然后,它将尝试查找包含以下内容的字段:

$tablefields = $wpdb->get_results("DESCRIBE {$table};");
DESCRIBE IF 这(希望)不会产生任何结果。因此dbDelta() 将只尝试运行原始创建查询,但跳过将来可能对表结构进行的任何更新。

没有IF NOT EXISTS 如果删除IF NOT EXISTS 部分,然后是第一个运行时,例如wp_wpe_query_part 表,将是

CREATE TABLE IF NOT EXISTS wp_wpe_query_part (
        `id` int(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        `part_value` int(11) NOT NULL,
        `part_name` varchar(200) NOT NULL,
        `user_ip` varchar(50) NOT NULL,
        `reply_cdate`  DATETIME DEFAULT CURRENT_TIMESTAMP
        ) ENGINE=MyISAM DEFAULT CHARSET=utf8
对于第二个运行时,当表已经存在时,我们将得到以下查询:

DESCRIBE wp_wpe_query_part;

SHOW INDEX FROM wp_wpe_query_part;

ALTER TABLE wp_wpe_query_partCHANGE COLUMN id `id` int(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY;

ALTER TABLE wp_wpe_query_partCHANGE COLUMN part_value `part_value` int(11) NOT NULL;

ALTER TABLE wp_wpe_query_partCHANGE COLUMN part_name `part_name` varchar(200) NOT NULL;

ALTER TABLE wp_wpe_query_partCHANGE COLUMN user_ip `user_ip` varchar(50) NOT NULL;

ALTER TABLE wp_wpe_query_partCHANGE COLUMN reply_cdate `reply_cdate`  DATETIME DEFAULT CURRENT_TIMESTAMP;
如果我们稍后对表结构进行一些更改,它将相应地修改当前表。

相关推荐

插件放置在/wp-content/plugins内的文件夹中时不保存值

我得到了WordPRess插件的以下代码,它在每个页面/后期编辑屏幕上添加了两个自定义输入。然后将这些值保存并输出到前端页面的标题中。如果代码位于内部,则可以正常工作。php文件并直接放入“wp内容/插件”。然而,如果我把它放在插件(如“wp-content/plugins/myplugin”)中自己的文件夹中,那么在通过编辑屏幕保存帖子/页面时,输入字段不会保存。此外,它不会向前端页面html标题部分输出任何内容。这似乎是一个被放弃的项目,所以我无法与原始开发人员一起制定解决方案。然而,代码中的某些内容