How to add media from front-end to an existing post?

Golden Apples Design created (as far as I know) the media upload function that many people on WP.A and elsewhere seem to recommend. But all of the Q&As I can find on StackExchange deal with creating an entirely new post.

What is the best way to get this (or another snippet) to upload media from the front-end, attach it to the current post, generate the appropriate thumbnails, and then refresh the page showing the new image in the ?

Read More

Here is Than’s code:
In functions file…

function insert_attachment($file_handler,$post_id,$setthumb='false') {

  // check to make sure its a successful upload
  if ($_FILES[$file_handler]['error'] !== UPLOAD_ERR_OK) __return_false();

  require_once(ABSPATH . "wp-admin" . '/includes/image.php');
  require_once(ABSPATH . "wp-admin" . '/includes/file.php');
  require_once(ABSPATH . "wp-admin" . '/includes/media.php');

  $attach_id = media_handle_upload( $file_handler, $post_id );

  if ($setthumb) update_post_meta($post_id,'_thumbnail_id',$attach_id);
  return $attach_id;

In page template header…

// set $post_id to the id of the post you want to attach
// these uploads to (or 'null' to just handle the uploads
// without attaching to a post)

if ($_FILES) {
  foreach ($_FILES as $file => $array) {
    $newupload = insert_attachment($file,$post_id);
    // $newupload returns the attachment id of the file that
    // was just uploaded. Do whatever you want with that now.
  }
}

Upload form used…

<form method="post" action="#" enctype="multipart/form-data" >
  <input type="file" name="an_uploaded_attachment">
  <input type="file" name="another_uploaded_attachment">
  <input type="file" name="yet_another_uploaded_attachment">
  <input type="submit">
<form>

Related posts

Leave a Reply

2 comments

  1. @AboSami actually answered this question in an older post that was not showing up in my search diligence. While he was actually looking for something else his example code worked great.

    Here’s the script:

    <?php $post_id = $post->ID;
    if ( isset( $_POST['html-upload'] ) && !empty( $_FILES ) ) {
        require_once(ABSPATH . 'wp-admin/includes/admin.php');
        $id = media_handle_upload('async-upload', $post_id); //post id of Client Files page
        unset($_FILES);
        if ( is_wp_error($id) ) {
            $errors['upload_error'] = $id;
            $id = false;
        }
    
        if ($errors) {
            echo "<p>There was an error uploading your file.</p>";
        } else {
            echo "<p>Your file has been uploaded.</p>";
        }
    }
    
    ?>
        <form id="file-form" enctype="multipart/form-data" action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="POST">
    
        <p id="async-upload-wrap"><label for="async-upload">upload</label>
        <input type="file" id="async-upload" name="async-upload"> <input type="submit" value="Upload" name="html-upload"></p>
    
        <p><input type="hidden" name="post_id" id="post_id" value="<?php echo $post_id ?>" />
        <?php wp_nonce_field('client-file-upload'); ?>
        <input type="hidden" name="redirect_to" value="<?php echo $_SERVER['REQUEST_URI']; ?>" /></p>
    
        <p><input type="submit" value="Save all changes" name="save" style="display: none;"></p>
        </form>
    
  2. In your header change $post_id to $post->ID.

    // set $post_id to the id of the post you want to attach
    // these uploads to (or 'null' to just handle the uploads
    // without attaching to a post)
    
    if ($_FILES) {
      foreach ($_FILES as $file => $array) {
        $newupload = insert_attachment($file,$post->ID);
        // $newupload returns the attachment id of the file that
        // was just uploaded. Do whatever you want with that now.
      }
    }