插件激活挂钩在Wordpress中不起作用

Rey*_*eon 6 php wordpress plugins

我正在尝试开发我的第一个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();
Run Code Online (Sandbox Code Playgroud)

Dev*_*vWL 12

回到 WordPress 文档。

<?php register_activation_hook( $file, $function ); ?>
Run Code Online (Sandbox Code Playgroud)

参数

$文件

(string) (required) wp-content/plugins 目录中主插件文件的路径。完整路径将起作用。默认值:无

$函数

(callback) (required) 当插件被激活时要运行的函数。PHP 的任何回调伪类型都可以使用。默认值:无

可能的问题

如果从主插件文件之外的文件调用函数,则钩子将不起作用,因为它没有指向正确的文件。FILE将指向写入代码的文件。因此,如果您碰巧从其他地方(另一个文件 - 不是主插件文件)包含这部分代码,除非您指向正确的路径,否则它不应该工作。

解决方案

解决方案可能是在主插件文件中声明一个常量。

your_main_plugin_file.php

define(PLUGIN_FILE_URL, __FILE__);
Run Code Online (Sandbox Code Playgroud)

然后像这样在包含的文件中使用它。

包括/some_file.php

<?php register_activation_hook( PLUGIN_FILE_URL, ['your_class_name_here', 'your_class_method_name_here']); ?>
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用函数而不是类,那么请执行

<?php register_activation_hook( PLUGIN_FILE_URL, 'your_function_name_here'); ?>
Run Code Online (Sandbox Code Playgroud)

  • 很棒的答案@DevWL 这是我的问题 (2认同)

Too*_*ote 5

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' ) );
Run Code Online (Sandbox Code Playgroud)

您可以在Francis Yaconiello的以下教程中阅读有关如何编写WordPress插件的更多信息