WordPress REGISTER_ACTIVATION_HOOK表创建不起作用

时间:2018-08-23 作者:Markus

我为我的wordpress插件创建了一个简单的类。主文件如下所示:

<?php
/*
 * Plugin Name: Codes
 * Description: Generates a coupon code after checkout
 * Version: 0.1.0
 * Author: XXX
 */

require_once(\'inc/DatabaseUtils.php\');

$codes = new Codes();

class Codes {

    private $databaseUtils;

    /**
     * Create a new instance 
     *
     * @param null
     * @return void
     */
    function __construct() {
        $this->regsiter_hooks();
        $this->databaseUtils = new DatabaseUtils();
    }

    /**
     * Called on plugin activation
     *
     * @param null
     * @return void
     */
    function activate() {
        $this->databaseUtils->setup_codes_table();
    }

    /**
     * Called on plugin deactivation
     *
     * @param null
     * @return void
     */
    function deactivate() {

    }

    /**
     * Register plugin hooks
     *
     * @param null
     * @return void
     */
    function regsiter_hooks() {
        register_activation_hook(__File__, array($this, \'activate\'));
        register_deactivation_hook(__File__, array($this, \'deactivate\'));
    }
}
在文件夹“inc”中,我有一个数据库utils。php文件。这是一个类,具有在激活插件后在wordpress数据库中创建表的功能。内容如下:

<?php

class DatabaseUtils {

    function setup_codes_table() {
        global $wpdb;
        global $charset_collate;
        $table_name = $wpdb->prefix . \'pin\';
         $sql = "CREATE TABLE IF NOT EXISTS $table_name (
          `id` bigint(20) NOT NULL AUTO_INCREMENT,
          `pincode` bignit(128) DEFAULT NOT NULL,
           PRIMARY KEY (`id`)   
        )$charset_collate;";
         require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
         dbDelta( $sql );
    }

}
如果您看到了,我在主文件的激活方法中调用了该函数。但当我激活插件时,我的数据库中没有新表。

有人知道为什么吗?是否有方法调试register_activation_hook?

谢谢你的帮助!

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

用于在中创建表的SQLdbDelta() 有非常具体的要求。从…起the codex:

您必须在SQL语句中将每个字段放在自己的行上必须使用关键字key而不是其同义词索引,并且必须至少包含一个关键字IF NOT EXISTS 使用时也不需要dbDelta(), 其目的是仅在必要时根据SQL自动对数据库进行更改。

因此,您的SQL应该如下所示:

$sql = "CREATE TABLE $table_name (
    id bigint(20) NOT NULL AUTO_INCREMENT,
    pincode bigint(128) NOT NULL,
    PRIMARY KEY  (id)   
) $charset_collate;";
您的SQL缺少后面的2个空格PRIMARY KEY. 你还有一个拼写错误,上面写着bignit 相反,如果bigint 对于pincode, 和DEFAULT NOT NULL 不是有效的SQL,应该是NOT NULL.

我还删除了背景标记,并在前面添加了一个空格$charset_collate; 与法典中的风格保持一致,但我不确定它们是否会引起问题。

结束

相关推荐

cannot connect database

我是wordpress的新手。我计划从我自己的php代码连接wordpress数据库。但我在尝试连接数据库时遇到问题,每次连接都会得到错误结果。im使用此代码$user_name = \"myusername\"; $password = \"password\"; $database = \"mydatabasename\"; $host_name = \"localhost\"; $connect_db=mysqli_connect($host_name, $