Why do some hooks not work inside class context?

I'm pretty stumped on this one. I'm using add_action inside my plugin class to do certain things- add scripts styles to the head, wp_ajax, etc. Here's the actions, in the __construct:

function __construct(){
    add_action('admin_menu', array($this, 'sph_admin_menu'));
    add_action('sph_header', array($this, 'sph_callback'));
    add_action('sph_header_items', array($this, 'sph_default_menu'), 1);
    add_action('sph_header_items', array($this, 'sph_searchform'), 2);
    add_action('sph_header_items', array($this, 'sph_social'), 3);

    //Below here they don't work. I have to call these outside of the class (but I need class variables within the functions)
    add_action('wp_print_styles', array($this, 'sph_stylesheets'));
    add_action('wp_print_scripts', array($this, 'sph_scripts'));
    add_action( 'wp_ajax_nopriv_add_to_list', array($this, 'le_add_to_list'));
    add_action( 'wp_ajax_add_to_list', array($this, 'le_add_to_list'));
    add_action('init', array($this, 'register_menu'));
}

Anybody ever come across something like this? I'd really like to know how to use said hooks from within a class- it's so messy having actions outside the class!

Topic oop actions hooks Wordpress

Category Web


Sometimes certain hooks need to be fired at certain times. Example, some hooks need to be fired upon init.

Add this to your __construct()

add_action('init', array(&$this, 'init'));

Then add this function, which will contain all hooks that need to be fired upon init.

public function init(){
    add_action('hook_name', array(&$this, 'your_method_name'));
    add_action('hook_name', array(&$this, 'your_method_name'));
    add_action('hook_name', array(&$this, 'your_method_name'));
    add_action('hook_name', array(&$this, 'your_method_name'));
}

Another Example:

add_action( 'init', function () {

    add_action( 'hook_name', 'function_name', 10, 3 );
    add_action( 'hook_name', __NAMESPACE__ . '\namespaced_function_name', 10 );
    add_action( 'hook_name', '\specific\namespace\function_name', 5 );

}, 1 );

You will want to read about the hooks and when they are fired. So you know when and where to trigger your actions. Plugin API/Action Reference


This is a pretty old question, but in case anyone is looking for an answer, I had a similar issue. I had a class

class Plugin{
  function __construct(){
    add_action('init', array(&$this, 'init'));
  }

  function init(){
    // code...
  }
}

Plugin::init() was never getting called. I then realized my mistake. To instantiate the class I was doing this:

if(class_exists('Plugin')){
    add_action("init", "plugin_init");
    function socialsports_init() {
      global $plugin;
      $plugin = new Plugin;
    }
}

To fix it, I just changed the instantiation code to:

if(class_exists('Plugin')){
    add_action("init", "plugin_init");
    function socialsports_init() {
      global $plugin;
      $plugin = new Plugin;
      $plugin->init();
    }
}

The other option would be to use a different hook in the constructor:

function __construct(){
  add_action('wp_loaded', array(&$this, 'init'));
}

Or an earlier hook in the instantiation:

add_action("plugins_loaded", "plugin_init");

About

Geeks Mental is a community that publishes articles and tutorials about Web, Android, Data Science, new techniques and Linux security.