web-dev-qa-db-ja.com

プラグインなしでWordPressに何千もの画像をアップロードしますか?

更新:アップロードがそれほど遅い理由をデバッグした後、私は犯人がプラグインWP Smush Itであることを発見しました。以下の質問と答えはそれを見つけるプロセスです。

私が書いたカスタムのインポート機能を通して、何千もの画像のアップロードを処理しています。 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をリアルタイムで持っています

2

インポート時に、メソッドwp_update_attachment_metadatawp-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秒かかりました。

2