add_action con un método de clase está causando errores fatales

4

No estaba seguro de si se trataba de un problema de PHP (adecuado para StackOverflow) o de WordPress (adecuado para StackExchange), sin embargo, dado que mi problema aparece para estar con la función add_action() , He colocado la pregunta aquí.

Aquí hay un código simplificado que causa el mismo problema (para evitar volver a publicar mi complemento de doscientas líneas):

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

Recibo el siguiente error:

  

Error grave : usar $ esto cuando no está en el contexto del objeto en /home/coupon/public_html/wp-content/plugins/test.php en la línea 7

Si mi llamada add_action() fuera en cambio:

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

Entonces entendería este error (ya que la función se llamó de forma estática y no hay una instancia de DEMenu para que $this apunte a), sin embargo, no entiendo por qué sucede esto ya que usé una matriz y pasé una instancia de la clase.

Mi problema específico está realmente relacionado con este problema. Creé una clase de Walker personalizada y luego usé el filtro wp_nav_menu_args para pasar mi Walker personalizado. Recibo este error en class-wp-walker.php en la línea 185 . La línea en particular es:

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

¿Alguna idea?

EDITAR -

test.php ahora funciona correctamente, pero el problema original no se resuelve ... Como tal, aquí está el archivo index.php de mi complemento (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 se mencionó anteriormente, recibo el siguiente error:

  

Error grave : usar $ esto cuando no está en el contexto del objeto en /home/coupon/public_html/wp-includes/class-wp-walker.php en la línea < fuerte> 185

Dado que el anterior test.php estaba fallando y como la clase Walker_Nav_Menu nunca tiene este error normalmente (no hasta que agregué mi complemento), pensé que el problema era con el de mis llamadas add_action() o add_filter() . Sin embargo, como todavía está fallando, no estoy completamente seguro de cuál es el problema ...

EDITAR FINAL -

Al releer cuidadosamente la función walk_nav_menu_tree() , he encontrado el problema con mi clase de caminante ...

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

Dado que $walker se establece en $r->walker , es una cadena, no una instancia de una clase. Por lo tanto, el método de clase se llama estáticamente en lugar de a través de una instancia de la clase. En lugar de:

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

Debería tener:

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

Tarea : llame a un método de clase como un gancho para un complemento de WordPress para que la variable $this no se rompa

    
pregunta stevendesu 29.07.2011 - 02:15

3 respuestas

4

Prueba:

<?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";
    }
}
?>
    
respondido por el Andre 29.07.2011 - 02:23
1
$class = new MyClass();
add_action('init', array($class, 'init'));

Eso es correcto! Usted tiene el error de PHP, debe agregar un constructor a su clase con la devolución en la "instancia / objeto" como:

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

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

Si va a tratar con clases y métodos estáticos

class Kc_Class{

  static function init(){

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

  }    
  static function my_static_method(){

    ...
  }
}

Luego haga una llamada a su método de inicio

Kc_Class::init();
    
respondido por el Dipesh Kc 28.03.2013 - 12:12

Lea otras preguntas en las etiquetas