2016-02-12 13 views
6

Ich habe einen benutzerdefinierten Post-Typ mit einem Metabox-Datum von und Datum erstellt.Speichern Sie benutzerdefinierte Post-Meta, die Daten nicht speichern

Individuelle Post Art Schöpfung mit der Call-Back-Funktion von add_events_metaboxes

function event_list_init(){ 

    $labels = array(
     'name'     => _x('Events', 'post type general name'), 
     'singular_name'   => _x('Event', 'post type singular name'), 
     'menu_name'    => _x('Events List', 'admin menu'), 
     'name_admin_bar'  => _x('Events List', 'add new on admin bar'), 
     'add_new_item'   => __('Add New Event'), 
     'new_item'    => __('New Event'), 
     'edit_item'    => __('Edit Event'), 
     'view_item'    => __('View Event'), 
     'all_items'    => __('All Events'), 
     'search_items'   => __('Search Events'), 
     'not_found'    => __('No Events found.'), 
     'not_found_in_trash' => __('No Events found in Trash.') 
    ); 

    $args = array(
     'labels'    => $labels, 
     'description'   => __('Create Events'), 
     'public'    => true, 
     'publicly_queryable' => true, 
     'show_ui'    => true, 
     'show_in_menu'   => true, 
     'query_var'    => true, 
     'rewrite'    => array('slug' => 'event'), 
     'capability_type'  => 'post', 
     'has_archive'   => true, 
     'hierarchical'   => true, 
     'menu_position'   => 6, 
     'register_meta_box_cb' => 'add_events_metaboxes', 
     'menu_icon'    => 'dashicons-calendar-alt', 
     'supports'    => array('title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments') 
    ); 

    register_post_type('events',$args); 

} 

add_action('init','event_list_init'); 

hier ist die Rückruffunktion, die eine Klasse instanziiert die metabox zu erstellen und veröffentlichen Daten über die Aktion Haken save_post

function add_events_metaboxes(){ 
    new eventsListMetaBox(); 
} 

class eventsListMetaBox{ 
    /* 
    * Constructor that creates the meta box 
    */ 
    public function __construct(){ 
     /** 
     * Render and Add form meta box 
     */ 
     add_meta_box('wpt_events_date', 'Events Date', array($this, 'fisa_events_date'), 'events', 'side', 'high'); 

     /** 
     * Save Date from and to as meta key 
     */ 
     add_action('save_post',array($this, 'fisa_events_date_save'),1,2); 
    } 

    /** 
    * Render Form for Events date 
    */ 
    function fisa_events_date() { 

     global $post; 

     // Add an nonce field so we can check for it later. 
     wp_nonce_field('events_date_fromto', 'events_datefromto_nonce'); 

     // Echo out the field 
     echo '<label for="_fisa_date_from">Date From</label>'; 
     echo '<input id="fisa-event-datefrom" type="text" name="_fisa_date_from" class="widefat" />'; 
     echo '<br/><br/>'; 
     echo '<label for="_fisa_date_to">Date To</label>'; 
     echo '<input id="fisa-event-dateto" type="text" name="_fisa_date_to" class="widefat" />'; 

    } 

    /** 
    * Meta key actual database insertion 
    */ 
    function fisa_events_date_save($post_id){ 

     /** 
     * Check if nonce is not set 
     */ 
//  if (!isset($_POST['events_datefromto_nonce'])) 
//   return $post_id; 
// 
//  $nonce = $_POST['events_datefromto_nonce']; 
//  /** 
//   * Verify that the request came from our screen with the proper authorization 
//   */ 
//  if(!wp_verify_nonce($nonce,'events_date_fromto')) 
//   return $post_id; 
// 
//  //Check the user's permission 
// 
//  if(!current_user_can('edit_post',$post_id)) 
//   return $post_id; 

     //Prepare and sanitize the data before saving it 
     $events_date = array(
          sanitize_text_field($_POST['_fisa_date_from']), 
          sanitize_text_field($_POST['_fisa_date_to']) 
         ); 

     update_post_meta($post_id, '_fisa_events_date', $events_date); 
    } 
} 
speichern

Mein Problem ist, kann ich nicht sehen _fisa_events_date Metaschlüssel in postmeta Tabelle von WordPress.Kann jemand bitte zeigen, was ich verpasst habe oder was soll ich tun können, um es zu speichern?

+0

Haben Sie die Meta-Box angezeigt, um zu sehen in der Lage, wenn Sie einen Beitrag dieser Art bearbeiten? – Stiliyan

+0

@Stiliyan Ja. Ich sehe es. Das einzige Problem ist, dass es die Daten nicht speichert. Deshalb habe ich in meinem Beitrag die Überprüfung von Nonce als Kommentar gemacht, nur um zu versuchen, die Daten direkt zu speichern. –

+0

@jameswartlopez Ist es möglich, dass Sie Ihre Metaboxen nicht mit add_action ('admin_init', 'add_events_metaboxes') registriert haben; '? Ich bin erfolgreich in der Lage, '_fisa_events_date' mit dem Rest Ihres Codes nach dem Hinzufügen dieser Anweisung zu speichern. – Stiliyan

Antwort

5

Sie verlassen sich auf register_meta_box_cb, um Ihre Metabox anzuzeigen und speichern Logik in save_post. Das Problem ist, dass Wordpress register_meta_box_cb (die in add_meta_boxes hakt) nur ausgeführt wird, wenn Metaboxen angezeigt werden müssen - d. H. Wenn die Postseiten zum Bearbeiten oder Hinzufügen aufgerufen werden. Aber wenn Wordpress Posts speichert, muss es die Metaboxen nicht anzeigen, so dass register_meta_box_cb, add_events_metaboxes und Ihr save_post Hook nie aufgerufen werden.

Die einfachste Lösung ist zu Ihr register_meta_box_cb Argument zu entfernen, und Ihre add_events_metaboxes Funktion zum admin_init Ereignisse verknüpfen.

add_action('admin_init', 'add_events_metaboxes'); 

Sie können dies nur unter Ihrem add_action('init', 'event_list_init') Haken.

Suchen Sie nach einem Schlüssel here.

2

Nach dem Wordpress documentation, register_meta_box_cb:

aufgerufen wird, wenn die Meta-Boxen für die Bearbeitung von Formular einrichten.

Welches ist too late in den save_post Haken. So

Ich schlage vor, Sie separat in die irgendwo in Ihrem functions.php Datei save_post Haken:

Registrieren von Post Typ

$args = array(
    .... 
    'register_meta_box_cb' => 'add_events_metaboxes', 
    .... 
); 
register_post_type('events', $args); 

Render die metabox

function add_events_metaboxes(){ 
    new eventsListMetaBox(); 
} 

class eventsListMetaBox{ 
    public function __construct(){ 
     add_meta_box('wpt_events_date', 'Events Date', array($this, 'fisa_events_date'), 'events', 'side', 'high'); 
    } 

    function fisa_events_date() { 
     ... 
    } 
} 

Speichern der metabox

add_action('save_post', 'fisa_events_date_save'); 

function fisa_events_date_save(){ 
    global $post; 
    $post_id = $post->ID; 

    // Use wp_verify_nonce and other checks to verify everything is right 

    $events_date = array(
         sanitize_text_field($_POST['_fisa_date_from']), 
         sanitize_text_field($_POST['_fisa_date_to']) 
        ); 
    update_post_meta($post_id, '_fisa_events_date', $events_date); 
} 

halten Bitte beachten Sie, dass Wordpress ist nicht vollständig objektorientiert betrieben werden soll, so kann es Probleme seine hooking system mit OOP-Konzepte verwenden.

0

Einfachste & Die flexibelste Lösung ist die Verwendung von erweiterten benutzerdefinierten Feldern.

+0

Hallo, Trips, Entschuldigung für die Daumen nach unten, aber Ihre Antwort hat ein paar Probleme und es ist fast verlockend es zu markieren, um es in einen Kommentar umzuwandeln ... "Kommentar-artig" zu sein ist das erste Problem; dann fragt das OP nach einer Code-Lösung, nicht nach einem Tipp eines einfachen Plugins (ja, ACF ist genial); Für Tipps geben Sie bitte als Kommentar ein. Persönliche Sicht: Wenn ich so antworten würde, wie ich bin, würde ich einen Link zum Plugin hinzufügen, eine kurze Beschreibung hinzufügen (objektive Dinge, nicht Marketing) und ein Beispiel zeigen, wie man es programmatisch macht, wie ACF es erlaubt. Alles Gute! – brasofilo

1

Wie in anderen Antworten ausgesetzt, ist das Problem, dass register_meta_box_cb Rückruf nur mit folgendem befassen:

Sie remove_meta_box() und add_meta_box() Anrufe im Callback.

save_post ist nicht im Callback enthalten und muss unabhängig sein. Diese Aktion Haken passiert:

, wenn ein Beitrag oder eine Seite erstellt oder aktualisiert wird, die aus einer Import sein könnte, Post/Seite bearbeiten Form, xmlrpc, oder senden Sie per E-Mail

Wie du bist Wenn ich eine Klasse zum Umbruch der Meta-Box-Erstellung verwende, würde ich vorschlagen, alles darin zu verpacken.
PS: Kommentare überprüfen und notwendige Prüfungen innerhalb save_post Callback hinzufügen.

<?php 
class MyEvents { 
    public function __construct(){ 
     add_action('init', array($this, 'init'));  
     add_action('save_post', array($this, 'save_post'), 10, 2); // no need to change priority to 1 
    } 

    public function init(){ 
     $labels = array(
      'name'     => _x('Events', 'post type general name'), 
      'singular_name'   => _x('Event', 'post type singular name'), 
      'menu_name'    => _x('Events List', 'admin menu'), 
      'name_admin_bar'  => _x('Events List', 'add new on admin bar'), 
      'add_new_item'   => __('Add New Event'), 
      'new_item'    => __('New Event'), 
      'edit_item'    => __('Edit Event'), 
      'view_item'    => __('View Event'), 
      'all_items'    => __('All Events'), 
      'search_items'   => __('Search Events'), 
      'not_found'    => __('No Events found.'), 
      'not_found_in_trash' => __('No Events found in Trash.') 
     ); 
     $args = array(
      'labels'    => $labels, 
      'description'   => __('Create Events'), 
      'public'    => true, 
      'publicly_queryable' => true, 
      'show_ui'    => true, 
      'show_in_menu'   => true, 
      'query_var'    => true, 
      'rewrite'    => array('slug' => 'event'), 
      'capability_type'  => 'post', 
      'has_archive'   => true, 
      'hierarchical'   => true, 
      'menu_position'   => 6, 
      'register_meta_box_cb' => array($this, 'add_metaboxes'), 
      'menu_icon'    => 'dashicons-calendar-alt', 
      'supports'    => array('title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments') 
     ); 
     register_post_type('events',$args); 
    } 

    public function add_metaboxes() { 
     add_meta_box('wpt_events_date', 'Events Date', array($this, 'the_metabox'), 'events', 'side', 'high'); 
    } 

    public function the_metabox($post) { // No need for "global $post", it's passed as parameter 
     wp_nonce_field('events_date_fromto', 'events_datefromto_nonce'); 
     $dates = get_post_meta($post->ID, '_fisa_events_date', true); 
     $from = $dates ? $dates[0] : false; 
     $to = $dates ? $dates[1] : false; 
     echo '<label for="_fisa_date_from">Date From</label>'; 
     printf(
      '<input id="fisa-event-datefrom" type="text" name="_fisa_date_from" class="widefat" value="%s" />', 
      $from ? $from : '' 
     ); 
     echo ''; 
     echo '<br/><br/>'; 
     echo '<label for="_fisa_date_to">Date To</label>'; 
     printf(
      '<input id="fisa-event-dateto" type="text" name="_fisa_date_to" class="widefat" value="%s" />', 
      $to ? $to : '' 
     ); 
    } 

    public function save_post($post_id, $post_object) { // second parameter has useful info about current post 
     /* BRUTE FORCE debug */ 
     // wp_die(sprintf('<pre>%s</pre>', print_r($_POST, true))); 

     /** 
     * ADD SECURITY AND CONTENT CHECKS, omitted for brevity 
     */ 
     if(!empty($_POST['_fisa_date_from'])) { 
      $events_date = array(
           sanitize_text_field($_POST['_fisa_date_from']), 
           sanitize_text_field($_POST['_fisa_date_to']) 
          ); 
      update_post_meta($post_id, '_fisa_events_date', $events_date); 
     } 
    } 
} 
new MyEvents();