it-swarm.com.de

Erhalte $ image_id nach dem Hochladen mit media_sideload_image ()

Ich möchte ein Bild hochladen und es als vorgestellten Bild in einem Beitrag festlegen. Was ich ausprobiert habe, war folgendes:

$image_id = media_sideload_image($image_url, $post_id, $post_id);
update_post_meta($post_id, '_thumbnail_id', $image_id);

Aber media_sideload_image() gibt nicht den image_id zurück, sondern das Render-HTML-Bild. Wie kann ich den image_id bekommen?

10
Xavin

Hier ist ein Beispiel, wie Sie diese Einschränkung mithilfe von Aktionen/Hooks umgehen können:

function new_attachment( $att_id ){
    // the post this was sideloaded into is the attachments parent!

    // fetch the attachment post
    $att = get_post( $att_id );

    // grab it's parent
    $post_id = $att->post_parent;

    // set the featured post
    set_post_thumbnail( $post_id, $att_id );
}

// add the function above to catch the attachments creation
add_action('add_attachment','new_attachment');

// load the attachment from the URL
media_sideload_image($image_url, $post_id, $post_id);

// we have the image now, and the function above will have fired too setting the thumbnail ID in the process, so lets remove the hook so we don't cause any more trouble 
remove_action('add_attachment','new_attachment');

Die Idee ist, dass wenn media_sideload_image ausgeführt wird:

  • lädt das Bild herunter
  • fügt es als Anhang hinzu (ein Beitrag vom Typ attachment)
  • hängt diesen Anhang dann an den Beitrag an, dessen ID Sie angegeben haben ($ post_id)

Ihr Problem besteht darin, dass die neu erstellte ID für Anhangsbeiträge nicht bereitgestellt wird.

Aber , wenn ein Anhang erstellt wird, wird eine Aktion mit seiner ID ausgelöst. Wir können dies tun, bevor wir den Anhang erstellen, und das vorgestellte Miniaturbild mit der Beitrags-ID speichern, die es uns gegeben hat. Anschließend können wir es aushängen.

28
Tom J Nowell

Ich habe eine Funktion zum Abrufen der ID aus der Datenbank erstellt, die nach URL sucht.

function get_attachment_id_from_src ($image_src) {
  global $wpdb;
  $query = "SELECT ID FROM {$wpdb->posts} WHERE guid='$image_src'";
  $id = $wpdb->get_var($query);
  return $id;
}

Sie können eine URL (anstelle von HTML-Code) mit einem vierten Parameter abrufen, der auf 'src' gesetzt ist. Codex: media_sideload_image ()

$src = media_sideload_image($url, $item_id, $desc,'src');
get_attachment_id_from_src($src);
6
yondemon

@ Tom J Nowells Antwort ist genau richtig. Ich habe eine andere Alternative gefunden (mit verschiedenen Funktionen) hier erklärt aber ich mag diese mehr.

In meinem Fall habe ich eine Reihe von $ posts mit allen Posts, die ich einfügen möchte, und ein separates $ media (dieselben $ nid-Schlüssel wie $ posts) mit dem media. Mein Code ist dieselbe Lösung wie der von Tom, wurde jedoch überarbeitet, um eine anonyme Funktion zu verwenden:

foreach( $posts as $nid=>$post )
    $posts[$nid]['ID'] = wp_insert_post( $post );

foreach( $posts as $nid=>$post )
    foreach( $media[$nid] as $m=>$mitem ) {

        if( 0 == $m ) add_action( 'add_attachment',
            function( $att_id ) use ($posts, $nid, $mitem) {
                update_post_meta($posts[$nid]['ID'], '_thumbnail_id', $att_id);
                $posts[$nid]['media_urls'][] = $mitem['url'];
            }
        );
        media_sideload_image($mitem['url'], $post['ID']);
        remove_all_actions( 'add_attachment' );
    }

In meinem Fall gehe ich davon aus, dass das erste Element in jedem $ media [$ nid] das abgebildete Bild seines Posts ist.

WordPress sollte auf jeden Fall media_sideload_image () so ändern, dass es die $ id zurückgibt. In der Tat hat die Funktion es zur Hand, siehe die Quelle hier . Tatsächlich gibt es ein Track-Ticket für dieses und sie haben sogar Patches, um dies in der Zwischenzeit auf Ihren Kern anzuwenden, wenn Sie möchten.

4
Jorge Orpinel

Die älteren Lösungen werden nicht mehr benötigt.

Sie können die ID mit einem vierten Parameter ($ return) erhalten, der auf 'id' gesetzt ist.

<?php media_sideload_image($file, $post_id, $desc, $return); ?> 

https://codex.wordpress.org/Function_Reference/media_sideload_image

4
olaf

Ich suchte nach einer Lösung und beschloss, den Code für media_sideload_image() zu lesen, der sehr einfach war. Es verwendet media_handle_sideload(), was uns den Anhang id gibt.

Ich habe es geändert, um den Anhang id anstelle der HTML-Quelle des Bildes zurückzugeben, und habe sogar eine Möglichkeit hinzugefügt, ihm einen neuen Dateinamen zu senden.

function media_sideload_image_custom($file, $post_id, $desc = null, $file_name = null)
{
    if ( ! empty($file) ) {
        // Download file to temp location
        $tmp = download_url( $file );

        // fix file filename for query strings
        if( empty($file_name) ) { 
            preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $file, $matches);
            $file_array['name'] = basename($matches[0]);
        } else {
            $file_array['name'] = sanitize_file_name($file_name);
        }
        $file_array['tmp_name'] = $tmp;

        // If error storing temporarily, unlink
        if ( is_wp_error( $tmp ) ) {
            @unlink($file_array['tmp_name']);
            $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 null;
}
3
Dario Zadro