Ottenere $image_id dopo il caricamento con media_sideload_image()

21 mar 2012, 18:43:23
Visualizzazioni: 14.5K
Voti: 14

Voglio caricare un'immagine e impostarla come immagine in evidenza in un articolo. Quello che ho provato è questo:

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

Ma media_sideload_image() non restituisce l'image_id, bensì il codice HTML dell'immagine. Come posso ottenere l'image_id?

0
Tutte le risposte alla domanda 8
4
30

Ecco un esempio di come aggirare questa limitazione utilizzando azioni/hook:

function new_attachment( $att_id ){
    // il post in cui è stato caricato l'allegato è il genitore dell'allegato!

    // recupera il post dell'allegato
    $att = get_post( $att_id );

    // ottieni il suo genitore
    $post_id = $att->post_parent;

    // imposta l'immagine in evidenza
    set_post_thumbnail( $post_id, $att_id );
}

// aggiungi la funzione sopra per intercettare la creazione degli allegati
add_action('add_attachment','new_attachment');

// carica l'allegato dall'URL
media_sideload_image($image_url, $post_id, $post_id);

// ora abbiamo l'immagine e la funzione sopra avrà già impostato l'ID dell'immagine in evidenza, quindi rimuoviamo l'hook per evitare problemi
remove_action('add_attachment','new_attachment');

L'idea è che quando viene eseguito media_sideload_image, questo:

  • scarica l'immagine
  • la aggiunge come allegato (un post di tipo attachment)
  • quindi collega quell'allegato al post di cui hai fornito l'ID ($post_id)

Il tuo problema è che non restituisce l'ID del post dell'allegato appena creato.

Ma, quando viene creato un allegato, viene attivata un'azione che contiene il suo ID. Possiamo agganciarci a questa azione prima di creare l'allegato, salvare l'immagine in evidenza con l'ID del post che ci viene fornito, e poi scollegarci successivamente.

21 mar 2012 18:56:45
Commenti

Fantastico! È stato di grande aiuto.

MTT MTT
11 dic 2014 19:43:30

Se questa risposta ha risolto il tuo problema, potresti contrassegnarla come corretta?

Tom J Nowell Tom J Nowell
11 dic 2014 21:07:28

Non riesco a capire il tuo inglese. Qualcuno può modificare questo post?

HiDd3N HiDd3N
20 dic 2016 12:58:25

@HiDd3N Ho semplificato parte dell'inglese utilizzato, dovrebbe contenere parole più comuni con un livello di lettura più basso

Tom J Nowell Tom J Nowell
20 dic 2016 16:55:46
0
13

Non c'è più bisogno delle soluzioni vecchie.

Puoi ottenere l'ID usando un quarto parametro ($return) impostato a 'id'

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

https://codex.wordpress.org/Function_Reference/media_sideload_image

2 nov 2017 00:05:31
0

Ho creato una funzione per ottenere l'ID dal database, cercando tramite 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;
}

Puoi ottenere l'URL (invece del codice html) con un quarto parametro impostato su 'src' Codex: media_sideload_image()

$src = media_sideload_image($url, $item_id, $desc,'src');
get_attachment_id_from_src($src);
19 mag 2016 15:02:10
1

La risposta di @Tom J Nowell è perfetta. Ho trovato un'altra alternativa (utilizzando funzioni diverse) spiegata qui ma preferisco questa.

Nel mio caso ho un array di $posts con tutti gli articoli che voglio inserire e un array separato $media (con le stesse chiavi $nid di $posts) contenente i media. Il mio codice è la stessa soluzione di Tom ma rifattorizzata per utilizzare una funzione anonima:

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' );
    }

Nel mio caso assumo che il primo elemento in ogni $media[$nid] debba essere l'immagine in evidenza del relativo articolo.

WordPress dovrebbe decisamente modificare media_sideload_image() in modo che restituisca l'$id. In effetti la funzione ce l'ha a portata di mano, vedi il codice sorgente qui. Esiste persino un ticket di tracciamento per questo e hanno già delle patch da applicare al core nel frattempo se lo desideri.

23 ott 2014 02:48:40
Commenti

Sembra che sarà corretto nella versione 4.8

Tom Auger Tom Auger
9 mag 2017 23:03:33
0

Stavo cercando una soluzione e ho deciso di esaminare il codice di <a href="https://codex.wordpress.org/Function_Reference/media_sideload_image" rel="nofollow noreferrer">media_sideload_image()</a> che era molto semplice. Utilizza <a href="https://codex.wordpress.org/Function_Reference/media_handle_sideload" rel="nofollow noreferrer">media_handle_sideload()</a> che ci restituisce l'id dell'allegato.

L'ho modificato per restituire l'id dell'allegato invece del codice HTML dell'immagine, e ho anche aggiunto la possibilità di inviargli un nuovo nome file.

function media_sideload_image_custom($file, $post_id, $desc = null, $file_name = null)
{
    if ( ! empty($file) ) {
        // Scarica il file in una posizione temporanea
        $tmp = download_url( $file );

        // corregge il nome del file per le query string
        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;

        // Se si verifica un errore durante il salvataggio temporaneo, elimina il file
        if ( is_wp_error( $tmp ) ) {
            @unlink($file_array['tmp_name']);
            $file_array['tmp_name'] = '';
        }

        // esegue la validazione e il salvataggio
        $id = media_handle_sideload( $file_array, $post_id, $desc );

        // Se si verifica un errore durante il salvataggio permanente, elimina il file
        if ( is_wp_error($id) ) {
            @unlink($file_array['tmp_name']);
        }
        return $id;
    }
    return null;
}
20 mag 2017 18:40:52
0

Puoi utilizzare media_handle_sideload invece di media_sideload_image. Inoltre, se stai usando questa funzione in functions.php, non dimenticare di aggiungere le seguenti tre righe.

require_once(ABSPATH . 'wp-admin/includes/media.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');

$id = media_handle_sideload( $file_array, $post_id );
var_dump($id);
24 feb 2023 15:37:35
1

Ho esaminato la funzione, https://developer.wordpress.org/reference/functions/media_sideload_image/ -- ha un quarto argomento, "return_type" che specifica la risposta. Se vuoi ottenere l'ID, aggiungi il quarto argomento con 'id'

18 gen 2024 01:28:08
Commenti

Grazie! Sì, penso che la risposta di Olaf contenga quello

Rup Rup
22 gen 2024 12:24:57
1

In questo esempio, media_sideload_image() viene utilizzato per caricare l'immagine in sideload, mentre get_posts() viene utilizzato per interrogare il post allegato cercando un allegato con la meta chiave _wp_attached_file che corrisponde al nome del file dell'immagine

  // Scarica e allega l'immagine

    $attachment_id = media_sideload_image($image_url, $post_id);
    
    // Ottieni l'ID dell'allegato interrogando il post allegato
    $attachment = get_posts(array('post_type' => 'attachment', 'posts_per_page' => 1, 'post_status' => 'inherit', 'meta_query' => array(array('key' => '_wp_attached_file', 'value' => basename($image_url)))));
    if (!empty($attachment)) {
        $image_id = $attachment[0]->ID;
        
        // Ora hai l'$image_id
        echo "ID Immagine: $image_id";
    } else {
        echo "Impossibile recuperare l'ID dell'immagine.";
    }
18 gen 2024 08:36:26
Commenti

Ma media_sideload_image può restituire l'ID del post per te, come nella maggior parte delle altre risposte qui.

Rup Rup
19 gen 2024 12:18:42