-
-
Save hissy/7352933 to your computer and use it in GitHub Desktop.
<?php | |
$file = '/path/to/file.png'; | |
$filename = basename($file); | |
$upload_file = wp_upload_bits($filename, null, file_get_contents($file)); | |
if (!$upload_file['error']) { | |
$wp_filetype = wp_check_filetype($filename, null ); | |
$attachment = array( | |
'post_mime_type' => $wp_filetype['type'], | |
'post_parent' => $parent_post_id, | |
'post_title' => preg_replace('/\.[^.]+$/', '', $filename), | |
'post_content' => '', | |
'post_status' => 'inherit' | |
); | |
$attachment_id = wp_insert_attachment( $attachment, $upload_file['file'], $parent_post_id ); | |
if (!is_wp_error($attachment_id)) { | |
require_once(ABSPATH . "wp-admin" . '/includes/image.php'); | |
$attachment_data = wp_generate_attachment_metadata( $attachment_id, $upload_file['file'] ); | |
wp_update_attachment_metadata( $attachment_id, $attachment_data ); | |
} | |
} |
It worked successfully! Thank you for this sample code!
Thanks for the snippet! Works great.
In case anyone gets the following order:
Fatal error: Call to undefined function wp_get_current_user()
Check out following post: https://stackoverflow.com/a/6127607
awesome stuff
Thanks man
Still works in 5.2, thanks for saving me a bunch of time! 👍
Hi guys,
I have a different case study.
I want to add a file to the media library without attaching it to any posts/pages.
That is, I do not want to use wp_insert_attachment() function.
Thanks
@oadekoya12 I think you can set the 'post_parent' => $parent_post_id,
to null or an empty string so the media becomes "unattached".
@kensington133,
Thanks, It works.
Using this code for MP3s. Works great!
Any ideas how to get the Post ID of the newly created media to add a featured image?
@thegreentimtam $attachment_id
is the newly created post id
Hey - been using this for a while and it works great.
However I have a new requirement where I just want to import images to Media Library, but NOT set as attachment to particular post.
Is that possible? All the functions here require a $parent_post_id
Sorry - just read the docs for wp_insert_attachment()
.. turns out you don't have to supply a parent id.
https://codex.wordpress.org/Function_Reference/wp_insert_attachment
Yup, you don't have to pass $parent_post_id
if you don't want to attach it
This works consistently as long as you're not waiting for the reply. I am using a rest endpoint to generate products from a remote source and using a method link this to create the images.
I have found if you have more than a few media sizes this can easily risk timing out the web-server if it has an anywhere near reasonable wait time.
A site I'm using has 28 different media sizes and we never manage to run the wp_generate_attachment_metadata and get a reply before the timeout is reached. Annoyingly our service then assumes failure and tries again, and again and again. Eventually crashing the server and leaving us with hundreds of duplicate images!
Just recording this here as its top of google for timeouts regarding the use of this function.
@srjwebster
I am in the same situation. No solution for multiple uploads.
@srjwebster
I am in the same situation. No solution for multiple uploads.
@fabriziofeitosa I found that by removing some unused media sizes, and by turning off image optimisation plugin wp smush I could run this n a much shorter timeframe. A few seconds compared to several minutes. Definitely not a solution, something asynchronous seems necessary to do this on a frequent basis.
Script is very good and its worked.
Thanks!!
Life Saver
Thanks a lot, your code is very good.
It's worked on WP 5.6!
Not working.
Fatal error: Call to undefined function wp_get_current_user() in /home/username/public_html/wp/wp-includes/capabilities.php on line 424
Run your code on init hook
If you receive the file via method POST like:
$file = (binary)
instead of absolute path like this:
$file = '/path/to/file.png';
You have to use $file['tmp_name']
when calling wp_upload_bits
wp_upload_bits($filename, null, file_get_contents($file['tmp_name']))
The rest of above code works great!
Thanks again.
wp_insert_attachment
has the option to return a WP Error instance on failure set to false by default, it will return a zero instead.
So the check for is_wp_error
will always return false unless you supply true
as a 4th argument.
wp_insert_attachment( $attachment, $upload_file['file'], $parent_post_id, true )
Worked great. Thanks!