it-swarm.com.de

Wie kann ich ein ausgewähltes Bild (Thumbnail) über die Bild-URL festlegen, wenn ich wp_insert_post () verwende?

Beim Durchsuchen des Funktionsreferenzeintrags für wp_insert_post () ist mir aufgefallen, dass das Array keinen Parameter enthält, der es mir ermöglicht, das 'Featured Image' für einen Beitrag festzulegen, der als Beitrags-Miniaturbild angezeigt wird. In meinem Thema.

Ich habe mir Funktionen wie set_post_thumbnail () angesehen, wie von Mr. Bennett vorgeschlagen, aber dies scheint eine relativ neue Ergänzung zu WordPress selbst und dem WordPress-Codex zu sein. Daher kann ich keine Quellen finden, die erklären, wie der Parameter $ thumbnail_id erfasst und bereitgestellt werden soll. Wenn dies wirklich die zu verwendende Funktion ist, wie könnte ich sie dann mit einem gültigen $ thumbnail_id-Parameter versehen, wenn ich nur eine Bild-URL habe?

Danke im Voraus!

57
Chris

Sie können ein Bild als Miniaturansicht festlegen, wenn es sich in Ihrer Medienbibliothek befindet. Um ein Bild in Ihre Medienbibliothek aufzunehmen, müssen Sie es auf Ihren Server hochladen. WordPress hat bereits eine Funktion zum Einfügen von Bildern in Ihre Medienbibliothek. Sie benötigen lediglich ein Skript, das Ihre Datei hochlädt.

Verwendungszweck:

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

Funktion:

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


BEARBEITEN: Pfaderstellung hinzugefügt

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

104
Rob Vermeer

Versuchen Sie es mit set_post_thumbnail() .

Edit von Otto: Du hast deine Frage geklärt, also kläre ich die Antwort, die Chip gegeben hat.

Grundsätzlich müssen Sie den 'Anhang' auch für den Beitrag erstellen. Wenn ein Bild in die WordPress-Medienbibliothek hochgeladen wird, wird ein spezieller Beitragseintrag mit einem Beitragstyp als Anhang erstellt. Dieser Anhang ist über die Kennung post_parent mit einem bestimmten Beitrag verknüpft.

Wenn Sie also die ID des Anhangs kennen, wird durch Aufrufen von set_post_thumbnail mit dem Beitragsobjekt oder der ID und der Anhangs-ID einfach das Beitrags-Thumbnail-Flag gesetzt.

Wenn Sie den Anhang noch nicht erstellt haben, müssen Sie dies zuerst tun. Am einfachsten geht das mit wp_insert_attachment() . Diese Funktion verwendet ein Array mit einigen Parametern, dem Dateinamen (die Datei muss sich bereits im richtigen Upload-Verzeichnis befinden) und der Beitrags-ID des übergeordneten Beitrags, an den Sie den Anhang anhängen möchten.

Nur eine Datei hochzuladen und an einen Beitrag anzuhängen, führt nicht automatisch zu etwas. Dies ist einfach eine Art Kategorisierungsmechanismus. Der Galerie-Mechanismus verwendet beispielsweise die angehängten Bilder eines Beitrags, um die [Galerie] für diesen Beitrag zu erstellen. Ein Miniaturbild für einen Beitrag ist nur eines der angehängten Bilder, das als Miniaturbild festgelegt wurde.

Weitere Informationen zur Verwendung von wp_insert_attachment finden Sie im oben verlinkten Codex.

10
Chip Bennett

Ich möchte Robs Antwort verbessern, indem ich die WP Kernfunktionen download_url und media_handle_sideload benutze.

<?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() ist die beste Funktion für diese Anforderung.

Ich denke, Sie finden die ID eines Anhangs über get_children() oder get_posts() . Das Ergebnis hat ein Array und in diesem Array befindet sich die ID. Das folgende Beispiel zum Testen; ich hoffe es klappt; schreiben Sie ohne Tests, nur auf Kratzer.

Für Ihre Anforderung ist es wichtig, dass Sie get_the_ID() mit Ihrem post-ID ändern. Geben Sie die ID des Anhangs zurück. Verwenden Sie dazu die folgenden 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

Habe das gerade gefunden und es viel einfacher gemacht, funktioniert aber ich bin kein Security Scrubber

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

einfach oder was? Nachdem Sie die richtigen Dateien erhalten haben, verarbeitet WordPress die Medien, lädt sie hoch und legt sie dann als Miniaturansicht fest.

3
Jesse Baker