Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I want to develop a script that:

  1. Gets an image from a post's content and removes it (it's hosted on another website)
  2. Uploads it in the uploads directory
  3. Adds it in the media library and
  4. Lastly returns the content with the image saved on server.

I can't make the third step.
The problem is with wp_insert_attachment, every time it's run inside a function called by add_filter, either apache returns "PHP Fatal error: Allowed memory size" (my php memory limit is 124MB) or the page keeps loading forever.

The same problem doesn't occur when wp_insert_attachment runs outside of a function called by add_filter. I cannot put it outside though because I want to feed it with the $image_path data received from download_image function.

I also tried calling a separate function that does step 3, run from inside of download_image function, with $image_path passed as a variable but the same problem occurred. Why that happens, any ideas on how to solve it?

add_filter('content_save_pre', 'download_image');

function download_image($content_save_pre) 
{
    preg_match( '/<img[^<]+>/i', $content_save_pre, $result ); // Find first image with tags
    $image_tags = $result[0]; // Save image with tags
    $content_save_pre = str_replace( $image_tags, '', $content_save_pre ); // Remove image with tags
    preg_match( '/http[^"]+/i', $result[0], $result ); // Find URL  
    $url_only = $result[0];  

    preg_match( '/[^\/]+$/i', $result[0], $result ); // Find filename
    $filename = $result[0];
    $uploads = wp_upload_dir(); // Find Upload dir path
    $uploads_path = $uploads['path'];
    $uploads_url = $uploads['url'];

    $image = file_get_contents( $url_only ); // Save image in uploads folder  
    file_put_contents( $uploads_path . '/' . $filename, $image );

    $image_url = $uploads_url . '/' . $filename; // URL of the image on the disk
    $image_path = $uploads_path . '/' . $filename; // Path of the image on the disk

    // Add image in the media library - Step 3

    $wp_filetype = wp_check_filetype( basename( $image_path ), null );
    $attachment = array(
       'post_mime_type' => $wp_filetype['type'],
       'post_title'     => preg_replace( '/\.[^.]+$/', '', basename( $image_path ) ),
       'post_content'   => '',
       'post_status'    => 'inherit'
    );

    $attach_id = wp_insert_attachment( $attachment, $image_path );  
    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    $attach_data = wp_generate_attachment_metadata( $attach_id, $image_path );
    wp_update_attachment_metadata( $attach_id, $attach_data );

    return '<img src="' . $image_url . '"/>' . $content_save_pre; // Return content with the image saved on server
}

Might that be a bug or something. Should I report it?

share|improve this question
add comment

closed as too localized by toscho Feb 3 '13 at 21:46

This question is unlikely to help any future visitors; it is only relevant to a small geographic area, a specific moment in time, or an extraordinarily narrow situation that is not generally applicable to the worldwide audience of the internet. For help making this question more broadly applicable, visit the help center.If this question can be reworded to fit the rules in the help center, please edit the question.

Browse other questions tagged or ask your own question.