#43819 closed enhancement (invalid)
Improve performance of function "wp_update_attachment_metadata" in post.php
Reported by: | lucasbustamante | Owned by: | |
---|---|---|---|
Milestone: | Priority: | normal | |
Severity: | normal | Version: | 4.9.5 |
Component: | Upload | Keywords: | |
Focuses: | performance | Cc: |
Description
I had to import thousands of images to WordPress and it was taking an average of 5 seconds to upload each image, even though they were all on localhost, so WordPress only had to move it and register it in the database.
To speed up this process, I debugged each and every call made during a media upload, and found out the great guilty that, after a little tweak, made my media upload going from 5 seconds to 0.7 seconds.
What was slowing it down was add_filter('wp_update_attachment_metadata', $data, $post->ID)
inside function wp_update_attachment_metadata()
in post.php:
<?php /** * Update metadata for an attachment. * * @since 2.1.0 * * @param int $attachment_id Attachment post ID. * @param array $data Attachment meta data. * @return int|bool False if $post is invalid. */ function wp_update_attachment_metadata( $attachment_id, $data ) { $attachment_id = (int) $attachment_id; if ( ! $post = get_post( $attachment_id ) ) { return false; } /** * Filters the updated attachment meta data. * * @since 2.1.0 * * @param array $data Array of updated attachment meta data. * @param int $attachment_id Attachment post ID. */ if ( $data = apply_filters( 'wp_update_attachment_metadata', $data, $post->ID ) ) return update_post_meta( $post->ID, '_wp_attachment_metadata', $data ); else return delete_post_meta( $post->ID, '_wp_attachment_metadata' ); }
As I had to upload thousands of images, I modified it to this, just during the import:
<?php /** * Update metadata for an attachment. * * @since 2.1.0 * * @param int $attachment_id Attachment post ID. * @param array $data Attachment meta data. * @return int|bool False if $post is invalid. */ function wp_update_attachment_metadata( $attachment_id, $data ) { $attachment_id = (int) $attachment_id; if ( ! $post = get_post( $attachment_id ) ) { return false; } /** * Filters the updated attachment meta data. * * @since 2.1.0 * * @param array $data Array of updated attachment meta data. * @param int $attachment_id Attachment post ID. */ if (WP_DOING_IMPORT) { return update_post_meta( $post->ID, '_wp_attachment_metadata', $data ); } if ( $data = apply_filters( 'wp_update_attachment_metadata', $data, $post->ID ) ) return update_post_meta( $post->ID, '_wp_attachment_metadata', $data ); else return delete_post_meta( $post->ID, '_wp_attachment_metadata' ); }
Before the tweak:
'uploadtimedebug_start' => 0 seconds 'uploadtimedebug_after_requires' => 0.006 seconds 'uploadtimedebug_after_tmp_filled' => 0.597 seconds 'uploadtimedebug_before_media_handle_sideload' => 0.597 seconds 'uploadtimedebug_after_media_handle_sideload' => 5.370 seconds 'uploadtimedebug_finish' => 5.370 seconds
After the tweak:
'uploadtimedebug_inicio' => 0 seconds 'uploadtimedebug_after_requires' => 0.007 seconds 'uploadtimedebug_after_tmp_filled' => 0.620 seconds 'uploadtimedebug_before_media_handle_sideload' => 0.620 seconds 'uploadtimedebug_after_media_handle_sideload' => 0.723 seconds 'uploadtimedebug_finish' => 0.723 seconds
I wonder if we could improve this piece of code to be more performant?
Please ignore this ticket, it was the plugin "Smush it" that was slowing down the uploads.