So In my main plugin file I have this
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'));
And inside My Invoices class I have this:
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'));
}
}
And Inside my Admin class I have simple method to add item to menu
class Admin {
public function add_plugin_admin_menu()
{
add_menu_page(
'Page Title',
'Menu Title',
'edit_posts',
'menu_slug',
);
}
}
But when I activate Plugin item doesnt get added to admin menu. When I Place my Invoices class inside my main Plugin class it works.
CodePudding user response:
You're misusing register_activation_hook(). That hook only runs when you Activate your plugin (immediately after installing it, usually). It's used for things like creating plugin-specific tables and prepopulating options. Immediately after activation, WordPress does a redirect and starts a new page view, so anything non-persistent you do (like adding other actions) in the activation hook vanishes immediately.
Your code only requires your class-invoices.php file from within your registration hook. So it doesn't run in ordinary page views or dashboard views.
You can do this, in your toplevel plugin file, to require your admin code, and construct it, on dashboard views.
function invoices_admin_init () {
require_once( plugin_dir_path( __FILE__ ) . '/includes/class-invoices.php' );
new Invoices();
}
add_action( 'admin_init', invoices_admin_init );
It's good practice to require code only when it's needed (in this example, only on dashboard pageviews) to reduce the overhead your plugin causes.
Be aware that the action function you declare pollutes WordPress's global name space, so give it a distinct name no other plugin writer is likely to use.
