Speichern Sie benutzerdefiniertes Post-Meta, ohne die Daten zu speichern

Lesezeit: 8 Minuten

Benutzer-Avatar
jameshwart lopez

Ich habe einen benutzerdefinierten Beitragstyp mit einem Metabox-Datum von und einem Datum bis erstellt.

Erstellung benutzerdefinierter Beitragstypen mit der Rückruffunktion 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, 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

Benutzer-Avatar
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.

Finden Sie einen Kern hier.

Benutzer-Avatar
Pmpr.ir

Laut WordPress Dokumentation, register_meta_box_cb :

wird beim Einrichten der Metaboxen für das Bearbeitungsformular aufgerufen.

Welches ist zu spät in die einhaken save_post.

Daher empfehle ich Ihnen, sich separat in die einzuklinken save_post irgendwo in deinem Funktionen.php Datei:

Beitragstyp registrieren

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

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

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:

Tun remove_meta_box() und add_meta_box() Anrufe im Rückruf.

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.

1372570cookie-checkSpeichern Sie benutzerdefiniertes Post-Meta, ohne die Daten zu speichern

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy