web-dev-qa-db-fra.com

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

En regardant dans l'entrée de référence de la 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 sélectionnée" pour un article, affiché sous la forme de la vignette de l'article 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 telle est vraiment la fonction à utiliser, de quelle manière pourrais-je lui fournir un paramètre valide $ thumbnail_id lorsque tout ce que j'ai est une URL d'image?

Merci d'avance!

57
Chris

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

104
Rob Vermeer

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'un article pour créer la [galerie] de cet article. 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).

10
Chip Bennett

J'aimerais améliorer la réponse de Rob en utilisant les WP fonctions principales 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 );

}
7
Jan Beck

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 votre besoin, 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 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
bueltge

Je viens de trouver cela 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.

3
Jesse Baker