Invia post e carica immagine dal front-end


11

Sto cercando di fare qualcosa di simile alla domanda sopra. Sto cercando di far pubblicare e caricare immagini dagli utenti front-end. Ho già fatto il modulo postale e il suo funzionamento.

Ho appena seguito e provato la risposta postata da Robin I Knight upload-post-thumbnail-from-the-front-end . Purtroppo non sono riuscito a farlo funzionare. C'è qualcosa che dovrei cambiare o modificare?

Grazie.

Risposte:


22

Se stai parlando della risposta che ho pubblicato qui è semplicemente il caricamento del file in un iframe per ottenere l'invio "Ajax like".

Ora se hai già un modulo che gestisce l'invio del post puoi semplicemente aggiungere il campo di caricamento del file da qualche parte nel tuo modulo:

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

assicurati che il tuo modulo abbia un enctype="multipart/form-data"attributo.

quindi nello script di elaborazione del modulo dopo aver creato il post (supponendo che si stia utilizzando wp_insert_post();) mantenere l'ID del post in un nuovo var:

$new_post = wp_insert_post($post_array);

e dopo aggiungere:

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

e la tua immagine verrà caricata e salvata come post anteprima.


Grazie @Bainternet. Stavo lottando per ottenerlo per inserire l'anteprima, ma per qualche ragione quando ho sostituito '$ new_post' con '$ pid' inserisce l'anteprima del post
Govnah Antwi-Boasiako

lool sono così stupido. Ho appena capito il motivo per cui ho dovuto usare '$ pid' e avevo questa riga$pid = wp_insert_post($new_post);
Govnah Antwi-Boasiako,

Sono contento che tu l'abbia risolto, e meglio è che hai capito il punto.
Bainternet,

Sì, grazie mille per il tuo aiuto. Ora che ho capito, è tempo di aggiungere un po 'di ajax :)
Govnah Antwi-Boasiako

1
Purtroppo ho un solo account in StackOverflow, quindi posso dare solo un voto a questa domanda. Risposta perfetta
Hemnath Mouli,

1

Markup 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);
  }

 ?>

Caricamento dell'immagine:

<?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;
}
?>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.