Je traite des milliers de téléchargements d'images via une fonction d'importation personnalisée que j'ai écrite. Il faut un JSON, créer une publication, puis traiter les URL des images stockées sous forme de clés JSON et les télécharger sur WordPress. Cela fonctionne bien, cependant, il faut environ 5 secondes pour télécharger chaque image.
Les images étant stockées localement, il suffit donc à WordPress de déplacer le fichier, pas de le télécharger.
Voici les timings pour la fonction de téléchargement d'image:
'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
Voici à quoi ressemble media_handle_sideload
et leurs paramètres:
// Actually uploads the image
$id = media_handle_sideload( $file_array, $post_id, $desc);
Voici les paramètres pour media_handle_sideload
:
[
'file_array' => [
'name' => 'logo.png',
'tmp_name' => 'C:\\Users\\Lucas\\AppData\\Local\\Temp/logo-Rg0xrY.tmp'
],
'post_id' => 881,
'desc' => 'Logo',
];
Pour entrer dans media_handle_sideload
et déboguer ses timings, voici ce qui suit:
'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
Donc, la lenteur vient de wp_update_attachment_metadata
. En creusant dedans, il y a ceci:
'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
Donc, la grande lenteur vient de ceci:
/**
* 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' );
Je ne pouvais pas trouver ce que add_filter('wp_update_attachment_metadata', $data, $post->ID)
appelle pour le déboguer plus avant.
Quelqu'un a-t-il une idée sur la façon de télécharger des milliers d'images sur WordPress, tout en obtenant leurs identifiants de pièces jointes en temps réel?
PS: J'ai vu Add depuis le plugin Server, mais cela ne correspond pas à ce dont j'avais besoin, car je dois attribuer les images par ID à des champs personnalisés spécifiques, etc., de sorte que je dois les traiter et avoir leurs identifiants. temps réél.
J'ai modifié la méthode wp_update_attachment_metadata
de wp-includes/post.php
(ligne 5070) en ceci, uniquement lors de l'importation:
/**
* 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 );
}
Téléchargement de média avant:
'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
Téléchargement de média après:
'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
Aucun effet secondaire, tout fonctionne très bien. Gardez toutefois à l'esprit que cela devrait être un hack temporaire. Lorsque vous avez terminé de télécharger vos milliers d'images, rétablissez wp_update_attachment_metadata
en son code code d'origine .
Le plug-in était le plugin "Smush It", connecté au filtre wp_update_attachment_metadata
. En désactivant Smush It, le filtre prenait zéro seconde.