save_post-Aktion in einer benutzerdefinierten Metabox-class, die nicht funktioniert

Ich schreibe eine class, um Metaboxen zu erstellen und die Formulardaten zu speichern. Das Problem ist, ich bekomme immer eine Warnung, wenn ich auf “publish” klicke:

Warnung: call_user_func_array() erwartet, dass Parameter 1 ein gültiger Callback ist, function Mighty_Metabox nicht gefunden oder ungültiger functionsname ”

Einige der Dinge, die ich kenne: Die Meta-Box zeigt beim Laden der Seite. Die Speicherfunktion wird beim Laden der Seite aufgerufen. Die obige Warnung wird beim Veröffentlichen zurückgegeben. Die Speicherfunktion wird beim Veröffentlichen nicht aufgerufen.

Muss ich den save_post woanders save_post ? Bekomme ich die WordPress-Integration in meiner class völlig falsch? Einige Hilfe, wie und wann Methoden wie die Save-Methode aufrufen, würde sehr geschätzt werden:

  if (is_admin()){ add_action('load-post.php', 'Mighty_Metabox'); } //the class class Mighty_Metabox{ //the vars public $id = false; public $title = false; public $callback = array(); public $post_type = array(); public $context = false; public $priority = false; public $callback_args = array(); public $template = false; public function __construct($params=false){ if($params){ //arrange params as key => value pairs foreach($params as $key => $value){ $this->{$key} = $value; } //if admin page, add the action - add (metabox) if(is_admin){ //set the callback to create metabox $this->callback = array($this, '_create'); //add the add metabox action add_action('add_meta_boxes', array($this, '_add')); //add the save metabox action add_action('save_post', array($this,'_save')); } } } function _add(){ //add the metabox with user set params add_meta_box($this->id, $this->title, $this->callback, $this->post_type, $this->context, $this->priority, $this->callback_args); } function _create(){ //create the metabox include($this->template); // create a nonce for verification echo 'id .'_nonce" value="' . wp_create_nonce($this->id) . '" />'; } function _save(){ // verify if this is an auto save routine. // If it is our form has not been submitted, so we dont want to do anything if (defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE) { return; } // verify this came from the our screen and with proper authorization, // because save_post can be triggered at other times $nonce = isset($_POST[$this->id.'_nonce']) ? $_POST[$this->id.'_nonce'] : NULL; if (!wp_verify_nonce($nonce, $this->id)){ return $post_id; } $this->_debug(false); // won't get here on page load } private function _debug($exit=true){ var_dump(debug_backtrace()); return ($exit)? exit(): false; } } 

Und hier ist der Nutzen:

 $args = array ( 'id' => '_subtitle', 'title' => 'Subtitle', 'post_type' => 'post', 'context' => 'normal', 'priority' => 'high', 'template' => 'subtitle.php' ); //subtitle metabox $subtitle_mb = new Mighty_Metabox($args); 

Zu Ihrer Information: Ich bin ziemlich neu in der OOP-Programmierung. Ich habe mir den Codex für Metaboxen angeschaut , um mehr zu erfahren, aber ihre class scheint nur ein Wrapper für irgendeinen Code zu sein und scheint es nicht zu ermöglichen, sie zu instantiieren – ich könnte mich irren, wenn ich das denke.

EDIT: Hier ist die Untertitel.php Datei, die enthalten ist:

 
<input type="text" id="id; ?>" name="id; ?>" value="" class='large-text' />
The subtitle will appear under the main post or page title.

Solutions Collecting From Web of "save_post-Aktion in einer benutzerdefinierten Metabox-class, die nicht funktioniert"

Ich habe Ihren Code wie folgt geändert und es funktioniert für mich. Ich habe den Konstruktor aus Ihrem Code entfernt und den Code in der Methode hinzugefügt und diese Methode mit dem Objekt aufgerufen.

 if (is_admin()){ add_action('load-post.php', array('Mighty_Metabox' , 'Custom_Mighty_Metabox')); } //the class class Mighty_Metabox{ //the vars public $id = false; public $title = false; public $callback = array(); public $post_type = array(); public $context = false; public $priority = false; public $callback_args = array(); public $template = false; public function Custom_Mighty_Metabox($params=false){ if($params){ //arrange params as key => value pairs foreach($params as $key => $value){ $this->{$key} = $value; } //if admin page, add the action - add (metabox) if(is_admin){ //set the callback to create metabox $this->callback = array($this, '_create'); //add the add metabox action add_action('add_meta_boxes', array($this, '_add')); //add the save metabox action add_action('save_post', array($this,'_save')); } } } function _add(){ //add the metabox with user set params add_meta_box($this->id, $this->title, $this->callback, $this->post_type, $this->context, $this->priority, $this->callback_args); } function _create(){ //create the metabox include($this->template); // create a nonce for verification echo ''; } function _save(){ // verify if this is an auto save routine. // If it is our form has not been submitted, so we dont want to do anything if (defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE) { return; } // verify this came from the our screen and with proper authorization, // because save_post can be triggered at other times $nonce = isset($_POST[$this->id.'_nonce']) ? $_POST[$this->id.'_nonce'] : NULL; if (!wp_verify_nonce($nonce, $this->id)){ return $post_id; } $this->_debug(false); // won't get here on page load } private function _debug($exit=true){ // var_dump(debug_backtrace()); return ($exit)? exit(): false; } } $args = array ( 'id' => '_subtitle', 'title' => 'Subtitle', 'post_type' => 'post', 'context' => 'normal', 'priority' => 'high', 'template' => 'subtitle.php' ); //subtitle metabox $subtitle_mb = new Mighty_Metabox(); $subtitle_mb->Custom_Mighty_Metabox($args);