我尝试构建一个带有自定义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 );
}
}
最合适的回答,由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
.