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

61

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

J'ai étudié des fonctions telles que set_post_thumbnail () , comme suggéré par 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 c'est vraiment la fonction à utiliser, de quelle manière pourrais-je lui fournir un paramètre valide $ thumbnail_id alors que tout ce que j'ai est une URL d'image?

Merci d'avance!

Chris
la source

Réponses:

107

Vous pouvez définir une image comme post-vignette lorsqu'elle 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 bibliothèque multimédia. Vous n'avez besoin que d'un script pour télécharger votre fichier.

Usage:

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

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

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

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


EDIT: Création d'un chemin ajouté

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

Rob Vermeer
la source
Merci pour vos efforts! Cela fonctionne uniquement avec $ upload_dir ['basedir'] (plutôt que chemin), car lorsque j'inspecte la pièce jointe via l'interface de post-édition, elle est référencée sous la forme ... / uploads / FILENAME.EXT alors que $ upload_dir ['chemin' ] le stockerait dans quelque chose comme ... / uploads / 2012/02 / FILENAME.EXT. Il serait peut-être même préférable de changer la façon dont le fichier est référencé, mais je ne saurais pas comment.
Chris
1
Ajout de la création de chemin dans ma réponse.
Rob Vermeer
Appréciez votre réponse rapide :). J'ai toujours le même résultat, cependant, voici une capture d'écran affichant mon problème: i.imgur.com/iKTNs.png . La partie supérieure est le résultat de l'insertion d'un écho dans votre conditionnel, uniquement pour voir ce qui se passe.
Chris
Il a encore changé, il n'a pas transmis le chemin complet à wp_insert_attachment et wp_generate_attachment_metadata. J'espère que cela résoudra le problème.
Rob Vermeer
1
Attention: Cette réponse réécrit le fichier s'il porte le même nom, méfiez-vous. Il devrait générer des noms en utilisant $ post_id ou au moins uniqid ()
Ivan Castellanos
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.

Fondamentalement, vous devez également créer une "pièce jointe" pour le poste. 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 avec 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 télé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).

Chip Bennett
la source
Merci pour votre réponse! Comment pourrais-je récupérer l'ID de vignette, cependant? Je commence avec une URL d'image, donc je suppose que je devrais en quelque sorte ajouter une image à la bibliothèque wordpress en utilisant une autre fonction?
Chris
Comme vous avez déjà inséré un article, j'avais supposé que vous ajoutiez déjà des images à l'article que vous insérez. N'est-ce pas une hypothèse valable?
Chip Bennett
Désolé, mais je n'ai pas encore trouvé comment joindre des images à un message par URL. En outre, je ne voudrais pas que l'image soit réellement affichée dans le message lui-même. Je suis actuellement à la recherche de la fonction qui retournera $ thumbnail_id, et je pensais que wp_insert_attachment () fonctionnerait, jusqu'à ce que je remarque qu'il faut déjà que la pièce jointe soit dans le répertoire de téléchargement. Je ne sais pas comment y obtenir un fichier image par son URL et je ne suis pas sûr que ce soit la fonction que je cherche en premier lieu. Merci de votre aide!
Chris
Pouvez-vous s'il vous plaît réécrire votre question avec cette information, pour mieux décrire ce que vous essayez d'accomplir? (Ou laissez-le tel quel et commencez une nouvelle question pour savoir comment obtenir l'ID de pièce jointe lors de l'insertion d'un message?)
Chip Bennett le
La question initiale a été modifiée et partiellement reformulée. Veuillez vérifier à nouveau :).
Chris
9

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

}
Jan Beck
la source
1
L'utilisation des fonctions natives de WordPress est la meilleure pratique, merci.
Mostafa Soufi
Pour une raison quelconque, cette version m'a donné des erreurs en disant "Une URL valide n'a pas été fournie". , alors que la réponse de Rob Vermeer a fonctionné.
Flimm
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 tests, uniquement sur scratch.

Pour vos besoins, il est important que vous changiez get_the_ID()avec votre post-ID; renvoyer l'ID de la pièce jointe et vous pourrez l'utiliser avec 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);
}
bueltge
la source
3

Je viens de le trouver et je l'ai simplifié beaucoup, 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.

Jesse Baker
la source