Comment définir une image sélectionnée (vignette) par URL d'image lorsque j'utilise wp_insert_post ()?

55

En parcourant la entrée de référence de fonction pour wp_insert_post () , j'ai remarqué qu'il n'y avait pas de paramètre dans le tableau requis ce qui me permettra de définir "L'image sélectionnée" pour un article, affichée comme vignette dans mon thème.

J'ai examiné des fonctions telles que set_post_thumbnail () , comme l'a suggéré M. Bennett, mais cela semble être un ajout relativement nouveau à WordPress et au codex WordPress. En tant que tel, je ne peux trouver aucune source qui explique comment le paramètre $ thumbnail_id doit être acquis et fourni. Si telle est vraiment la fonction à utiliser, de quelle manière pourrais-je lui fournir un paramètre valide $ thumbnail_id lorsque tout ce que je possède est une URL d'image?

Merci d'avance!

    
posée Chris 26.01.2012 - 22:56
la source

5 réponses

97

Vous pouvez définir une image comme miniature de publication lorsque celle-ci se trouve dans votre bibliothèque multimédia. Pour ajouter une image dans votre bibliothèque multimédia, vous devez la télécharger sur votre serveur. WordPress possède déjà une fonction permettant de placer des images dans votre médiathèque. Vous n'avez besoin que d'un script pour télécharger votre fichier.

Utilisation:

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()

Fonction:

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

enlace

enlace

EDIT: Ajout de la création de chemin

enlace

    
réponse donnée Rob Vermeer 05.02.2012 - 23:07
la source
10

Essayez d’utiliser set_post_thumbnail() .

Edit by Otto: Vous avez clarifié votre question, je vais donc clarifier la réponse donnée par Chip.

En gros, vous devez également créer une "pièce jointe" pour le message. Lorsqu'une image est téléchargée dans la médiathèque WordPress, une entrée spéciale est créée pour celle-ci avec un type de pièce jointe. Cette pièce jointe est liée à une publication spécifique via l'identifiant post_parent.

Donc, si vous connaissez l'ID de la pièce jointe, l'appel de set_post_thumbnail avec l'objet ou l'ID de publication et l'ID de la pièce jointe définiront simplement le drapeau de la miniature de publication.

Si vous n'avez pas encore créé la pièce jointe, vous devez d'abord le faire. Le moyen le plus simple de le faire est d'utiliser wp_insert_attachment() . Cette fonction prend un tableau de quelques paramètres, le nom de fichier (le fichier doit déjà se trouver dans le répertoire de téléchargement approprié) et l'identifiant de publication de la publication parente à laquelle vous souhaitez joindre la pièce jointe.

Le simple fait de charger un fichier et de le joindre à un message ne fait rien automatiquement. C'est simplement une sorte de mécanisme de catégorisation. Le mécanisme de la galerie, par exemple, utilise les images attachées d’une publication pour créer la [galerie] de cette publication. Une vignette pour un article n'est qu'une des images jointes, qui doit être définie comme étant la vignette.

Vous trouverez plus d'informations sur l'utilisation de wp_insert_attachment dans le codex (lien ci-dessus).

    
réponse donnée Chip Bennett 26.01.2012 - 23:08
la source
5

Je voudrais améliorer la réponse de Robs en utilisant les fonctions de base de WP, download_url et media_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 );

}
    
réponse donnée Jan Beck 02.03.2016 - 08:23
la source
3

set_post_thumbnail() est la meilleure fonction pour cette exigence.

Je pense que vous trouvez l'ID d'une pièce jointe via get_children() ou get_posts() . Le résultat a un tableau et à l'intérieur de ce tableau se trouve l'ID. L'exemple suivant pour les tests; J'espère que ca fonctionne; écrire sans test, uniquement sur scratch.

Pour votre besoin, il est important de changer get_the_ID() avec votre post-ID ; renvoyer l'ID de la pièce jointe et vous pourrez l'utiliser avec 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);
}
    
réponse donnée bueltge 06.02.2012 - 16:14
la source
3

Je viens de le trouver et je l'ai simplifié beaucoup, ça marche mais je ne suis pas un scrubber de sécurité

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

simple ou quoi? Après avoir récupéré les bons fichiers, wordpress gérera le support et le téléchargera, puis le définira comme une vignette.

    
réponse donnée Jesse Baker 21.02.2015 - 00:45
la source

Lire d'autres questions sur les étiquettes