• Resolved chcw

    (@chcw)


    Hi,

    I am using the following codes to add an image to the media library:

    function add_new_image_to_post(string $image_filename, int $parent_post_id)
    {
    	//	Create the new attachment post for the image
    
    	// Check the type of file. We'll use this as the 'post_mime_type'.
    	$filetype = wp_check_filetype(basename($image_filename), null);
    	output_debug_text(sprintf('File type of the image: %s.', $filetype['type']));
    
    	// Get the path to the upload directory.
    	$wp_upload_dir = wp_upload_dir();
    	output_debug_text(sprintf('Upload dir: %s.' . PHP_EOL, $wp_upload_dir['url']));
    	
    	// Prepare an array of post data for the attachment.
    	$attachment = array(
    		'guid'           => $wp_upload_dir['url'] . '/' . basename( $image_filename ), 
    		'post_mime_type' => $filetype['type'],
    		'post_title'     => '',
    		'post_content'   => '',
    		'post_status'    => 'inherit'
    	);
    	
    	// Insert the attachment.
    	$attach_id = wp_insert_attachment( $attachment, $image_filename, $parent_post_id );
    	
    	if ($attach_id)
    	{
    		output_debug_text(sprintf('Insert attachment successfully. Image file: %s. Parent post ID: %s. Attach ID: %s.' . PHP_EOL, $image_filename, $parent_post_id, $attach_id));
    
    		// Make sure that this file is included, as wp_generate_attachment_metadata() depends on it.
    		require_once( ABSPATH . 'wp-admin/includes/image.php' );
    		
    		// Generate the metadata for the attachment, and update the database record.
    		$attach_data = wp_generate_attachment_metadata( $attach_id, $image_filename );
    
    		if ($attach_data)
    		{
    			output_debug_text('Generate attachment meta data successfully: ' . print_r($attach_data, true) . PHP_EOL);
    			
    			$result = wp_update_attachment_metadata( $attach_id, $attach_data );
    
    			//	$result will be false, but the attachemnt is added successfully and all subimages are created
    			//	so we will ignore the case and always return $attach_id
    			//	Ref: https://www.ads-software.com/support/topic/wp_update_attachment_metadata-always-return-false/#post-17486245
    			$result = true;
    			
    			if ($result)
    			{
    				output_debug_text(sprintf('Set attachment metadata successfully.' . PHP_EOL));
    				return	$attach_id;
    			}	
    			else
    				output_debug_text(sprintf('Fail to set attachment metadata.\n'));	
    		}
    		else
    			output_debug_text(sprintf('Fail to generate attachment metdata.\n'));
    	}
    	else
    		output_debug_text(sprintf('Fail to insert image attachment.\n'));
    
    	return	0;
    } 
    

    I dump the $attach_data. Then under a Windows 10 + Wampserver64, wp_generate_attachment_metadata will generate images with different sizes, as below:

    Array
    (
        [width] => 1190
        [height] => 680
        [file] => C:/wamp64/www/blogs/wp-content/uploads/2024/03/test11.jpg
        [filesize] => 122205
        [sizes] => Array
            (
                [medium] => Array
                    (
                        [file] => test11-300x171.jpg
                        [width] => 300
                        [height] => 171
                        [mime-type] => image/jpeg
                        [filesize] => 14252
                    )
    
                [large] => Array
                    (
                        [file] => test11-1024x585.jpg
                        [width] => 1024
                        [height] => 585
                        [mime-type] => image/jpeg
                        [filesize] => 94116
                    )
    
                [thumbnail] => Array
                    (
                        [file] => test11-150x150.jpg
                        [width] => 150
                        [height] => 150
                        [mime-type] => image/jpeg
                        [filesize] => 7239
                    )
    
                [medium_large] => Array
                    (
                        [file] => test11-768x439.jpg
                        [width] => 768
                        [height] => 439
                        [mime-type] => image/jpeg
                        [filesize] => 59274
                    )
    
            )
    
        [image_meta] => Array
            (
                [aperture] => 0
                [credit] => 
                [camera] => 
                [caption] => 
                [created_timestamp] => 0
                [copyright] => 
                [focal_length] => 0
                [iso] => 0
                [shutter_speed] => 0
                [title] => 
                [orientation] => 0
                [keywords] => Array
                    (
                    )
    
            )
    
    )

    But in a CentOS 7 server(Linux), [filesize] is zero, and no sizes are generated:

    Array
    (
        [width] => 1190
        [height] => 680
        [file] => https://www.sample.com/blogs/wp-content/uploads/2024/03/outlook-pst-repair-2.jpg
        [filesize] => 0
        [sizes] => Array
            (
            )
    
    )

    I check the post for the image, it looks like this:

    https://pasteboard.co/FgoTtHcaWH3W.png

    It seems the meta data for the attachment is not generated successfully. But there is still an array returned. Why? How to diagnose the issue? I check https://developer.www.ads-software.com/reference/functions/wp_generate_attachment_metadata/ but cannot find how to obtain an error code if the function fails.

Viewing 4 replies - 1 through 4 (of 4 total)
  • Moderator bcworkz

    (@bcworkz)

    Hi chcw,
    Do normal WP uploads work OK on CentOS, it’s only your script that has issues?

    If the same process works in Wamp but not CentOS, I would suspect a server configuration issue more than a code or WP issue. For example, PHP doesn’t have write permission in the target subdirectory maybe?

    If you still think it could be a code or WP issue, first eliminate possible influence from themes or plugins. Test using a default Twenty* theme and all plugins deactivated except for your add image plugin (I’m assuming it’s now a plugin).

    AFAIK the generate meta data function silently fails on error. Regardless, if there is a PHP error, something should appear in the error log. Since this works on Wamp, I don’t think it’s a PHP issue. To narrow down the root cause, you’d need to do a detailed step by step debug of the function. In the WP source code (after making a backup of the file) add debugging code that outputs pertinent information at that point in the process. Verify important variables have the information they are supposed to have.

    Of course, a literal step by step debug is very tedious. You can optimize the process by checking data close to the suspected error point. If the data is unexpected, the problem is earlier. If all is well, the problem is later. Jump forward or backwards to the next suspected point. Repeat until you zero in to where the error actually occurs.

    Thread Starter chcw

    (@chcw)

    Hi, @bcworkz

    Nice to see you again. The normal upload in CentOS site is OK, and everyday there are several images uploaded, only my plugin has the issue. I try to disable Imagify plugin but the issue persists. I will try to test by disabling other plugins.

    For my case, when an array with no sizes are returned. Is there a function such as GetErrorCode in Windows that can return the error status of the function. As normally error code can provides some clues in helping debug the issues.

    I try the following but is_wp_error returns False:

    			if (is_wp_error($attach_data))
    				output_debug_text('Error in generating attachment meta data.' . PHP_EOL);
    Thread Starter chcw

    (@chcw)

    Hi, @bcworkz

    Good news. After enabling WP_DEBUG and WP_DEBUG_LOG, I finally find the reason:

    I pass a URL as the parameter to $image_filename, but it should be a local file path. After changing to local file path, then everything is OK.

    Thank you again for your great help!

    • This reply was modified 6 months, 4 weeks ago by chcw.
    Moderator bcworkz

    (@bcworkz)

    Ah yes, the old path vs. URL confusion. I cannot tell you how often I’ve made similar errors. I’m glad you resolved this!

Viewing 4 replies - 1 through 4 (of 4 total)
  • The topic ‘wp_generate_attachment_metadata does not generate images with different sizes’ is closed to new replies.