Come posso impostare un'immagine in primo piano (miniatura) per URL immagine quando utilizzo wp_insert_post ()?


61

Guardando attraverso la voce di riferimento della funzione per wp_insert_post () , ho notato che non ci sono parametri nell'array che richiede che mi permetta di impostare "Immagine in primo piano" per un post, visualizzato come miniatura del post nel mio tema.

Ho esaminato funzioni come set_post_thumbnail () , come suggerito da Mr. Bennett, ma questa sembra essere un'aggiunta relativamente nuova a WordPress stesso e al codice WordPress. Come tale, non ci sono fonti che posso trovare che spieghino come acquisire e fornire il parametro $ thumbnail_id. Se questa è davvero la funzione da usare, in che modo posso fornirle un parametro $ thumbnail_id valido quando tutto quello che ho è un URL di immagine?

Grazie in anticipo!

Risposte:


107

È possibile impostare un'immagine come miniatura del post quando si trova nella libreria multimediale. Per aggiungere un'immagine nella tua libreria multimediale devi caricarla sul tuo server. WordPress ha già una funzione per mettere le immagini nella tua libreria multimediale, hai solo bisogno di uno script che carica il tuo file.

Uso:

Generate_Featured_Image( '../wp-content/my_image.jpg', $post_id );

// $post_id is Numeric ID... You can also get the ID with:
wp_insert_post()

Funzione:

function Generate_Featured_Image( $image_url, $post_id  ){
    $upload_dir = wp_upload_dir();
    $image_data = file_get_contents($image_url);
    $filename = basename($image_url);
    if(wp_mkdir_p($upload_dir['path']))
      $file = $upload_dir['path'] . '/' . $filename;
    else
      $file = $upload_dir['basedir'] . '/' . $filename;
    file_put_contents($file, $image_data);

    $wp_filetype = wp_check_filetype($filename, null );
    $attachment = array(
        'post_mime_type' => $wp_filetype['type'],
        'post_title' => sanitize_file_name($filename),
        'post_content' => '',
        'post_status' => 'inherit'
    );
    $attach_id = wp_insert_attachment( $attachment, $file, $post_id );
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
    $res1= wp_update_attachment_metadata( $attach_id, $attach_data );
    $res2= set_post_thumbnail( $post_id, $attach_id );
}

http://codex.wordpress.org/Function_Reference/wp_upload_dir

http://codex.wordpress.org/Function_Reference/wp_insert_attachment


EDIT: aggiunta la creazione del percorso

http://codex.wordpress.org/Function_Reference/wp_mkdir_p


Grazie per i tuoi sforzi! Funziona solo quando si utilizza $ upload_dir ['basedir'] (anziché percorso), perché quando ispeziono l'allegato attraverso l'interfaccia di post modifica viene indicato come ... / uploads / FILENAME.EXT mentre $ upload_dir ['percorso' ] lo memorizzerebbe in qualcosa come ... / uploads / 2012/02 / FILENAME.EXT. Potrebbe essere ancora meglio cambiare in qualche modo il modo in cui il file viene referenziato, ma non saprei come.
Chris,

1
Aggiunta la creazione del percorso nella mia risposta.
Rob Vermeer,

Apprezzo la tua risposta rapida :). Ottengo comunque lo stesso risultato, ecco uno screenshot che mostra il mio problema: i.imgur.com/iKTNs.png . La sezione superiore è il risultato di inserire un'eco nel tuo condizionale, solo per vedere cosa sta succedendo.
Chris,

Modificato di nuovo, non ha superato il percorso completo di wp_insert_attachment e wp_generate_attachment_metadata. Spero che questo risolva il problema.
Rob Vermeer,

1
Attenzione: questa risposta riscrive il file se ha lo stesso nome, attenzione. Dovrebbe generare nomi usando $ post_id o almeno uniqid ()
Ivan Castellanos

10

Prova a usare set_post_thumbnail().

Modifica di Otto: hai chiarito la tua domanda, quindi chiarirò la risposta che Chip ha dato.

Fondamentalmente, devi creare un 'allegato' anche per il post. Quando un'immagine viene caricata nella libreria multimediale di WordPress, viene creata una voce di post speciale con un tipo di post di allegato. Questo allegato è collegato ad alcuni post specifici tramite l'identificatore post_parent.

Quindi, se conosci l'ID dell'allegato, quindi chiamando set_post_thumbnail con l'oggetto o ID post e l'ID allegato imposterà semplicemente il flag dell'anteprima post.

Se non hai ancora creato l'allegato, dovrai prima farlo. Il modo più semplice per farlo è con wp_insert_attachment(). Questa funzione accetta una matrice di alcuni parametri, il nome file (il file deve essere già nella directory di upload corretta) e l'ID post del post principale a cui si desidera allegare l'allegato.

Solo avere un file caricato e allegato a un post non fa nulla automaticamente. Questa è semplicemente una sorta di meccanismo di categorizzazione. Il meccanismo della galleria, ad esempio, utilizza le immagini allegate di un post per creare la [galleria] per quel post. Una miniatura per un post è solo una delle immagini allegate che è stata impostata come miniatura.

Maggiori informazioni su come utilizzare wp_insert_attachment sono disponibili nel codice (link sopra).


Grazie per la risposta! Come recuperare l'ID della miniatura, però? Sto iniziando con un URL di immagine, quindi suppongo che dovrei in qualche modo aggiungere un'immagine alla libreria di wordpress usando un'altra funzione?
Chris,

Dato che stai già inserendo un post, avevo supposto che stavi già allegando immagini al post che stai inserendo. Non è un presupposto valido?
Chip Bennett,

Siamo spiacenti, ma non ho ancora scoperto come allegare immagini a un post tramite URL. Inoltre, non vorrei che l'immagine venisse effettivamente visualizzata nel post stesso. Attualmente sto cercando la funzione che restituirà $ thumbnail_id e ho pensato che forse wp_insert_attachment () avrebbe funzionato, fino a quando non ho notato che era già necessario che l'allegato si trovasse nella directory di upload. Non so come ottenere un file immagine lì dal suo URL e non sono sicuro se questa è la funzione che sto cercando in primo luogo. Grazie per l'aiuto!
Chris,

Puoi per favore riscrivere la tua domanda con queste informazioni, per descrivere meglio ciò che stai cercando di realizzare? (O lasciare questo così com'è e iniziare una nuova domanda per chiedere come ottenere l'ID allegato quando si inserisce un post?)
Chip Bennett,

La domanda originale è stata modificata e parzialmente riformulata, ricontrolla :).
Chris,

9

Vorrei migliorare la risposta di Robs utilizzando le funzioni principali di WP download_urlemedia_handle_sideload

<?php
/**
* Downloads an image from the specified URL and attaches it to a post as a post thumbnail.
*
* @param string $file    The URL of the image to download.
* @param int    $post_id The post ID the post thumbnail is to be associated with.
* @param string $desc    Optional. Description of the image.
* @return string|WP_Error Attachment ID, WP_Error object otherwise.
*/
function Generate_Featured_Image( $file, $post_id, $desc ){
    // Set variables for storage, fix file filename for query strings.
    preg_match( '/[^\?]+\.(jpe?g|jpe|gif|png)\b/i', $file, $matches );
    if ( ! $matches ) {
         return new WP_Error( 'image_sideload_failed', __( 'Invalid image URL' ) );
    }

    $file_array = array();
    $file_array['name'] = basename( $matches[0] );

    // Download file to temp location.
    $file_array['tmp_name'] = download_url( $file );

    // If error storing temporarily, return the error.
    if ( is_wp_error( $file_array['tmp_name'] ) ) {
        return $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 set_post_thumbnail( $post_id, $id );

}

1
L'uso delle funzioni native di WordPress è la migliore pratica, grazie.
Mostafa Soufi,

Per qualche motivo, questa versione mi ha dato errori che dicevano "Non è stato fornito un URL valido". , mentre la risposta di Rob Vermeer ha funzionato.
Flimm,

3

set_post_thumbnail() è la migliore funzione per questo requisito.

Penso che trovi l'ID di un allegato tramite get_children()o get_posts(). Il risultato ha un array e all'interno di questo array c'è l'ID. L'esempio seguente per i test; spero che funzioni; scrivere senza test, solo su zero.

Per le tue esigenze è importante che tu cambi get_the_ID()con il tuo post-ID; restituisce l'ID dell'allegato e puoi usare foth set_post_thumbnail().

$attachments = get_children( 
    array(
        'post_parent' => get_the_ID(), 
        'post_type' => 'attachment', 
        'post_mime_type' => 'image'
    )
);
foreach ( $attachments as $attachment_id => $attachment ) {
    echo wp_get_attachment_image($attachment_id);
}

3

L'ho appena trovato e reso molto più semplice, funziona ma non sono un scrubber di sicurezza

if(!empty($_FILES)){
    require_once( ABSPATH . 'wp-admin/includes/post.php' );
    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    require_once( ABSPATH . 'wp-admin/includes/file.php' );
    require_once( ABSPATH . 'wp-admin/includes/media.php' );

    $post_ID = "your post id!";

    $attachment_id = media_handle_upload( 'file', $post_ID );
    set_post_thumbnail( $post_ID, $attachment_id );
}

semplice o cosa? dopo aver ottenuto i file giusti, wordpress gestirà il supporto e lo caricherà, quindi lo imposterà come anteprima.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.