Wp_update_post: Unendliche Schleife selbst mit remove_action-Lösung, OOP

Ich habe eine ziemlich komplexe PHP-class, verantwortlich für das Erstellen und Drucken von Meta-Boxen, das Generieren und Speichern von Meta-Feldern, …

Jede meta_box (Objekt der class) hat eine eigene Speicherfunktion, die Metadaten von Post aktualisiert (Felder für sie sind Instanzen einer anderen class), sowie post_excerpt und post_content . Ja, es ist wahrscheinlich etwas kompliziert, aber da ich erst mit OOP anfange, bin ich bisher ziemlich zufrieden damit.

TL, DR, DAS PROBLEM : Mit wp_update_post() auf save_post Hook aufgerufen, save_post ich eine Endlosschleife. Dieses Problem ist sowohl im WP-Codex dokumentiert als auch hier auf WPSE erwähnt: Wie man die Endlosschleife im save_post-Callback vermeidet .

Wenn Sie eine function wie wp_update_post aufrufen, die den Hook save_post enthält, erstellt Ihre Hook-function eine Endlosschleife. Um dies zu vermeiden, haken Sie Ihre function ab, bevor Sie die function aufrufen, die Sie benötigen, und haken Sie sie anschließend erneut ab.

Quelle: Codex

Dies ist eine sehr vereinfachte Version eines Codes, den ich verwende:

 class MetaBox { public function __construct() { // a lot of stuff, hooks and other function initiations add_action('save_post',array($this,'save_box'), 20); } // more stuff function save_box() { // verify nonces, bail out on autosave, ajax, cron, ... switch ($this->id) { case 'editor': case 'postexcerpt': // remove action remove_action('save_post', array($this,'save_box')); // bail out on post_revision if (!wp_is_post_revision($post_id) ){ $post = array( // post id 'id' => $post_id, // tosave: either post_content or post_excerpt // value: pulled from static associative multi-array inside MetaBox $tosave => self::$meta[$this->id][$this->id] ); wp_update_post($post); } // add action back add_action('save_post', array($this, 'save_box')); break; default: // some saving functionality for meta values, that WORKS just fine break; } } } 

Ich bekomme eine Endlosschleife mit PHP Fehlermeldung: Undefined index: ID in XXX/web/wp-includes/post.php on line 2987

Entferne / addiere ich einen Sicherungshaken falsch? Hat es etwas damit zu tun, die Speicherfunktion nicht statisch zu benutzen?

Ich bin natürlich glücklich, den Rest des relevanten Codes zur Verfügung zu stellen, wenn es kein offensichtliches Problem mit dieser Struktur gibt.

BEARBEITEN

Das Endlosschleife Problem ist weg – wie @TheDeadMedic erwähnt, Problem lag bei nicht übereinstimmende Priorität.

Um einen Hook zu entfernen, müssen die Argumente $ function_to_remove und $ priority übereinstimmen, wenn der Hook hinzugefügt wurde. Dies gilt sowohl für Filter als auch für Aktionen. Es wird keine Warnung zum Entfernungserrors gegeben.

Kodex: http://codex.wordpress.org/Function_Reference/remove_action

BEARBEITEN 2

Da PHP eine case-sensitive Sprache ist, lag in meinem $ post-Array (Parameter von wp_update_meta ) ein Problem mit der wp_update_meta eines nicht wp_update_meta Undefined index ID . Der ID-Schlüssel muss in Großbuchstaben angegeben werden.

 $post = array( 'ID' => $post_id // ID must be uppercase ) 

/////

Da sich meine Frage als sehr lokalisiert herausgestellt hat, können Sie sie gerne löschen. Und nochmals danke, dass du mir geholfen hast!

Danke im Voraus!

Solutions Collecting From Web of "Wp_update_post: Unendliche Schleife selbst mit remove_action-Lösung, OOP"

Sie müssen die $priority erfüllen, die Sie zum Abhaken der Aktion verwendet haben:

 remove_action( 'save_post', array( $this, 'save_box' ), 20 /* Same as add_action call */ ); 

http://codex.wordpress.org/Function_Reference/remove_action

$post_id Sie sicher, dass Sie das Argument $post_id in Ihrer save_box Methode verwenden:

 function save_box( $post_id ) { ... }