Subida de archivos en metabox de WordPress para posts personalizados

2 jul 2014, 13:07:45
Vistas: 20K
Votos: 2

Soy relativamente nuevo en el desarrollo de WordPress y estoy atascado con este problema. He creado un tipo de contenido personalizado que aparece en el menú de administración. Necesito un metabox en él con un campo para subir archivos. El metabox aparece bien pero el archivo no se está guardando.

Estoy usando el siguiente código para ello. Cualquier ayuda sería muy apreciada.

//////////////////Mejores Prácticas///////////////

add_action( 'init', 'wpb_register_cpt_best_practices' );

function wpb_register_cpt_best_practices() {

    $labels = array(
        'name' => _x( 'Mejores Prácticas', 'mejores practicas' ),
        'singular_name' => _x( 'Mejor Práctica', 'mejor practica' ),
        'add_new' => _x( 'Añadir Nueva', 'mejor practica' ),
        'add_new_item' => _x( 'Añadir nueva mejor práctica', 'mejor practica' ),
        'edit_item' => _x( 'Editar mejor práctica', 'mejor practica' ),
        'new_item' => _x( 'Nueva mejor práctica', 'mejor practica' ),
        'view_item' => _x( 'Ver mejor práctica', 'mejor practica' ),
        'search_items' => _x( 'Buscar mejores prácticas', 'mejor practica' ),
        'not_found' => _x( 'No se encontraron mejores prácticas', 'mejor practica' ),
        'not_found_in_trash' => _x( 'No se encontraron mejores prácticas en la papelera', 'mejor practica' ),
        'parent_item_colon' => _x( 'Mejor práctica superior:', 'mejor practica' ),
        'menu_name' => _x( 'Mejores prácticas', 'mejor practica' ),
    );

    $args = array(
        'labels' => $labels,
        'hierarchical' => false,

        'supports' => array( 'title', 'editor',  'revisions' ),

        'public' => true,
        'show_ui' => true,
        'show_in_menu' => true,


        'show_in_nav_menus' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => false,
        'has_archive' => true,
        'query_var' => true,
        'can_export' => true,
        'rewrite' => true,
        'capability_type' => 'post'
    );

    register_post_type( 'best practice', $args );
}
$key_bp = "best practice";
$meta_boxes_bp = array(

    "document" => array(
        "name" => "document",
        "title" => "Documento de Mejores Prácticas",
        "description" => "Adjunte el documento de mejores prácticas.",
        "type" => "file")

);

function wpb_create_meta_box3() {
    global $key_bp;

    if( function_exists( 'add_meta_box' ) ) {
        add_meta_box( 'new-meta-boxes', ucfirst( $key_bp ) . ' Documento', 'display_meta_box3', 'best practice', 'normal', 'high' );
    }
}

function display_meta_box3() {
    global $post, $meta_boxes_bp, $key_bp;
    ?>

    <div class="form-wrap">

        <?php
        wp_nonce_field( plugin_basename( __FILE__ ), $key_bp . '_wpnonce', false, true );

        foreach($meta_boxes_bp as $meta_box) {
            $data = get_post_meta($post->ID, $key_bp, true);
            ?>

            <div class="form-field form-required">
                <label for="<?php echo $meta_box[ 'name' ]; ?>"><?php echo $meta_box[ 'title' ]; ?></label>
                <input type="file" name="<?php echo $meta_box[ 'name' ]; ?>" value="<?php echo (isset($data[ $meta_box[ 'name' ] ]) ? $data[ $meta_box[ 'name' ] ]  : ''); ?>" />
                <p><?php echo $meta_box[ 'description' ]; ?>
                    <?php //imprimir($data);
                    ?></p>
            </div>

        <?php } ?>

    </div>
<?php
}

function wpb_save_meta_box3( $post_id ) {
    global $post, $meta_boxes_bp, $key_bp;

    foreach( $meta_boxes_bp as $meta_box ) {
        if (isset($_POST[ $meta_box[ 'name' ] ])) {
            $data[ $meta_box[ 'name' ] ] = $_POST[ $meta_box[ 'name' ] ];
        }
    }

    if (!isset($_POST[ $key_bp . '_wpnonce' ]))
        return $post_id;

    if ( !wp_verify_nonce( $_POST[ $key_bp . '_wpnonce' ], plugin_basename(__FILE__) ) )
        return $post_id;

    if ( !current_user_can( 'edit_post', $post_id ))
        return $post_id;

    update_post_meta( $post_id, $key_bp, $data );
}

add_action( 'admin_menu', 'wpb_create_meta_box3' );
add_action( 'save_post', 'wpb_save_meta_box3' );
2
Comentarios

Por favor utiliza el buscador para comprobar si tu pregunta ya ha sido respondida anteriormente.

Nicolai Grossherr Nicolai Grossherr
2 jul 2014 13:13:21

No veo que estés manejando el archivo en absoluto, como con $_FILES y demás. Echa un vistazo a esta respuesta para eso. Podría ser en realidad el mejor candidato a duplicado.

Nicolai Grossherr Nicolai Grossherr
2 jul 2014 13:24:07
Todas las respuestas a la pregunta 1
5

Para subir archivos en metaboxes de WordPress en posts personalizados. Por favor consulta el siguiente enlace:

http://code.tutsplus.com/articles/attaching-files-to-your-posts-using-wordpress-custom-meta-boxes-part-1--wp-22291

O puedes usar los siguientes plugins:

https://wordpress.org/plugins/simple-fields/
http://www.advancedcustomfields.com/

Ambos plugins son los mejores para campos personalizados. También puedes crear campos repetibles.

2 jul 2014 13:21:59
Comentarios

Por favor, intenta asegurarte de que la respuesta en sí pueda resolver el problema. Las respuestas que consisten principalmente o únicamente en enlaces casi nunca son capaces de hacerlo. Es mejor agregar el código relevante y una explicación a la respuesta.

Nicolai Grossherr Nicolai Grossherr
2 jul 2014 13:29:26

Este tipo de respuestas son malas para el sitio. Por favor, mejora tus respuestas.

Pieter Goosen Pieter Goosen
2 jul 2014 13:50:19

Voto a favor. No hagas caso a aquellos que dicen que no deberías haber respondido tan mal. Tu respuesta nos ayudó ;) gracias

T.Todua T.Todua
4 abr 2020 14:18:53

bastante bien hasta que se pierde la página enlazada!

André Kelling André Kelling
8 abr 2022 14:56:55

No funcionó para mí, tuve que agregar enctype="multipart/form-data" al formulario edit.php usando la respuesta aceptada aquí: https://stackoverflow.com/questions/46409457/files-consistently-empty-in-wordpress-post-meta-upload-box

Chad Reitsma Chad Reitsma
26 jun 2023 02:40:28