wordpressimagewoocommerce

Upload multiple images to a Woocommerce product


I am trying to upload various images from an URL to a given woocommerce product. The issue I am facing with my code is that, although I see that the images are being uploaded to the server, when I go to see my post I only see the last image uploaded to the gallery.

Here is my code:

function generateSecondImage($image_url, $post_id)
{
    $upload_dir = wp_upload_dir();
    $image_data = file_get_contents($image_url);
    $filename = basename($image_url);
    if (wp_mkdir_p($upload_dir['path'])) {
        $file = $upload_dir['path'] . '/' . $filename;
    } else {
        $file = $upload_dir['basedir'] . '/' . $filename;
    }

    file_put_contents($file, $image_data);

    $wp_filetype = wp_check_filetype($filename, null);
    $attachment = array(
        'post_mime_type' => $wp_filetype['type'],
        'post_title' => sanitize_file_name($filename),
        'post_content' => '',
        'post_status' => 'inherit',
    );
    $attach_id = wp_insert_attachment($attachment, $file, $post_id);
    require_once ABSPATH . 'wp-admin/includes/image.php';
    $attach_data = wp_generate_attachment_metadata($attach_id, $file);
    $res1 = wp_update_attachment_metadata($attach_id, $attach_data);
    $res3 = update_post_meta($post_id, '_product_image_gallery', $attach_id);

}

And here is how I call the function

 for ($j=1; $j <$picCount ; $j++) { 
 generateSecondImage($pic[$j]->url, $post_id);
 }

I am thinking that maybe, res3 is overwriting the gallery and showing only the last image posted, but if that is the case, how would I tell wordpress to include all of the images in the for loop?


Solution

  • Finally managed to solve it!

    Here is my final code. My upload function goes like this:

    function generateSecondImage($image_url, $post_id)
    {
        $upload_dir = wp_upload_dir();
        $image_data = file_get_contents($image_url);
        $filename = basename($image_url);
        if (wp_mkdir_p($upload_dir['path'])) {
            $file = $upload_dir['path'] . '/' . $filename;
        } else {
            $file = $upload_dir['basedir'] . '/' . $filename;
        }
    
        file_put_contents($file, $image_data);
    
        $wp_filetype = wp_check_filetype($filename, null);
        $attachment = array(
            'post_mime_type' => $wp_filetype['type'],
            'post_title' => sanitize_file_name($filename),
            'post_content' => '',
            'post_status' => 'inherit',
        );
        $attach_id = wp_insert_attachment($attachment, $file, $post_id);
        require_once ABSPATH . 'wp-admin/includes/image.php';
        $attach_data = wp_generate_attachment_metadata($attach_id, $file);
        $res1 = wp_update_attachment_metadata($attach_id, $attach_data);
    
        echo "Attach ID is".$attach_id;
        return $attach_id;
    
    }
    

    And then I had to create a comma-separated list of the IDs and add it to the add_post_meta

    So my loop changed to this:

    for ($j=1; $j <$picCount ; $j++) { 
    $attarray[] = generateSecondImage($pic[$j]->url, $post_id);
    }
    
    $commaList = implode(', ', $attarray);
    $res3 = add_post_meta($post_id, '_product_image_gallery', $commaList);
    

    Hope this helps anyone else looking for a solution.