Subir imagen en un meta box sin usar el gestor de medios

29 abr 2011, 14:48:27
Vistas: 3.54K
Votos: 3

Estoy intentando implementar la subida de imágenes mediante un meta box sin usar el gestor de medios, pero quiero que se añadan como adjuntos al post.

Actualmente solo lo estoy haciendo subiendo y guardando en el servidor.

<?php

define("THUMB_DIR", WP_CONTENT_DIR . '/plugins/meta-upload/thumbs/'); 
define("THUMB_URL", WP_CONTENT_URL . '/plugins/meta-upload/thumbs/'); 

// esto necesita ser implementado

function fileupload( $label ) { ?>
<tr>
    <td class="left_label"> <?php
        echo $label; ?>
    </td>
    <td>
        <form name="uploadfile" id="uploadfile_form" method="POST" enctype="multipart/form-data" action="<?php echo $this->filepath.'#uploadfile'; ?>" accept-charset="utf-8" >
            <input type="file" name="uploadfiles[]" id="uploadfiles" size="35" class="uploadfiles" />
            <input class="button-primary" type="submit" name="uploadfile" id="uploadfile_btn" value="Subir"  />
        </form>
    </td>
</tr>  
 <?php
}

//esto también necesita ser añadido

function fileupload_process() { 
$uploadfiles = $_FILES['uploadfiles'];

if (is_array($uploadfiles)) {

    foreach ($uploadfiles['name'] as $key => $value) {

        // buscar solo archivos subidos
        if ($uploadfiles['error'][$key] == 0) {

            $filetmp = $uploadfiles['tmp_name'][$key];

            // limpiar nombre de archivo y extraer extensión
            $filename = $uploadfiles['name'][$key];

            // obtener información del archivo
            // @fixme: wp verifica la extensión del archivo....
            $filetype = wp_check_filetype( basename( $filename ), null );
            $filetitle = preg_replace('/\.[^.]+$/', '', basename( $filename ) );
            $filename = $filetitle . '.' . $filetype['ext'];
            $upload_dir = wp_upload_dir();

            /**
             * Verificar si el nombre de archivo ya existe en el directorio y renombrar
             * el archivo si es necesario
             */
            $i = 0;
            while ( file_exists( $upload_dir['path'] .'/' . $filename ) ) {
                $filename = $filetitle . '_' . $i . '.' . $filetype['ext'];
                $i++;
            }
            $filedest = $upload_dir['path'] . '/' . $filename;

            /**
             * Verificar permisos de escritura
             */
            if ( !is_writeable( $upload_dir['path'] ) ) {
                $this->msg_e('No se puede escribir en el directorio %s. ¿Tiene permisos de escritura?');
                return;
            }

            /**
             * Guardar archivo temporal en directorio de subidas
             */
            if ( !@move_uploaded_file($filetmp, $filedest) ){
                $this->msg_e("Error, el archivo $filetmp no pudo ser movido a: $filedest ");
                continue;
            }

            $attachment = array(
                'post_mime_type' => $filetype['type'],
                'post_title' => $filetitle,
                'post_content' => '',
                'post_status' => 'inherit'
            );

            $attach_id = wp_insert_attachment( $attachment, $filedest );
            require_once( ABSPATH . "wp-admin" . '/includes/image.php' );
            $attach_data = wp_generate_attachment_metadata( $attach_id, $filedest );
            wp_update_attachment_metadata( $attach_id,  $attach_data );
        }
    }
}
}

add_action('admin_menu', "post_upload_box_init");
add_action('save_post', 'post_save_thumb');

function post_upload_box_init() {
    add_meta_box("post-thumbnail-posting", "Miniatura Dark Toob", "post_upload_thumbnail", "post", "advanced");

}

function post_upload_thumbnail() {
    global $post;
?>
<script type="text/javascript">
    document.getElementById("post").setAttribute("enctype","multipart/form-data");
    document.getElementById('post').setAttribute('encoding','multipart/form-data');
</script>

<?php
    $thumb = get_post_meta($post->ID, 'custom_thumbnail',true);

    if ( $thumb )
    {
?>
<div style="float: left; margin-right: 10px;">
    <img style="border: 1px solid #ccc; padding: 3px;" src="<?php echo THUMB_URL . $thumb; ?>" alt="Vista previa de miniatura" title="Vista previa de miniatura" />
</div>
<?php
    }
    else
    {
?>
<div style="float: left; margin-right: 10px; width: 200px; height: 150px; line-height: 150px; border: solid 1px #ccc; text-align: center;">Vista previa de miniatura</div>
<?php } ?>

<div style="float: left;">
    <p>
        <label for="thumb-url-upload"><?php _e("Subir mediante URL, o Seleccionar Imagen (Abajo)"); ?>:</label><br />
        <input style="width: 300px; margin-top:5px;" id="thumb-url-upload" name="thumb-url-upload" type="text" />
    </p>    
    <p>
        <p><label for="thumbnail"><?php _e("Subir una miniatura"); ?>:</label><br />
        <input id="thumbnail" type="file" name="thumbnail" />
    </p>
    <p><input id="thumb-delete" type="checkbox" name="thumb-delete"> <label for="thumb-delete"><?php _e("Eliminar miniatura"); ?></label></p>

    <p style="margin:10px 0 0 0;"><input id="publish" class="button-primary" type="submit" value="<?php _e("Actualizar Post"); ?>" accesskey="p" tabindex="5" name="save"/></p>
</div>

<div class="clear"></div>
<?php
}

function post_save_thumb( $postID )
{
global $wpdb;

// Obtener el ID correcto del post si es revisión.
if ( $wpdb->get_var("SELECT post_type FROM $wpdb->posts WHERE ID=$postID")=='revision')
    $postID = $wpdb->get_var("SELECT post_parent FROM $wpdb->posts WHERE ID=$postID");

if ( $_POST['thumb-delete'] )
{
    @unlink(THUMB_DIR . get_post_meta($postID, 'custom_thumbnail', true));
    delete_post_meta($postID, 'custom_thumbnail');
}
elseif ( $_POST['thumb-url-upload'] || !empty($_FILES['thumbnail']['tmp_name']) )
{
    if ( !empty($_FILES['thumbnail']['name']) )
        preg_match("/(\.(?:jpg|jpeg|png|gif))$/i", $_FILES['thumbnail']['name'], $matches);
    else
        preg_match("/(\.(?:jpg|jpeg|png|gif))$/i", $_POST['thumb-url-upload'], $matches);

    $thumbFileName = $postID . strtolower($matches[0]);

    // Ubicación de la miniatura en el servidor.
    $loc = THUMB_DIR . $thumbFileName;

    $thumbUploaded = false;

    if ( $_POST['thumb-url-upload'] )
    {
        // Intentar usar fopen para descargar la imagen.
        if( ini_get('allow_url_fopen') )
        {
            copy($_POST['thumb-url-upload'], $loc);
            $thumbUploaded = true;

        }
        else

        // Si fopen no funciona, intentar con cURL.
        if( function_exists('curl_init') )
        {
            $ch = curl_init($_POST['thumb-url-upload']);
            $fp = fopen($loc, "wb");

            $options = array(CURLOPT_FILE => $fp,
                CURLOPT_HEADER => 0,
                CURLOPT_FOLLOWLOCATION => 1,
                CURLOPT_TIMEOUT => 60);
            curl_setopt_array($ch, $options);

            curl_exec($ch);
            curl_close($ch);

            fclose($fp);
            $thumbUploaded = true;
        }
    }
    else

    // Intentar mover la miniatura subida al directorio de miniaturas.
    if ( !empty($_FILES['thumbnail']['tmp_name']) && move_uploaded_file($_FILES['thumbnail']['tmp_name'], $loc) )
        $thumbUploaded = true;

    if ( $thumbUploaded )
    {
        if ( !update_post_meta($postID, 'custom_thumbnail', $thumbFileName) )
            add_post_meta($postID, 'custom_thumbnail', $thumbFileName);
    }

}
}
1
Comentarios

¿Alguna solución? Por favor marca algo como resuelto o añade tu propia respuesta y marca esta como solución.

kaiser kaiser
24 oct 2011 12:58:28
Todas las respuestas a la pregunta 1
2

Quizás quieras echar un vistazo al plugin de Steve Taylor y su enfoque aquí

Dominik "ocean90" Schilling - el autor de la (nueva en 3.5) biblioteca de medios, tiene un repositorio en GitHub donde muestra algunas demostraciones.

En resumen, puede que no puedas implementar un cargador de medios con estilo arrastrar y soltar en una meta box con sus tutoriales, pero debería ser posible... de alguna manera.

29 abr 2011 14:55:20
Comentarios

El plugin está discontinuado. Buscando una dirección personalizada como respuesta en lugar de un enlace. :)

Mayeenul Islam Mayeenul Islam
4 jul 2013 07:31:15

@MayeenulIslam Agregué otro enlace. Como intenté implementar y extender algunas funcionalidades de la biblioteca de medios hace algunas semanas, no puedo publicar más ya que simplemente no lo sé y me tomaría algunas horas resolverlo. :)

kaiser kaiser
4 jul 2013 09:38:00