add_action com um método de classe está causando erros fatais

4

Eu não tinha certeza se esse era um problema do PHP (adequado para StackOverflow) ou WordPress (adequado para o StackExchange), mas como meu problema aparece com a função add_action() , Eu coloquei a questão aqui.

Aqui está um código simplificado que causa o mesmo problema (para evitar postar novamente meu plug-in de centenas de linhas):

<?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...";
    }
}
?>

Eu recebo o seguinte erro:

  

Erro fatal : usando $ this quando não está no contexto de objeto em /home/coupon/public_html/wp-content/plugins/test.php on-line 7

Se a minha chamada add_action() fosse em vez disso:

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

Então eu entenderia esse erro (já que a função foi chamada estaticamente e não há nenhuma instância do DEMenu para $this apontar), no entanto eu não entendo porque isso está acontecendo desde que eu usei uma matriz e passei instância da classe.

Meu problema específico está relacionado a esse problema. Eu criei uma classe de Walker personalizada e usei o filtro wp_nav_menu_args para passar meu Walker personalizado. Eu recebo este erro em class-wp-walker.php on line 185 . A linha em particular é:

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

Alguma idéia?

EDITAR

test.php agora está funcionando corretamente, mas o problema original não está resolvido ... Como tal, aqui está o arquivo index.php do meu plugin (simplificado):

$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!");
    }

}

Como mencionado acima, estou recebendo o seguinte erro:

  

Erro fatal : usando $ this quando não está no contexto de objeto em /home/coupon/public_html/wp-includes/class-wp-walker.php on-line < strong> 185

Como o test.php acima estava falhando e como a classe Walker_Nav_Menu nunca apresenta esse erro normalmente (não adicionei meu plug-in), concluí que o problema era o das minhas add_action() ou add_filter() chamadas. No entanto, como ainda está falhando, não sei ao certo onde o problema está ...

EDIÇÃO FINAL -

Com cuidado, relendo a função walk_nav_menu_tree() , encontrei o problema com a minha turma de walker ...

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 );
}

Como $walker está sendo definido como $r->walker , é uma string, não uma instância de uma classe. Portanto, o método de classe é chamado estaticamente, em vez de por meio de uma instância da classe. Em vez de:

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

Eu deveria ter:

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

Tarefa : chame um método de classe como um gancho para um plug-in do WordPress para que a variável $this não seja quebrada

    
por stevendesu 29.07.2011 / 02:15

3 respostas

4

Tente:

<?php
$class = new MyClass();

class MyClass {
    public function MyClass() {
       add_action('init', array($this, 'core'));
    }
    public static function core() {
        echo "I never get to here";
    }
}
?>
    
por Andre 29.07.2011 / 02:23
1
$class = new MyClass();
add_action('init', array($class, 'init'));

Isso está correto! Você tem o erro PHP, você deve adicionar um construtor à sua classe com o retorno "Instância / Objeto" como:

class MyClass {
    function __construct() {
        return $this;
    }

    /* The other Methods... */
}
    
por Adrian Preuß 18.01.2013 / 13:36
0

Se você for lidar com classes e métodos estáticos

class Kc_Class{

  static function init(){

      add_action('some_hook',array(__CLASS__,'my_static_method'));

  }    
  static function my_static_method(){

    ...
  }
}

Em seguida, faça uma chamada para o seu método init

Kc_Class::init();
    
por Dipesh Kc 28.03.2013 / 12:12