私が書いたカスタムのインポート機能を通して、何千もの画像のアップロードを処理しています。 JSONを受け取り、そこから投稿を作成して、JSONキーとして保存されている画像のURLを処理し、それらをWordPressにアップロードします。それはうまくいきますが、各画像をアップロードするのに約5秒かかります。
画像はローカルに保存されているので、WordPressはファイルを移動するだけでダウンロードはできません。
これが画像アップロード機能のタイミングです。
'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 // Guilty
'uploadtimedebug_finish' => 5.370 seconds
これがmedia_handle_sideload
の外観とそのパラメータです。
// Actually uploads the image
$id = media_handle_sideload( $file_array, $post_id, $desc);
これがmedia_handle_sideload
のパラメータです。
[
'file_array' => [
'name' => 'logo.png',
'tmp_name' => 'C:\\Users\\Lucas\\AppData\\Local\\Temp/logo-Rg0xrY.tmp'
],
'post_id' => 881,
'desc' => 'Logo',
];
media_handle_sideload
の中に入り、そのタイミングをデバッグするのです。
'timedebug_start' => 0 seconds
'timedebug_before_wp_handle_sideload' => 0.001 seconds
'timedebug_after_wp_handle_sideload' => 0.006 seconds
'timedebug_before_wp_read_image_metadata' => 0.006 seconds
'timedebug_after_wp_read_image_metadata' => 0.006 seconds
'timedebug_before_wp_insert_attachment' => 0.006 seconds
'timedebug_after_wp_insert_attachment' => 0.058 seconds
'timedebug_before_wp_update_attachment_metadata' => 0.058 seconds
'timedebug_after_wp_update_attachment_metadata' => 2.635 seconds // Guilty
'timedebug_finish' => 2.635 seconds
そのため、遅くなるのはwp_update_attachment_metadata
です。詳しく調べてみると、
'timedebug_start' => 0 seconds
'timedebug_after_get_post' => 0 seconds
'timedebug_before_apply_filters_wp_update_attachment_metadata' => 0 seconds
'timedebug_after_apply_filters_wp_update_attachment_metadata' => 3.082 seconds // Guilty
'timedebug_before_update_post_meta' => 3.082 seconds
'timedebug_after_update_post_meta' => 3.104 seconds
それで、大きな遅さはこれから来ています:
/**
* 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' );
add_filter('wp_update_attachment_metadata', $data, $post->ID)
がそれをさらにデバッグするために必要なものが見つかりませんでした。
リターンとしてリアルタイムで添付ファイルIDを取得しながら、WordPressに何千もの画像をアップロードする方法について何かアイデアがありますか?
PS:Add from Serverプラグインを見ましたが、特定のカスタムフィールドなどにIDで画像を割り当てなければならないので、必要なものを満たしていません。それらを処理し、それらのIDをリアルタイムで持っています
インポート時に、メソッドwp_update_attachment_metadata
をwp-includes/post.php
(5070行目)からこれに変更しました。
/**
* 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.
*/
return update_post_meta( $post->ID, '_wp_attachment_metadata', $data );
}
メディアアップロード前:
'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
メディアアップロード後:
'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
副作用はありません。すべてうまく機能します。ただし、これは一時的なハッキングであり、1000枚の画像のアップロードが完了したら、wp_update_attachment_metadata
を元のコード に戻します 。
犯人はwp_update_attachment_metadata
フィルタに夢中になったプラグイン「Smush It」でした。 Smush Itを無効にすると、フィルタは0秒かかりました。