激活WordPress插件时register_activation_hook不触发的问题
问题原因及修复方案
核心问题1:register_activation_hook的第一个参数错误
register_activation_hook()要求第一个参数是插件主文件的完整路径,你定义的PLUGIN__DIR是插件目录路径(由plugin_dir_path(__FILE__)返回,格式如/wp-content/plugins/your-plugin/),并非主文件路径,这会导致WordPress无法识别对应的插件,激活钩子自然不会触发。
修复方式:
在主文件里修改常量定义,指向主文件而非目录:
// 主文件中定义插件主文件路径 define( 'PLUGIN__FILE', __FILE__ ); define( 'PLUGIN__DIR', plugin_dir_path( __FILE__ ) );
注册激活钩子时使用这个主文件路径常量:
register_activation_hook( PLUGIN__FILE, array( 'Properties', 'initTables' ) );
核心问题2:激活钩子注册时机太晚
你最初在Properties::initHooks()里注册激活钩子,但init动作是在插件激活流程结束后才触发的——WordPress激活插件时,只会加载插件主文件并执行其中的全局代码,此时init钩子尚未触发,激活钩子根本没被注册,所以不会执行。
修复方式:
必须在插件主文件的全局作用域直接注册激活钩子,不能放到init动作的回调函数里。
额外问题:类方法的回调格式错误
在类的initHooks()方法中,你原本使用字符串'initTables'作为回调,但initTables是Properties类的静态方法,WordPress会去全局函数中查找,找不到就不会执行。正确的回调格式应该是数组形式:
register_activation_hook(PLUGIN__FILE, array(__CLASS__, 'initTables'));
(注:这个问题在你移到主文件后已修正,但主文件的路径错误仍存在)
额外问题:SQL语句语法错误
initTables()方法里的SQL语句,最后一个字段accountmanager varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL后面缺少逗号,会导致SQL执行失败。需要补上逗号:
accountmanager varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (id)
最终修复后的主文件代码
<?php /** Plugin info */ // 定义插件主文件路径,而非目录 define( 'PLUGIN__FILE', __FILE__ ); define( 'PLUGIN__DIR', plugin_dir_path( __FILE__ ) ); require_once( PLUGIN__DIR . 'class.properties.php' ); // 直接在全局作用域注册激活钩子 register_activation_hook( PLUGIN__FILE, array( 'Properties', 'initTables' ) ); add_action( 'init', array( 'Properties', 'init' ) );
修复后的Properties类关键代码
class Properties { private static $initiated = false; public static function init() { if (!self::$initiated) { self::initHooks(); } } private static function initHooks() { self::$initiated = true; // 移除这里的register_activation_hook,移到主文件全局作用域 add_menu_page('Properties', 'Properties', 'manage_options', 'properties/overzicht', array(__CLASS__, 'propertiesIndex'), 'dashicons-admin-multisite', 6); } public static function initTables() { // 可以用wp_die测试钩子是否触发 // wp_die('激活钩子已触发'); global $wpdb; $charset_collate = $wpdb->get_charset_collate(); $sql = " CREATE TABLE ". $wpdb->prefix ."properties ( id int(10) UNSIGNED NOT NULL, office_id int(10) UNSIGNED NOT NULL, system varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, reference varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, tiara_id varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, active tinyint(1) NOT NULL DEFAULT '1', vertrouwelijk tinyint(1) NOT NULL DEFAULT '0', publish tinyint(1) NOT NULL DEFAULT '1', featured tinyint(1) NOT NULL DEFAULT '0', hidden tinyint(1) NOT NULL DEFAULT '0', quiet tinyint(1) NOT NULL DEFAULT '0', straat varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, huisnummer varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, huisnummer_toevoeging varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL, postcode varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL, wijk varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, gemeente varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, plaats varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, provincie varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, land varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, latitude decimal(10,8) DEFAULT NULL, longitude decimal(11,8) DEFAULT NULL, status varchar(40) COLLATE utf8mb4_unicode_ci DEFAULT NULL, aanmelding varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, koop tinyint(1) NOT NULL DEFAULT '0', koopprijs_voorvoegsel varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, koopprijs int(10) UNSIGNED DEFAULT NULL, koopprijs_conditie varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, koopprijs_specificatie varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, vov_datum datetime DEFAULT NULL, vov_datum_tot datetime DEFAULT NULL, transactie_datum datetime DEFAULT NULL, woz_waarde int(10) UNSIGNED DEFAULT NULL, woz_peildatum date DEFAULT NULL, koopmengvorm varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, huur tinyint(1) NOT NULL DEFAULT '0', huurprijs_voorvoegsel varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, huurprijs int(10) UNSIGNED DEFAULT NULL, huurprijs_conditie varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, huurprijs_specificatie varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, prijs_tonen tinyint(1) NOT NULL DEFAULT '1', servicekosten int(10) UNSIGNED DEFAULT NULL, aanvaarding varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL, aanvaarding_datum datetime DEFAULT NULL, aanvaarding_toelichting varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL, omschrijving longtext COLLATE utf8mb4_unicode_ci, omschrijving_engels text COLLATE utf8mb4_unicode_ci, gekoppelde_makelaar varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, bouwvorm varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, openhuis_van datetime DEFAULT NULL, openhuis_tot datetime DEFAULT NULL, openhuis_toelichting text COLLATE utf8mb4_unicode_ci, ingevoerd_op datetime NOT NULL, gewijzigd_op datetime DEFAULT NULL, veiling_op datetime DEFAULT NULL, gewijzigd_status_op datetime DEFAULT NULL, gewijzigd_media_op datetime DEFAULT NULL, gewijzigd_prijs_op datetime DEFAULT NULL, verwijderd_op datetime DEFAULT NULL, created_at timestamp NULL DEFAULT NULL, updated_at timestamp NULL DEFAULT NULL, bouwtype_id int(10) UNSIGNED DEFAULT NULL, url_360 varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, url_tour varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, url_youtube varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, url_floorplanner varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, show_maps tinyint(1) NOT NULL DEFAULT '1', show_streetview tinyint(1) NOT NULL DEFAULT '1', prioriteit int(11) DEFAULT NULL, accountmanager varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (id) )". $charset_collate .";"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql); } // 其他方法保持不变 }
内容的提问来源于stack exchange,提问作者twan
相关产品推荐
相关产品推荐

