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,因此请为其指定一个其他插件编写者不可能使用的独特名称。
所以在我的主插件文件中我有这个
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,因此请为其指定一个其他插件编写者不可能使用的独特名称。