Enviar publicación y subir imagen desde el front-end

13 mar 2011, 15:51:50
Vistas: 49.3K
Votos: 12

Estoy tratando de hacer algo similar a la pregunta anterior. Intento permitir que los usuarios publiquen y suban imágenes desde el front-end. Ya he creado el formulario de publicación y está funcionando.

Seguí e intenté implementar la respuesta publicada por Robin I Knight subir-miniatura-de-publicacion-desde-el-front-end. Desafortunadamente no pude hacer que funcionara. ¿Hay algo que deba cambiar o editar?

Gracias.

0
Todas las respuestas a la pregunta 2
6
23

Si estás hablando de la respuesta que publiqué aquí, simplemente se trata de subir un archivo en un iframe para lograr un envío "similar a Ajax".

Ahora bien, si ya tienes un formulario que maneja el envío de publicaciones, puedes simplemente agregar el campo de carga de archivos en algún lugar de tu formulario:

<form ...
...
<input type="file" name="thumbnail" id="thumbnail">
...
...
</form>

Asegúrate de que tu formulario tenga el atributo enctype="multipart/form-data".

Luego, en tu script de procesamiento del formulario, después de crear la publicación (asumiendo que estás usando wp_insert_post();), guarda el ID de la publicación en una nueva variable:

$new_post = wp_insert_post($post_array);

Y después de eso agrega:

if (!function_exists('wp_generate_attachment_metadata')){
    require_once(ABSPATH . "wp-admin" . '/includes/image.php');
    require_once(ABSPATH . "wp-admin" . '/includes/file.php');
    require_once(ABSPATH . "wp-admin" . '/includes/media.php');
}
if ($_FILES) {
    foreach ($_FILES as $file => $array) {
        if ($_FILES[$file]['error'] !== UPLOAD_ERR_OK) {
            return "error en la carga: " . $_FILES[$file]['error'];
        }
        $attach_id = media_handle_upload( $file, $new_post );
    }   
}
if ($attach_id > 0){
    // y si quieres establecer esa imagen como imagen destacada de la publicación, usa:
    update_post_meta($new_post,'_thumbnail_id',$attach_id);
}

Y tu imagen será cargada y guardada como la imagen destacada de la publicación.

13 mar 2011 19:25:43
Comentarios

Gracias @Bainternet. Estaba teniendo problemas para que insertara la miniatura, pero por alguna razón cuando reemplacé '$new_post' con '$pid' se insertó la miniatura del post

Govnah Antwi-Boasiako Govnah Antwi-Boasiako
13 mar 2011 21:44:15

jajaja soy tan tonto. Acabo de darme cuenta de por qué tenía que usar '$pid'

tenía esta línea $pid = wp_insert_post($new_post);

Govnah Antwi-Boasiako Govnah Antwi-Boasiako
13 mar 2011 21:47:07

Me alegra que lo hayas resuelto, y mejor aún es que entendiste el punto.

Bainternet Bainternet
13 mar 2011 22:05:22

Sí, muchas gracias por tu ayuda. Ahora que lo entiendo, es hora de agregar algo de ajax :)

Govnah Antwi-Boasiako Govnah Antwi-Boasiako
14 mar 2011 00:35:15

@Bainternet♦ gracias por tu respuesta, es útil, pero ¿cómo hacer que funcione con múltiples imágenes? Cambié mi input a <input type="file" id="image" name="image[]" multiple="multiple" > pero no sube nada. -¿alguna ayuda por favor?

Ehab Fawzy Ehab Fawzy
11 mar 2012 13:41:48

Desafortunadamente solo tengo una cuenta en Stackoverflow así que solo puedo dar un voto positivo a esta pregunta. Respuesta perfecta.

hemnath mouli hemnath mouli
27 sept 2015 10:04:40
Mostrar los 1 comentarios restantes
0

HTML Markup:

 <p>
   <label for="custom-upload">Subir Nueva Imagen:</label>
   <input type="file" tabindex="3" name="custom-upload" id="custom-upload" />
 </p>
 <?php
  /*Recuperando la imagen*/
  $attachment = get_post_meta($postid, 'custom_image');

  if($attachment[0]!='')
  {
   echo wp_get_attachment_link($attachment[0], 'thumbnail', false, false);
  }

 ?>

Subiendo la imagen:

<?php
global $post; /*Objeto global de post*/
$post_id = $post->ID; /*Obteniendo el ID del post actual*/
$upload = $_FILES['upload']; /*Recibiendo la imagen subida desde el formulario*/
add_custom_image($post_id, $upload); /*Llamando a la función de subida de imagen*/

function add_custom_image($post_id, $upload)
{
 $uploads = wp_upload_dir(); /*Obteniendo la ruta del directorio de subidas de WordPress*/

 if (is_writable($uploads['path']))  /*Verificando si el directorio de subidas tiene permisos de escritura*/
 {
  if ((!empty($upload['tmp_name'])))  /*Verificando si la imagen subida no está vacía*/
  {
   if ($upload['tmp_name'])   /*Verificando si la imagen ha sido subida al directorio temporal*/
   {
    $file=handle_image_upload($upload); /*Llamando a nuestra función personalizada para SUBIR REALMENTE la imagen*/

    $attachment = array  /*Creando adjunto para nuestro post*/
    (
      'post_mime_type' => $file['type'],  /*Tipo de adjunto*/
      'post_parent' => $post_id,  /*ID del post*/
    );

    $aid = wp_insert_attachment($attachment, $file['file'], $post_id);  /*Insertando adjunto al post y retornando el ID del adjunto*/
    $a = wp_generate_attachment_metadata($aid, $file['file'] );  /*Generando metadatos para el nuevo adjunto*/
    $prev_img = get_post_meta($post_id, 'custom_image');  /*Obteniendo la imagen previamente subida*/
    if(is_array($prev_img))
    {
     if($prev_img[0] != '')  /*Si la imagen existe*/
     {
      wp_delete_attachment($prev_img[0]);  /*Eliminar imagen anterior*/
     }
    }
    update_post_meta($post_id, 'custom_image', $aid);  /*Guardando el ID del adjunto en los metadatos*/

    if ( !is_wp_error($aid) ) 
    {
     wp_update_attachment_metadata($aid, wp_generate_attachment_metadata($aid, $file['file'] ) );  /*Si no hay error, actualizar los metadatos de la imagen recién subida*/
    }
   }
  }
  else
  {
   echo 'Por favor sube la imagen.';
  }
 }
}

function handle_image_upload($upload)
{
 global $post;

        if (file_is_displayable_image( $upload['tmp_name'] )) /*Verificando si es una imagen*/
        {
            /*manejando el archivo subido*/
            $overrides = array('test_form' => false);
            $file=wp_handle_upload($upload, $overrides);
        }
 return $file;
}
?>
29 mar 2011 15:34:39