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


11

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

Simplemente seguí y probé la respuesta publicada por Robin I Knight upload-post-thumbnail-from-the-front-end . Lamentablemente no pude hacerlo funcionar. ¿Hay algo que se supone que debo cambiar o editar?

Gracias.

Respuestas:


22

Si está hablando de la respuesta que publiqué aquí, simplemente está cargando el archivo en un iframe para lograr el envío "Me gusta Ajax".

Ahora, si ya tiene un formulario que maneja el envío de la publicación, simplemente puede agregar la entrada del campo del archivo de carga en algún lugar de su formulario:

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

asegúrese de que su formulario tenga enctype="multipart/form-data"atributo.

luego, en su secuencia de comandos de procesamiento de formularios, después de crear la publicación (suponiendo que esté usando wp_insert_post();) mantenga la ID de la publicación en una nueva var:

$new_post = wp_insert_post($post_array);

y después de eso agregue:

            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 "upload error : " . $_FILES[$file]['error'];
                    }
                    $attach_id = media_handle_upload( $file, $new_post );
                }   
            }
            if ($attach_id > 0){
                //and if you want to set that image as Post  then use:
                update_post_meta($new_post,'_thumbnail_id',$attach_id);
            }

y su imagen se cargará y guardará como miniatura de publicación.


Gracias @Bainternet. Estaba luchando para que insertara la miniatura, pero por alguna razón cuando reemplacé '$ new_post' por '$ pid' inserta la miniatura de la publicación
Govnah Antwi-Boasiako

Lool, soy tan estúpida. Acabo de saber por qué tuve que usar '$ pid', tenía esta línea$pid = wp_insert_post($new_post);
Govnah Antwi-Boasiako

Me alegra que lo hayas solucionado, y mejor es que entiendes el punto.
Bainternet

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

1
Desafortunadamente, solo tengo una cuenta en Stackoverflow, por lo que solo puedo dar un voto positivo a esta pregunta. Respuesta perfecta.
hemnath mouli

1

Marcado HTML:

 <p>
   <label for="custom-upload">Upload New Image:</label>
   <input type="file" tabindex="3" name="custom-upload" id="custom-upload" />
 </p>
 <?php
  /*Retrieving the image*/
  $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; /*Global post object*/
$post_id = $post->ID; /*Geting current post id*/
$upload = $_FILES['upload']; /*Receive the uploaded image from form*/
add_custom_image($post_id, $upload); /*Call image uploader function*/

function add_custom_image($post_id, $upload)
{
 $uploads = wp_upload_dir(); /*Get path of upload dir of wordpress*/

 if (is_writable($uploads['path']))  /*Check if upload dir is writable*/
 {
  if ((!empty($upload['tmp_name'])))  /*Check if uploaded image is not empty*/
  {
   if ($upload['tmp_name'])   /*Check if image has been uploaded in temp directory*/
   {
    $file=handle_image_upload($upload); /*Call our custom function to ACTUALLY upload the image*/

    $attachment = array  /*Create attachment for our post*/
    (
      'post_mime_type' => $file['type'],  /*Type of attachment*/
      'post_parent' => $post_id,  /*Post id*/
    );

    $aid = wp_insert_attachment($attachment, $file['file'], $post_id);  /*Insert post attachment and return the attachment id*/
    $a = wp_generate_attachment_metadata($aid, $file['file'] );  /*Generate metadata for new attacment*/
    $prev_img = get_post_meta($post_id, 'custom_image');  /*Get previously uploaded image*/
    if(is_array($prev_img))
    {
     if($prev_img[0] != '')  /*If image exists*/
     {
      wp_delete_attachment($prev_img[0]);  /*Delete previous image*/
     }
    }
    update_post_meta($post_id, 'custom_image', $aid);  /*Save the attachment id in meta data*/

    if ( !is_wp_error($aid) ) 
    {
     wp_update_attachment_metadata($aid, wp_generate_attachment_metadata($aid, $file['file'] ) );  /*If there is no error, update the metadata of the newly uploaded image*/
    }
   }
  }
  else
  {
   echo 'Please upload the image.';
  }
 }
}

function handle_image_upload($upload)
{
 global $post;

        if (file_is_displayable_image( $upload['tmp_name'] )) /*Check if image*/
        {
            /*handle the uploaded file*/
            $overrides = array('test_form' => false);
            $file=wp_handle_upload($upload, $overrides);
        }
 return $file;
}
?>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.