我正在尝试开发我的第一个Wordpress插件,并且我在第一阶段就陷入了困境。我正在尝试在插件激活时设置一些选项和数据库表,但没有运气。无论我做什么,插件都会激活,但数据库不受影响且选项不存储在DB中。我尝试在构造函数中回显,但似乎它永远不会到达它。我在WP中激活了调试,但没有报告错误。该功能没有被挂钩。有人能发现我的代码有什么问题吗?
感谢您提前提供任何帮助。
class Myplugin {
private static $instance;
public static function get_instance() {
if ( ! self::$instance ) {
self::$instance = new self();
}
return self::$instance;
}
private function __construct() {
register_activation_hook( __FILE__, array( &$this, 'plugin_activate' ) );
}
public function plugin_activate() {
if ( version_compare( get_bloginfo( 'version' ), '3.8.2', ' < ' ) ) {
deactivate_plugins( basename( __FILE__ ) );
} else {
$rlm_rsvplus_options = array(
'db_version' => '1.0',
'event_name' => '',
'end_date' => '',
);
update_option( 'rlm_myplugin_options', $rlm_myplugin_options );
require_once( "includes/rlm_myplugin_db_setup.php" );//It never reaches this file.
}
}
}
$myplugin = Myplugin::get_instance();
答案 0 :(得分:4)
register_activation_hook
调用需要在类本身之外。
类似的东西:
class Myplugin {
private static $instance;
public static function get_instance() {
if ( ! self::$instance ) {
self::$instance = new self();
}
return self::$instance;
}
private function __construct() {
// do other stuff here
}
public function plugin_activate() {
if ( version_compare( get_bloginfo( 'version' ), '3.8.2', ' < ' ) ) {
deactivate_plugins( basename( __FILE__ ) );
} else {
$rlm_rsvplus_options = array(
'db_version' => '1.0',
'event_name' => '',
'end_date' => '',
);
update_option( 'rlm_myplugin_options', $rlm_myplugin_options );
require_once( "includes/rlm_myplugin_db_setup.php" );
}
}
register_activation_hook( __FILE__, array( 'Myplugin', 'plugin_activate' ) );
您可以阅读Francis Yaconiello关于How to write WordPress plugin的以下教程的更多内容。
答案 1 :(得分:3)
<?php register_activation_hook( $file, $function ); ?>
<强> $文件
(string)(必需) wp-content / plugins目录中主插件文件的路径。完整路径将起作用。 默认值:无
<强> $功能强>
(callback)(必需)激活插件时要运行的函数。任何PHP的回调伪类型都可以使用。 默认值:无
如果从主插件文件之外的文件调用函数,则挂钩将不起作用,因为它没有指向正确的文件。 FILE 将指向编写代码的文件。因此,如果您碰巧包含来自其他地方的这部分代码(另一个文件 - 而不是主插件文件),除非您指出正确的路径,否则它不应该工作。
解决方案可能是在主插件文件中声明一个常量。
<强> your_main_plugin_file.php 强>
define(PLUGIN_FILE_URL, __FILE__);
然后在包含的文件中使用它,就像这样。
<强> 包括/ some_file.php 强>
<?php register_activation_hook( PLUGIN_FILE_URL, ['your_class_name_here', 'your_class_method_name_here']); ?>
或者如果您使用函数而不是类,那么执行
<?php register_activation_hook( PLUGIN_FILE_URL, 'your_function_name_here'); ?>
答案 2 :(得分:0)
为了工作 register_activation_hook 或 register_deactivation_hook ,功能应位于索引文件中,或者我们需要指定文件参数的完整路径。
替换此:
register_activation_hook( FILE, array( &$this, 'plugin_activate' ) );
使用:
register_activation_hook( FILE . 'plugin-main-file.php', array( &$this, 'plugin_activate' ) );
这里是register_activation_hook($ file,$ function);
此处 $ file 表示主插件文件的路径
参考:https://codex.wordpress.org/Function_Reference/register_activation_hook
谢谢, -阿迪