Skip to content

Instantly share code, notes, and snippets.

@joshuadavidnelson
Last active November 7, 2023 05:04
Show Gist options
  • Save joshuadavidnelson/164a0a0744f0693d5746 to your computer and use it in GitHub Desktop.
Save joshuadavidnelson/164a0a0744f0693d5746 to your computer and use it in GitHub Desktop.
Programmatically create the image attachment and return the new media upload id.
<?php
/**
* Create the image attachment and return the new media upload id.
*
* @author Joshua David Nelson, josh@joshuadnelson.com
*
* @since 03.29.2017 updated to a class, utilizing code from Takuro Hishikawa's gist linked below.
*
* @see https://gist.github.com/hissy/7352933
*
* @see http://codex.wordpress.org/Function_Reference/wp_insert_attachment#Example
*
* @link https://joshuadnelson.com/programmatically-add-images-to-media-library/
*/
class JDN_Create_Media_File {
var $post_id;
var $image_url;
var $wp_upload_url;
var $attachment_id;
/**
* Setup the class variables
*/
public function __construct( $image_url, $post_id = 0 ) {
// Setup class variables
$this->image_url = esc_url( $image_url );
$this->post_id = absint( $post_id );
$this->wp_upload_url = $this->get_wp_upload_url();
$this->attachment_id = $this->attachment_id ?: false;
return $this->create_image_id();
}
/**
* Set the upload directory
*/
private function get_wp_upload_url() {
$wp_upload_dir = wp_upload_dir();
return isset( $wp_upload_dir['url'] ) ? $wp_upload_dir['url'] : false;
}
/**
* Create the image and return the new media upload id.
*
* @see https://gist.github.com/hissy/7352933
*
* @see http://codex.wordpress.org/Function_Reference/wp_insert_attachment#Example
*/
public function create_image_id() {
if( $this->attachment_id )
return $this->attachment_id;
if( empty( $this->image_url ) || empty( $this->wp_upload_url ) )
return false;
$filename = basename( $this->image_url );
$upload_file = wp_upload_bits( $filename, null, file_get_contents( $this->image_url ) );
if ( ! $upload_file['error'] ) {
$wp_filetype = wp_check_filetype( $filename, null );
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_parent' => $this->post_id,
'post_title' => preg_replace('/\.[^.]+$/', '', $filename),
'post_content' => '',
'post_status' => 'inherit'
);
$attachment_id = wp_insert_attachment( $attachment, $upload_file['file'], $this->post_id );
if( ! is_wp_error( $attachment_id ) ) {
require_once( ABSPATH . "wp-admin" . '/includes/image.php' );
require_once( ABSPATH . 'wp-admin/includes/media.php' );
$attachment_data = wp_generate_attachment_metadata( $attachment_id, $upload_file['file'] );
wp_update_attachment_metadata( $attachment_id, $attachment_data );
$this->attachment_id = $attachment_id;
return $attachment_id;
}
}
return false;
} // end function get_image_id
}
// Example Usage
// Add an unattached image to the media library
$image_url = 'http://someimageurl';
$create_image = new JDN_Create_Media_File( $image_url );
$image_id = $create_image->attachment_id;
// Add image and attach to a post
$post_id = '3'; // the id of the post
$create_image = new JDN_Create_Media_File( $image_url, $post_id );
$image_id = $create_image->attachment_id;
@wpfangirl
Copy link

Thanks so much for creating this! It allowed me to solve a problem I'd been working on for a while: using an upload field that was not the post image field to set the featured image for a post created by Gravity Forms. Code here: https://gist.github.com/wpfangirl/5df51d2f5b0aa2256c84b4f48651ae4d#file-functions-php

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment