PHP Fatal error: Call to undefined function download_url()

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.

Read More

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

Related posts

Leave a Reply

3 comments

  1. 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.