add_action avec une méthode de classe provoque des erreurs fatales

4

Je ne savais pas s'il s'agissait d'un problème PHP (adapté à StackOverflow) ou à un problème WordPress (adapté à StackExchange). Toutefois, étant donné que mon problème semble concerner la fonction add_action() , J'ai posé la question ici.

Voici un code simplifié qui cause le même problème (pour éviter de republier mon plugin de quelques centaines de lignes):

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

Je reçois le message d'erreur suivant:

  

Erreur fatale : utilisation de $ this lorsque le contexte de l'objet ne se trouve pas dans /home/coupon/public_html/wp-content/plugins/test.php à la ligne 7

Si mon add_action() appel était à la place:

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

Ensuite, je comprendrais cette erreur (étant donné que la fonction a été appelée de manière statique et qu'il n'y a aucune instance de DEMenu pour $this à pointer), mais je ne comprends pas pourquoi cela se produit, car j'ai utilisé un tableau et passé un instance de la classe.

Mon problème spécifique est en fait lié à ce problème. J'ai créé une classe Walker personnalisée, puis j'ai utilisé le filtre wp_nav_menu_args pour transmettre mon Walker personnalisé. Je reçois cette erreur dans class-wp-walker.php sur la ligne 185 . La ligne en particulier est:

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

Des idées?

MODIFIER -

test.php fonctionne maintenant correctement, mais le problème initial n'a pas été résolu ... En tant que tel, voici le fichier index.php de mon plugin (simplifié):

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

}

Comme mentionné ci-dessus, le message d'erreur suivant s'affiche:

  

Erreur fatale : utilisation de $ this lorsque le contexte de l'objet ne se trouve pas dans /home/coupon/public_html/wp-includes/class-wp-walker.php en ligne < fort> 185

Étant donné que test.php précédent échouait et que la classe Walker_Nav_Menu n'avait jamais cette erreur normalement (pas avant l'ajout de mon plugin), j'ai supposé que le problème était lié à celui de mes appels add_action() ou add_filter() . Cependant, comme il échoue encore, je ne suis pas tout à fait sûr de savoir où se trouve le problème ...

FINAL EDIT -

Relisant attentivement la fonction walk_nav_menu_tree() , j'ai trouvé le problème avec ma classe de marcheurs ...

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

Puisque $walker est défini sur $r->walker , il s’agit d’une chaîne et non d’une instance de classe. Par conséquent, la méthode de classe est appelée de manière statique au lieu de via une instance de la classe. Au lieu de:

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

J'aurais dû:

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

Tâche : appelez une méthode de classe en tant que raccord pour un plug-in WordPress afin que la variable $this ne soit pas cassée

    
posée stevendesu 29.07.2011 - 02:15

3 réponses

4

Essayez:

<?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";
    }
}
?>
    
réponse donnée Andre 29.07.2011 - 02:23
1
$class = new MyClass();
add_action('init', array($class, 'init'));

C'est correct! Vous avez le PHP-Error, vous devez ajouter un constructeur à votre classe avec returnin le "Instance / Object" comme:

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

    /* The other Methods... */
}
    
réponse donnée Adrian Preuß 18.01.2013 - 13:36
0

Si vous devez gérer des classes et méthodes statiques

class Kc_Class{

  static function init(){

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

  }    
  static function my_static_method(){

    ...
  }
}

Puis appelez votre méthode init

Kc_Class::init();
    
réponse donnée Dipesh Kc 28.03.2013 - 12:12

Lire d'autres questions sur les étiquettes