web-dev-qa-db-fra.com

Télécharger des milliers d'images sur WordPress sans plugin?

Mise à jour: Après le débogage, pourquoi les téléchargements étaient si lents, j'ai découvert que le plug-in était le plugin WP Smush It. La question et la réponse ci-dessous sont le processus pour le découvrir.

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.

Quoi qu'il en soit.

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.

2
Lucas Bustamante

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 .

Edit - S'il vous plaît ignorer tout ce que j'ai dit.

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.

2
Lucas Bustamante