Hier ist die Rückruffunktion, die eine Klasse instanziiert, um die Metabox zu erstellen und Postdaten über den Aktionshaken zu speichern 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);
}
}
Mein Problem ist, ich kann nicht sehen _fisa_events_date Metaschlüssel eingeben postmeta Tabelle von WordPress. Kann jemand bitte darauf hinweisen, was ich verpasst habe oder was ich tun soll, um es speichern zu können?
Konntest du das Meta-Feld sehen, das angezeigt wird, wenn du einen Beitrag dieses Typs bearbeitest?
– Stiliyan
18. Februar 2016 um 1:49 Uhr
@ Stiliyan Ja. Ich sehe es. Das einzige Problem ist, dass die Daten nicht gespeichert werden. Deshalb habe ich in meinem Beitrag die Überprüfung von Nonce als Kommentar vorgenommen, nur um zu versuchen, die Daten direkt zu speichern.
– Jameshwart Lopez
18. Februar 2016 um 2:53 Uhr
@jameswartlopez Ist es möglich, dass Sie Ihre Metaboxen nicht bei registriert haben? add_action('admin_init', 'add_events_metaboxes');? Ich kann erfolgreich speichern _fisa_events_date mit dem Rest Ihres Codes, nachdem Sie diese Anweisung hinzugefügt haben.
– Stiliyan
18. Februar 2016 um 2:57 Uhr
Sie können es direkt unter Ihrer hinzufügen add_action('init', 'event_list_init') Haken. Ich empfehle jedoch, alle benutzerdefinierten Postleitzahlen in einer einzigen Datei zu platzieren, z events.phpund die add_action Haken ganz oben in der Datei. Dann in Ihrem functions.php du kannst require_once('events.php'); Siehe meine Antwort unten für einen detaillierten Kern.
– Stiliyan
18. Februar 2016 um 3:07 Uhr
@Stiliyan hat Recht! Sie sollten register_meta_box_cs nicht zum Speichern von Beiträgen verwenden. admin init wäre eine weitaus bessere Option und wird häufig für Klassen verwendet, auf denen init ausgeführt werden soll!
– David
21. Februar 2016 um 22:56 Uhr
Stiliyan
Sie verlassen sich auf register_meta_box_cb um Ihre Metabox anzuzeigen und Speicherlogik einzuhängen save_post. Das Problem ist, dass WordPress läuft register_meta_box_cb (was sich einklinkt add_meta_boxes) nur dann, wenn Metaboxen angezeigt werden müssen – dh wenn die Seiten zum Bearbeiten oder Hinzufügen von Beiträgen besucht werden. Aber wenn WordPress Beiträge speichert, müssen die Metaboxen nicht angezeigt werden register_meta_box_cb, add_events_metaboxesund dein save_post Hook wird nie aufgerufen.
Die einfachste Lösung ist Löschen dein register_meta_box_cb Argument, und haken Sie Ihr add_events_metaboxes Funktion zum admin_init Veranstaltung.
add_action('admin_init', 'add_events_metaboxes');
Sie können dies direkt unter Ihrem tun add_action('init', 'event_list_init') Haken.
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);
}
Bitte beachten Sie, dass WordPress nicht vollständig objektorientiert arbeiten soll, daher kann es zu Problemen bei der Verwendung kommen Hakensystem mit OOP-Konzepten.
Wie in anderen Antworten dargelegt, ist das Problem das register_meta_box_cb Der Rückruf behandelt nur Folgendes:
save_post wird im Callback nicht abgedeckt und muss unabhängig sein. Dieser Aktionshaken passiert:
jedes Mal, wenn ein Beitrag oder eine Seite erstellt oder aktualisiert wird, was aus einem Import, einem Beitrags-/Seitenbearbeitungsformular, xmlrpc oder einem Beitrag per E-Mail stammen kann
Da Sie eine Klasse verwenden, um die Meta-Box-Erstellung zu verpacken, würde ich vorschlagen, alles darin zu verpacken. PS: Überprüfen Sie die Kommentare und fügen Sie die erforderlichen Überprüfungen hinzu save_post zurückrufen.
<?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();
Die einfachste und flexibelste Lösung ist die Verwendung von erweiterten benutzerdefinierten Feldern.
13725700cookie-checkSpeichern Sie benutzerdefiniertes Post-Meta, ohne die Daten zu speichernyes
Konntest du das Meta-Feld sehen, das angezeigt wird, wenn du einen Beitrag dieses Typs bearbeitest?
– Stiliyan
18. Februar 2016 um 1:49 Uhr
@ Stiliyan Ja. Ich sehe es. Das einzige Problem ist, dass die Daten nicht gespeichert werden. Deshalb habe ich in meinem Beitrag die Überprüfung von Nonce als Kommentar vorgenommen, nur um zu versuchen, die Daten direkt zu speichern.
– Jameshwart Lopez
18. Februar 2016 um 2:53 Uhr
@jameswartlopez Ist es möglich, dass Sie Ihre Metaboxen nicht bei registriert haben?
add_action('admin_init', 'add_events_metaboxes');
? Ich kann erfolgreich speichern_fisa_events_date
mit dem Rest Ihres Codes, nachdem Sie diese Anweisung hinzugefügt haben.– Stiliyan
18. Februar 2016 um 2:57 Uhr
Sie können es direkt unter Ihrer hinzufügen
add_action('init', 'event_list_init')
Haken. Ich empfehle jedoch, alle benutzerdefinierten Postleitzahlen in einer einzigen Datei zu platzieren, zevents.php
und dieadd_action
Haken ganz oben in der Datei. Dann in Ihremfunctions.php
du kannstrequire_once('events.php');
Siehe meine Antwort unten für einen detaillierten Kern.– Stiliyan
18. Februar 2016 um 3:07 Uhr
@Stiliyan hat Recht! Sie sollten register_meta_box_cs nicht zum Speichern von Beiträgen verwenden. admin init wäre eine weitaus bessere Option und wird häufig für Klassen verwendet, auf denen init ausgeführt werden soll!
– David
21. Februar 2016 um 22:56 Uhr