Skip to main content
Found the issue
Source Link
stevendesu
  • 341
  • 2
  • 3
  • 12

FINAL EDIT -

Carefully re-reading the walk_nav_menu_tree() function, I have found the issue with my walker class...

function walk_nav_menu_tree( $items, $depth, $r ) {
        $walker = ( empty($r->walker) ) ? new Walker_Nav_Menu : $r->walker;
        $args = array( $items, $depth, $r );

        return call_user_func_array( array(&$walker, 'walk'), $args );
}

Since $walker is being set to $r->walker it is a string, not an instance of a class. Therefore the class method is called statically instead of via an instance of the class. Instead of:

$args['walker'] = 'DEMenu_Walker';

I should have:

$args['walker'] = new DEMenu_Walker();

FINAL EDIT -

Carefully re-reading the walk_nav_menu_tree() function, I have found the issue with my walker class...

function walk_nav_menu_tree( $items, $depth, $r ) {
        $walker = ( empty($r->walker) ) ? new Walker_Nav_Menu : $r->walker;
        $args = array( $items, $depth, $r );

        return call_user_func_array( array(&$walker, 'walk'), $args );
}

Since $walker is being set to $r->walker it is a string, not an instance of a class. Therefore the class method is called statically instead of via an instance of the class. Instead of:

$args['walker'] = 'DEMenu_Walker';

I should have:

$args['walker'] = new DEMenu_Walker();
Fixed a typo (DEMenu -> MyClass)
Source Link
stevendesu
  • 341
  • 2
  • 3
  • 12
add_action('init', 'DEMenu'MyClass::init');

Any ideas?

EDIT -

test.php is now functioning properly, but the original issue is not solved... As such here's my plugin's index.php file (simplified):

$DEMenu = new DEMenu();

class DEMenu {

    function DEMenu() {
        if (is_admin()) {
            add_action('admin_menu', array(&$this, 'admin'));
        } else {
            add_action('init', array(&$this, 'core'));
        }
    }

    public function admin() {
        /* Not important */
    }

    public function core() {
        add_filter('wp_nav_menu_args', array(&$this, 'add_walker'));
    }
    
    public function add_walker( $args ) {
        $args['walker'] = 'DEMenu_Walker';
        return $args;
    }

}

class DEMenu_Walker extends Walker_Nav_Menu {

    function __construct() {
        die("We made it to the constructor!");
    }

}

As mentioned above, I am getting the following error:

Fatal error: Using $this when not in object context in /home/coupon/public_html/wp-includes/class-wp-walker.php on line 185

Since the above test.php was failing and since the Walker_Nav_Menu class never has this error normally (not until I added my plugin) I figured the issue was with the one of my add_action() or add_filter() calls. However since it is still failing I'm not entirely sure where the issue is...

add_action('init', 'DEMenu::init');

Any ideas?

add_action('init', 'MyClass::init');

Any ideas?

EDIT -

test.php is now functioning properly, but the original issue is not solved... As such here's my plugin's index.php file (simplified):

$DEMenu = new DEMenu();

class DEMenu {

    function DEMenu() {
        if (is_admin()) {
            add_action('admin_menu', array(&$this, 'admin'));
        } else {
            add_action('init', array(&$this, 'core'));
        }
    }

    public function admin() {
        /* Not important */
    }

    public function core() {
        add_filter('wp_nav_menu_args', array(&$this, 'add_walker'));
    }
    
    public function add_walker( $args ) {
        $args['walker'] = 'DEMenu_Walker';
        return $args;
    }

}

class DEMenu_Walker extends Walker_Nav_Menu {

    function __construct() {
        die("We made it to the constructor!");
    }

}

As mentioned above, I am getting the following error:

Fatal error: Using $this when not in object context in /home/coupon/public_html/wp-includes/class-wp-walker.php on line 185

Since the above test.php was failing and since the Walker_Nav_Menu class never has this error normally (not until I added my plugin) I figured the issue was with the one of my add_action() or add_filter() calls. However since it is still failing I'm not entirely sure where the issue is...

Source Link
stevendesu
  • 341
  • 2
  • 3
  • 12

add_action with a class method is causing fatal errors

I wasn't sure if this was a PHP issue (suited for StackOverflow) or a WordPress issue (suited for StackExchange), however since my issue appears to be with the add_action() function, I have placed the question here.

Here's some simplified code which causes the same issue (to avoid re-posting my couple-hundred line plugin):

<?php
$class = new MyClass();
add_action('init', array($class, 'init'));

class MyClass {
    public static function init() {
        $this->core();
    }
    public static function core() {
        echo "I never get this far...";
    }
}
?>

I get the following error:

Fatal error: Using $this when not in object context in /home/coupon/public_html/wp-content/plugins/test.php on line 7

If my add_action() call were instead:

add_action('init', 'DEMenu::init');

Then I would understand this error (since the function was called statically and there is no instance of DEMenu for $this to point to), however I don't understand why this is happening since I used an array and passed an instance of the class.

My specific issue is actually related to this problem. I created a custom Walker class then used the wp_nav_menu_args filter to pass my custom Walker. I get this error in class-wp-walker.php on line 185. The line in particular is:

$id_field = $this->db_fields['id'];

Any ideas?


Task: Call a class method as a hook for a WordPress plugin so that the $this variable is not broken