5

First, Here is the full error:

PHP Fatal error: Call to undefined function download_url() in /path/to/wordpress/wp-admin/includes/media.php on line 562 

I have also posted the related functions at the bottom of my question.

I am modifying a script for my company's website which allows us to automate the retrieval and uploading of content from our content provider. Due to the way they organize their XML, I need to upload the images related to the articles separately from the main body of the articles. I tried using media_sideload_image() to do this, but I recieved the error:

The function (media_sideload_image()) which calls download_url and results in the error:

 PHP Fatal error: Call to undefined function download_url() in /path/to/wordpress/wp-admin/includes/media.php on line 562 

As can be seen, I successfully included media.php - and the rest of my script has already been implemented on to the site, and I have not run into any other issues with accessing Wordpress files. The error would appear to be with media.php itself - which I find unusual.

Any ideas on how I can resolve this problem? Alternatively, if you know of another function I can use to do this, that would also be appreciated.

By all means, if you require any more details on the issue just ask.

/** * Download an image from the specified URL and attach it to a post. * * @since 2.6.0 * * @param string $file The URL of the image to download * @param int $post_id The post ID the media is to be associated with * @param string $desc Optional. Description of the image * @return string|WP_Error Populated HTML img tag on success */ function media_sideload_image($file, $post_id, $desc = null) { if ( ! empty($file) ) { // Download file to temp location $tmp = download_url( $file ); // Set variables for storage // fix file filename for query strings preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $file, $matches); $file_array['name'] = basename($matches[0]); $file_array['tmp_name'] = $tmp; // If error storing temporarily, unlink if ( is_wp_error( $tmp ) ) { @unlink($file_array['tmp_name']); $file_array['tmp_name'] = ''; } // do the validation and storage stuff $id = media_handle_sideload( $file_array, $post_id, $desc ); // If error storing permanently, unlink if ( is_wp_error($id) ) { @unlink($file_array['tmp_name']); return $id; } $src = wp_get_attachment_url( $id ); } // Finally check to make sure the file has been saved, then return the html if ( ! empty($src) ) { $alt = isset($desc) ? esc_attr($desc) : ''; $html = "<img src='$src' alt='$alt' />"; return $html; } } 

The function where I call media_sideload_image() in my code:

//Upload the image if it exists, and return the post_id function upload_image($post_id, $image_url) { require_once('wp-admin/includes/media.php'); $image_url = 'http://admin.gkbusiness.com/gkbusiness/files/2011/04/LOGOGKMBUS1.jpg'; media_sideload_image($image_url, $post_id); return $post_id; } 

3 Answers 3

6

You have to include /path/to/wordpress/wp-admin/includes/file.php this file also, as the media.php uses the function download_url() from that file.

0
5

Hows this:

function attach_image_url($file, $post_id, $desc = null) { 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 ( ! empty($file) ) { // Download file to temp location $tmp = download_url( $file ); // Set variables for storage // fix file filename for query strings preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $file, $matches); $file_array['name'] = basename($matches[0]); $file_array['tmp_name'] = $tmp; // If error storing temporarily, unlink if ( is_wp_error( $tmp ) ) { @unlink($file_array['tmp_name']); $file_array['tmp_name'] = ''; } // do the validation and storage stuff $id = media_handle_sideload( $file_array, $post_id, $desc ); // If error storing permanently, unlink if ( is_wp_error($id) ) {@unlink($file_array['tmp_name']);} add_post_meta($post_id, '_thumbnail_id', $id, true); } } 
2

If you do not need a solution that is so fine-grained, or have problems with other functionality missing in you 'external' script, just include also the admin scripts.

So at the top of your 'external' script that should use WP functionality, include the wp-load for the frontend functionality and admin.php for the backend / admin functionalities:

require_once ('wp-load.php'); require_once ('wp-admin/includes/admin.php'); 

This assumes that your script is at the WP root level, if not you'll have to adapt the paths.

1
  • include(ABSPATH . "wp-admin/includes/admin.php"); saved a whole lot of cat and mouse versus tracking down all of the files required. Just wrap inside of an if (!is_admin()) block within your function and you're set. Commented May 9, 2017 at 6:08

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.