Guardar meta de publicación personalizada, sin guardar los datos

9 minutos de lectura

avatar de usuario
james lopez

Creé un tipo de publicación personalizada con una fecha de metabox desde y hasta.

Creación de tipo de publicación personalizada con la función de devolución de llamada de 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');

aquí está la función de devolución de llamada que instancia una clase para crear el metabox y guardar los datos de la publicación a través del gancho de acción 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);
    }
}

mi problema es que no puedo ver _fisa_events_date meta clave en postmeta tabla de wordpress. ¿Alguien puede señalar lo que me he perdido o qué debo hacer para poder guardarlo?

  • ¿Ha podido ver el cuadro meta que se muestra cuando edita una publicación de este tipo?

    – Stiliyan

    18 de febrero de 2016 a las 1:49

  • @Stiliyan Sí. Lo veo. El único problema es que no guarda los datos. Es por eso que en mi publicación, hice una verificación de nonce como un comentario solo para intentar guardar los datos directamente.

    – jameshwart lópez

    18 de febrero de 2016 a las 2:53

  • @jameswartlopez ¿Es posible que no hayas registrado tus metaboxes con add_action('admin_init', 'add_events_metaboxes');? Puedo guardar con éxito _fisa_events_date con el resto de su código después de agregar esa declaración.

    – Stiliyan

    18 de febrero de 2016 a las 2:57

  • Puede agregarlo directamente debajo de su add_action('init', 'event_list_init') gancho. Pero recomiendo colocar todo el código postal personalizado en un solo archivo, por ejemplo events.phpy el add_action ganchos en la parte superior del archivo. Entonces, en tu functions.php puedes require_once('events.php'); Vea mi respuesta a continuación para obtener una idea detallada.

    – Stiliyan

    18 de febrero de 2016 a las 3:07


  • ¡@Stiliyan tiene razón! no debe usar register_meta_box_cs para guardar la publicación. admin init sería una opción mucho mejor y se usa con frecuencia para que las clases se inicien.

    – David

    21 de febrero de 2016 a las 22:56

avatar de usuario
Stiliyan

confías en register_meta_box_cb para mostrar su cuadro de metadatos y conectar la lógica de guardado en save_post. El problema es que WordPress se ejecuta register_meta_box_cb (que se engancha en add_meta_boxes) solo cuando es necesario mostrar los metaboxes, es decir, cuando se visitan las páginas de edición o adición de publicaciones. Pero cuando WordPress está guardando publicaciones, no necesita mostrar los metaboxes, por lo que register_meta_box_cb, add_events_metaboxesy tu save_post gancho nunca se llama.

La solución más sencilla es retirar su register_meta_box_cb argumento, y enganche su add_events_metaboxes función a la admin_init evento.

add_action('admin_init', 'add_events_metaboxes');

Puede hacer esto justo debajo de su add_action('init', 'event_list_init') gancho.

Encuentra una esencia aquí.

avatar de usuario
Pmpr.ir

Según WordPress documentación, register_meta_box_cb :

se llamará al configurar los cuadros meta para el formulario de edición.

Cual es demasiado tarde enganchar en el save_post.

Así que te sugiero que te conectes por separado al save_post en algún lugar de tu funciones.php expediente:

Registro de tipo de publicación

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

Renderizar el 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() {
        ...
    }
}

Guardando el 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);
}

Tenga en cuenta que WordPress no está diseñado para funcionar completamente orientado a objetos, por lo que puede haber problemas al usar su sistema de enganche con conceptos de programación orientada a objetos.

Como se expone en otras respuestas, el problema es que register_meta_box_cb la devolución de llamada solo se ocupará de lo siguiente:

Hacer remove_meta_box() y add_meta_box() llamadas en la devolución de llamada.

save_post no está cubierto en la devolución de llamada y tiene que ser independiente. Este gancho de acción sucede:

cada vez que se crea o actualiza una publicación o página, que puede ser desde una importación, un formulario de edición de publicación/página, xmlrpc o una publicación por correo electrónico

Como está utilizando una clase para envolver la creación del cuadro meta, le sugiero que envuelva todo lo que contiene.
PD: verifique los comentarios y agregue los controles necesarios dentro save_post llamar de vuelta.

<?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();

La solución más simple y flexible es usar campos personalizados avanzados.

¿Ha sido útil esta solución?