Obtenez $ image_id après le téléchargement avec media_sideload_image ()

10

Je souhaite télécharger une image et la définir en tant qu'image sélectionnée dans un message. Ce que j’ai essayé, c’est:

$image_id = media_sideload_image($image_url, $post_id, $post_id);
update_post_meta($post_id, '_thumbnail_id', $image_id);

Mais media_sideload_image() ne renvoie pas le image_id , mais l'image de rendu HTML. Comment puis-je obtenir le image_id ?

    
posée Xavin 21.03.2012 - 17:43

5 réponses

28

Voici un exemple de contournement de cette limitation à l'aide d'actions / hooks:

function new_attachment( $att_id ){
    // the post this was sideloaded into is the attachments parent!

    // fetch the attachment post
    $att = get_post( $att_id );

    // grab it's parent
    $post_id = $att->post_parent;

    // set the featured post
    set_post_thumbnail( $post_id, $att_id );
}

// add the function above to catch the attachments creation
add_action('add_attachment','new_attachment');

// load the attachment from the URL
media_sideload_image($image_url, $post_id, $post_id);

// we have the image now, and the function above will have fired too setting the thumbnail ID in the process, so lets remove the hook so we don't cause any more trouble 
remove_action('add_attachment','new_attachment');

L'idée est que lorsque media_sideload_image est exécuté, il:

  • télécharge l'image
  • l'ajoute en pièce jointe (une publication de type attachment )
  • joint ensuite cette pièce jointe à la publication dont vous avez fourni l'ID ($ post_id)

Votre problème est qu'il ne fournit pas l'ID de publication de pièce jointe nouvellement créé.

Toutefois, , lorsqu’une pièce jointe est créée, une action contenant son identifiant est déclenchée. Nous pouvons accéder à cette information avant de créer la pièce jointe, puis enregistrer la vignette en vedette avec l’ID de publication qu’elle nous a fourni, puis la décrocher ensuite.

    
réponse donnée Tom J Nowell 21.03.2012 - 17:56
6

J'ai créé une fonction pour obtenir l'ID de la base de données en effectuant une recherche par URL.

function get_attachment_id_from_src ($image_src) {
  global $wpdb;
  $query = "SELECT ID FROM {$wpdb->posts} WHERE guid='$image_src'";
  $id = $wpdb->get_var($query);
  return $id;
}

Vous pouvez obtenir une URL (instable du code HTML) avec un quatrième paramètre défini sur 'src' Codex: media_sideload_image ()

$src = media_sideload_image($url, $item_id, $desc,'src');
get_attachment_id_from_src($src);
    
réponse donnée yondemon 19.05.2016 - 14:02
4

@Tom J La réponse de Nowell est parfaite. J'ai trouvé une autre alternative (en utilisant des fonctions différentes) a expliqué ici mais j'aime bien celui-ci davantage.

Dans mon cas, j'ai un tableau de $ posts avec tous les articles que je veux insérer et un $ media séparé (même clé que le $ nid en tant que $ posts) avec le média. Mon code est la même solution que celle de Tom, mais il a été modifié pour utiliser une fonction anonyme:

foreach( $posts as $nid=>$post )
    $posts[$nid]['ID'] = wp_insert_post( $post );

foreach( $posts as $nid=>$post )
    foreach( $media[$nid] as $m=>$mitem ) {

        if( 0 == $m ) add_action( 'add_attachment',
            function( $att_id ) use ($posts, $nid, $mitem) {
                update_post_meta($posts[$nid]['ID'], '_thumbnail_id', $att_id);
                $posts[$nid]['media_urls'][] = $mitem['url'];
            }
        );
        media_sideload_image($mitem['url'], $post['ID']);
        remove_all_actions( 'add_attachment' );
    }

Dans mon cas, je suppose que le premier élément de chaque $ media [$ nid] shuold est l’image sélectionnée de son message.

WordPress devrait définitivement changer media_sideload_image () afin de renvoyer l'ID $. En fait, la fonction l’a sous la main, consultez la source ici . En fait, il existe un billet de piste pour cela et ils ont même des correctifs pour l’appliquer à votre coeur entre-temps si tu veux.

    
réponse donnée Jorge Orpinel 23.10.2014 - 01:48
4

Je recherchais une solution et j'ai décidé de regarder le code de media_sideload_image() , qui était très simple. Il utilise media_handle_sideload() qui nous donne la pièce jointe id .

Je l'ai modifié pour renvoyer la pièce jointe id au lieu de la source html de l'image, et j'ai même ajouté un moyen de lui envoyer un nouveau nom de fichier.

function media_sideload_image_custom($file, $post_id, $desc = null, $file_name = null)
{
    if ( ! empty($file) ) {
        // Download file to temp location
        $tmp = download_url( $file );

        // fix file filename for query strings
        if( empty($file_name) ) { 
            preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $file, $matches);
            $file_array['name'] = basename($matches[0]);
        } else {
            $file_array['name'] = sanitize_file_name($file_name);
        }
        $file_array['tmp_name'] = $tmp;

        // If error storing temporarily, unlink
        if ( is_wp_error( $tmp ) ) {
            @unlink($file_array['tmp_name']);
            $file_array['tmp_name'] = '';
        }

        // do the validation and storage stuff
        $id = media_handle_sideload( $file_array, $post_id, $desc );

        // If error storing permanently, unlink
        if ( is_wp_error($id) ) {
            @unlink($file_array['tmp_name']);
        }
        return $id;
    }
    return null;
}
    
réponse donnée Dario Zadro 20.05.2017 - 17:40
3

Les anciennes solutions ne sont plus nécessaires.

Vous pouvez obtenir l'ID avec un quatrième paramètre ($ return) défini sur "id"

<?php media_sideload_image($file, $post_id, $desc, $return); ?> 

enlace

    
réponse donnée olaf 01.11.2017 - 23:05

Lire d'autres questions sur les étiquettes