为什么我的数据库表在激活时没有创建?

时间:2018-03-13 作者:Maarten Heideman

我尝试构建一个带有自定义db表的插件。因此,我将通知包括在内。插件索引中的php。php文件。如果我死了;在公共函数init()(在notifications.php中)中,它会死亡,因此会加载它,但register\\u activation\\u hook不会在activate te plugin上触发,my\\u notifications\\u install函数不会执行。有什么问题吗?激活没有响应错误。

插件结构:

/插件/plugindir/index。php

// Notifications
include_once plugin_dir_path( __FILE__ ) . \'/notifications.php\';
$my_notifications = new my_notifications( __FILE__ );
/插件/plugindir/notifications。php

class my_notifications {

    public function __construct( ) {
        $this->init();
    }

    public function init() {
        global $my_notifications_db_version;
        $my_notifications_db_version = \'1.0\';
        register_activation_hook( __FILE__, array( $this, \'my_notifications_install\' ) );
    }

    private function my_notifications_install() {
        global $wpdb;
        global $my_notifications_db_version;

        $table_name = $wpdb->prefix . \'my_notifications\';

        $charset_collate = $wpdb->get_charset_collate();

        $sql = "CREATE TABLE $table_name (
            id mediumint(9) NOT NULL AUTO_INCREMENT,
            time datetime DEFAULT \'0000-00-00 00:00:00\' NOT NULL,
            user_id mediumint(9) NOT NULL,
            post_id mediumint(9) NOT NULL,
            attachment_id mediumint(9) NOT NULL,
            message text NOT NULL,
            PRIMARY KEY  (id)
        ) $charset_collate;";

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

        add_option( \'my_notifications_db_version\', $my_notifications_db_version );
    }
}

2 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

经验法则是永远不要做任何不是由动作或过滤器触发的事情。

在这种情况下,您尝试在wordpress完成“引导”之前注册一个钩子。这有时可能奏效,但完全不是一个健康的想法。至少使用“init”钩子(如果可以的话,最好使用“wp\\u-loaded”)来触发初始化,在此之前不要做任何事情,除非你有很好的理由。

至于激活挂钩,请非常小心地相信它会被触发,因为它不会在多站点安装时被触发,也不会在更新完成时被触发,因此您最好提前计划并自己检测何时需要DB初始化或更新。

SO网友:Sebastian Kurzynowski

register_activation_hook( __FILE__, array( $this, \'my_notifications_install\' ) );
这应该在主插件文件中。因为它使用FILE 创建挂钩的名称。因此,请更改引用或将这段和平的代码移动到主插件文件。

有关详细信息,请查看此链接register_activation_hook codex, 没有人使用$this作为对象的引用,我看到了&$这在一些插件中,例如wp discuzz。

还使用db_delta 具有plugin activation hook 不是个好主意,因为当你需要的时候update 你的table schema 在下一个版本之后,您需要手动重新启动插件,因为Wordpress 自版本3.9起更新时不会触发activation\\u挂钩,并且dbdelta 如果您经常在上使用表,则表的检查存在,并且当表已经存在时不执行任何操作activation hook.

结束

相关推荐

display menu as table layout

我要这个的菜单site 看起来像这个菜单site. 很明显,他们使用的是显示表和表格单元格,但不确定如何实现它,使用css已经有一段时间了,无法确定它。没有找到一个插件可以完成这项工作,但css应该可以。我必须创建自定义菜单布局吗?我想不是。我正在使用wordpress菜单plugin, 和标题。php <?php wp_nav_menu( array( \'theme_location\' => \'primary\', \'menu_id\' => \'menu-header\