add_action mit einer classnmethode verursacht schwerwiegende Fehler

Ich war mir nicht sicher, ob dies ein PHP-Problem (geeignet für StackOverflow) oder ein WordPress-Problem (geeignet für StackExchange) war, aber da mein Problem mit der function add_action() , habe ich die Frage hier gestellt.

Hier ist ein vereinfachter Code, der das gleiche Problem verursacht (um zu verhindern, dass mein Paar-Hundert-Zeilen-Plugin erneut hochgeladen wird):

 core(); } public static function core() { echo "I never get this far..."; } } ?> 

Ich erhalte den folgenden Fehler:

Schwerwiegender Fehler : Verwenden Sie $ this, wenn Sie nicht im Objektkontext in /home/coupon/public_html/wp-content/plugins/test.php in Zeile 7 sind

Wenn stattdessen mein add_action() :

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

Dann würde ich diesen Fehler verstehen (da die function statisch aufgerufen wurde und es keine Instanz von DEMenu gibt, auf die $this verweist), aber ich verstehe nicht, warum dies passiert, da ich ein Array verwendet und eine Instanz der class übergeben habe .

Mein spezifisches Problem bezieht sich eigentlich auf dieses Problem. Ich habe eine benutzerdefinierte Walker-class erstellt und dann den wp_nav_menu_args Filter verwendet, um meinen benutzerdefinierten Walker zu übergeben. Ich erhalte diesen Fehler in class-wp-walker.php in Zeile 185 . Die Linie ist insbesondere:

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

Irgendwelche Ideen?

Bearbeiten –

test.php funktioniert jetzt richtig, aber das ursprüngliche Problem ist nicht getriggers … Als solches ist hier die index.php Datei meines Plugins (vereinfacht):

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

Wie oben erwähnt, erhalte ich den folgenden Fehler:

Schwerwiegender Fehler : Verwenden Sie $ this, wenn Sie nicht in Objektkontext in /home/coupon/public_html/wp-includes/class-wp-walker.php in Zeile 185 sind

Da die obige test.php fehlgeschlagen ist und die Walker_Nav_Menu class diesen Fehler normalerweise nicht hat (erst, als ich mein Plugin hinzugefügt habe), dachte ich, dass das Problem mit dem meiner add_action() oder add_filter() -Aufrufe war. Da es aber immer noch scheitert, bin ich mir nicht ganz sicher, wo das Problem liegt …

ENDBEARBEITEN –

Lesen Sie die function walk_nav_menu_tree() erneut walk_nav_menu_tree() , ich habe das Problem mit meiner Walker-class gefunden …

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

Da $walker auf $r->walker , ist es eine Zeichenfolge, keine Instanz einer class. Daher wird die classnmethode statt über eine Instanz der class statisch aufgerufen. Anstatt von:

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

Ich sollte:

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

Aufgabe : Rufen Sie eine classnmethode als Hook für ein WordPress-Plugin auf, damit die $this Variable nicht gebrochen wird

Solutions Collecting From Web of "add_action mit einer classnmethode verursacht schwerwiegende Fehler"

Versuchen:

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

Das ist richtig! Sie haben den PHP-Fehler, Sie müssen einen Konstruktor zu Ihrer class hinzufügen mit Rückkehr in die “Instanz / Objekt” wie:

 class MyClass { function __construct() { return $this; } /* The other Methods... */ } 

Wenn Sie mit statischen classn und Methoden umgehen wollen

 class Kc_Class{ static function init(){ add_action('some_hook',array(__CLASS__,'my_static_method')); } static function my_static_method(){ ... } } 

Dann rufe deine init-Methode an

 Kc_Class::init();