Wordpress 插件 register_activation_hook 不工作

Wordpress plugin register_activation_hook doesnt work

所以在我的主插件文件中我有这个

class RegistrationHooks
{
    /**
     * @var string
     */
    protected string $plugin_dir;

    public function __construct()
    {
        $this->plugin_dir = WP_PLUGIN_DIR . '/invoices';
    }

    function active_invoices()
    {
        require_once $this->plugin_dir . '/includes/class-invoices.php';
        new Invoices();
    }
}

$hooksInstance = new RegistrationHooks();

register_activation_hook(__FILE__, array($hooksInstance, 'active_invoices'));

在我的 Invoices class 里面我有这个:

class Invoices
{
    public function __construct()
    {
        $this->load_dependencies();
        $this->define_admin_hooks();
    }

    private function load_dependencies()
    {
        $path = WP_PLUGIN_DIR . '/invoices';
        if ($path) {
            require_once $path . '/admin/class-admin.php';
        }
    }

    private function define_admin_hooks()
    {
        $plugin_admin = new Admin();

        add_action('admin_menu', array($plugin_admin, 'add_plugin_admin_menu'));
    }
}

在我的 Admin class 中,我有简单的方法将项目添加到菜单

class Admin {

    public function add_plugin_admin_menu()
    {
        add_menu_page(
            'Page Title',
            'Menu Title',
            'edit_posts',
            'menu_slug',
        );
    }
}

但是当我激活插件时,项目没有添加到管理菜单中。当我将我的 Invoices class 放入我的主插件 class 时,它可以工作。

您在滥用 register_activation_hook()。当您激活您的插件时(通常在安装后立即),该挂钩仅 运行s。它用于诸如创建 plugin-specific 表和预填充选项之类的事情。激活后,WordPress 会立即进行重定向并开始新的页面视图,因此您在激活挂钩中所做的任何事情 non-persistent(例如添加其他操作)都会立即消失。

您的代码只需要注册挂钩中的 class-invoices.php 文件。所以它不会 运行 在普通页面视图或仪表板视图中。

您可以在您的顶层插件文件中执行此操作,以在仪表板视图中获取您的管理代码并构建它。

function invoices_admin_init () {
  require_once( plugin_dir_path( __FILE__ ) . '/includes/class-invoices.php' );
  new Invoices();
}

add_action( 'admin_init', invoices_admin_init );

最好只在需要时才需要代码(在此示例中,仅在仪表板网页浏览中)以减少插件导致的开销。

请注意,您声明的操作函数会污染 WordPress 的全局名称 space,因此请为其指定一个其他插件编写者不可能使用的独特名称。