web-dev-qa-db-fra.com

add_action with a method of class provoquant les erreurs fatales

Je ne savais pas si c’était un problème de PHP (adapté à StackOverflow) ou un problème de WordPress (adapté à StackExchange). Cependant, depuis que mon problème semble être avec la fonction add_action(), j’ai placé 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 l'erreur suivante:

Erreur fatale : Utiliser $ this quand il ne se trouve pas dans le contexte de l'objet dans /home/coupon/public_html/wp-content/plugins/test.php on line 7

Si mon appel add_action() était plutôt:

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

Ensuite, je comprendrais cette erreur (puisque la fonction était appelée de manière statique et qu’il n’y avait aucune instance de DEMenu pour $this à pointer), mais je ne comprends pas pourquoi cela se produit puisque j’ai utilisé un tableau et passé une 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 à 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, j'obtiens l'erreur suivante:

Erreur fatale : Utiliser $ this quand il ne se trouve pas dans le contexte de l'objet dans /home/coupon/public_html/wp-includes/class-wp-walker.php on line 185

Depuis que test.php ci-dessus échouait et depuis que la classe Walker_Nav_Menu n'avait jamais cette erreur normalement (pas avant d'avoir ajouté mon plugin), j'ai supposé que le problème était lié à l'un de mes appels add_action() ou add_filter(). Cependant, comme il échoue encore, je ne sais pas trop où est le problème ...

FINAL EDIT -

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

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

Étant donné que $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();

Task : Appelle une méthode de classe en tant que hook pour un plugin WordPress afin que la variable $this ne soit pas cassée

4
stevendesu

Essayer:

<?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";
    }
}
?>
4
Andre
$class = new MyClass();
add_action('init', array($class, 'init'));

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

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

    /* The other Methods... */
}
1
Adrian Preuß

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();
0
Dipesh KC