Wie kann ich ein ausgewähltes Bild (Miniaturbild) anhand der Bild-URL festlegen, wenn ich wp_insert_post () verwende?

61

Beim Durchsuchen des Funktionsreferenzeintrags für wp_insert_post () ist mir aufgefallen, dass das erforderliche Array keinen Parameter enthält, mit dem ich das 'Featured Image' für einen Beitrag festlegen kann, das als Beitragsminiatur in meinem Thema angezeigt wird .

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!

Chris
quelle

Antworten:

107

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 verfügt bereits über eine Funktion zum Einfügen von Bildern in Ihre Medienbibliothek. Sie benötigen lediglich ein Skript, mit dem Sie Ihre Datei hochladen können.

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

Rob Vermeer
quelle
Vielen Dank für Ihre Bemühungen! Dies funktioniert jedoch nur bei Verwendung von $ upload_dir ['basedir'] (anstelle von 'path'), da bei der Überprüfung des Anhangs über die Nachbearbeitungsoberfläche auf ... / uploads / FILENAME.EXT verwiesen wird, während $ upload_dir ['path' ] würde es in so etwas wie ... / uploads / 2012/02 / FILENAME.EXT speichern. Es ist vielleicht sogar besser, die Art und Weise, in der auf die Datei verwiesen wird, irgendwie zu ändern, aber ich würde nicht wissen, wie.
Chris
1
Pfaderstellung in meiner Antwort hinzugefügt.
Rob Vermeer
Schätzen Sie Ihre schnelle Antwort :). Ich erhalte immer noch das gleiche Ergebnis. Hier ist ein Screenshot, der mein Problem zeigt: i.imgur.com/iKTNs.png . Der obere Bereich ist das Ergebnis der Platzierung eines Echos in Ihrer Bedingung, nur um zu sehen, was los ist.
Chris
Es wurde erneut geändert, der vollständige Pfad zu wp_insert_attachment und wp_generate_attachment_metadata wurde nicht übergeben. Hoffe das wird das Problem lösen.
Rob Vermeer
1
Warnung: Bei dieser Antwort wird die Datei neu geschrieben, wenn sie denselben Namen hat. Es sollte Namen mit $ post_id oder zumindest uniqid () generieren
Ivan Castellanos
10

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 benötigt ein Array mit einigen Parametern, den Dateinamen (die Datei muss sich bereits im richtigen Upload-Verzeichnis befinden) und die 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 Codex (oben verlinkt).

Chip Bennett
quelle
Danke für Ihre Antwort! Wie würde ich jedoch die Thumbnail-ID abrufen? Ich beginne mit einer Bild-URL, also sollte ich der WordPress-Bibliothek mit einer anderen Funktion irgendwie ein Bild hinzufügen?
Chris
Da Sie bereits einen Beitrag einfügen , war ich davon ausgegangen, dass Sie bereits Bilder an den Beitrag anhängen , den Sie einfügen. Ist das keine gültige Annahme?
Chip Bennett
Entschuldigung, aber ich habe noch nicht herausgefunden, wie Bilder per URL an einen Beitrag angehängt werden können. Außerdem möchte ich nicht, dass das Bild tatsächlich im Beitrag selbst angezeigt wird. Ich bin derzeit auf der Suche nach der Funktion, die die $ thumbnail_id zurückgibt, und dachte, dass wp_insert_attachment () möglicherweise funktionieren würde, bis ich bemerkte, dass der Anhang bereits im Upload-Verzeichnis sein musste. Ich weiß nicht, wie ich eine Bilddatei über ihre URL dort abrufen kann, und ich bin mir nicht sicher, ob dies die Funktion ist, nach der ich überhaupt suche. Danke für deine Hilfe!
Chris
Können Sie bitte Ihre Frage mit diesen Informationen umschreiben , um besser zu beschreiben, was Sie erreichen möchten? (Oder lassen Sie diesen unverändert und beginnen Sie eine neue Frage, um zu erfahren, wie Sie die Anhang-ID erhalten, wenn Sie einen Beitrag einfügen?)
Chip Bennett
Die ursprüngliche Frage wurde bearbeitet und teilweise umformuliert, bitte versuchen Sie es noch einmal :).
Chris
9

Ich möchte Robs Antwort verbessern, indem ich die WP-Kernfunktionen download_urlund verwendemedia_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
quelle
1
Die Verwendung der nativen WordPress-Funktionen ist die beste Vorgehensweise. Vielen Dank.
Mostafa Soufi
Aus irgendeinem Grund gab diese Version mir die Fehlermeldung "Es wurde keine gültige URL angegeben." , während Rob Vermeers Antwort funktionierte.
Flimm
3

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 funktioniert; Schreiben Sie ohne Tests, nur von Grund auf.

Für Ihre Anforderung ist es wichtig, dass Sie sich get_the_ID()mit Ihrem ändern post-ID; Geben Sie die ID des Anhangs zurück und verwenden Sie diese 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
quelle
3

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 WordPress die richtigen Dateien erhalten hat, verarbeitet WordPress die Medien, lädt sie hoch und legt sie dann als Miniaturansicht fest.

Jesse Baker
quelle