Erste Image URL aus Content extrahieren

  • Hallo!

    Für ein Wordpress System würde ich gerne die erste, im Content vorkommende URL eines Bildes auslesen und in einem anderen Feld abspeichern.
    Problem ist hierbei (zumindest für mich) das nach dem einleitenden IMG tag nicht zwingend das SRC folgen muss, sondern ggf. noch style Angaben oder weißnichtwas dazwischen stehen kann.

    Aktuell sieht meine Funktion so aus, wobei in $content halt der Content enthalten ist.

    <code>
    $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $content, $matches);
    $this->post['meta']['_thumbnail_url_value'] = $matches [1] [0];
    </code>

    Nur leider gehts nicht.
    Jemand eine Idee ??

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

  • Mh, ich kann dir zwar nicht helfen, wäre aber ebenfalls sehr an einer Lösung interessiert. Habe das gleiche Problem wie du und auch bei mir folgt nicht unbedingt src auf img. Dazwischen stehen oft einige Sachen, leider. Ich muss momentan die Bild-Url noch manuell in zwei Felder eintragen...

  • Was genau funktioniert denn nicht?
    Mal davon abgesehen, daß es für den ersten Treffer auch ausreichen würden, preg_match (ohne _all) zu verwenden, funktioniert es in einem Kurztest bei mir einwandfrei.
    Wo, wie und wann wird denn der Code aufgerufen?

    Gruß
    Ingo

    Wenn ich helfen konnte, bitte [ Gefällt mir ] klicken. :-)

  • Also ich habe einfach folgendes in die functions.php meines Themes eigefügt:

    PHP
    function pz_test_content( $content ) {
        if( preg_match( '/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $content, $matches ) )
            echo( $matches[1] );
        
        return $content;
    }
    
    
    add_filter( 'the_content', 'pz_test_content', 999 );

    Das sieht dann zwar nicht schön aus, weil die Bilder-URL am Anfang des Artikels ausgegeben wird, aber es geht ja nur darum zu sehen, ob es funktioniert.

    Gruß
    Ingo

    Wenn ich helfen konnte, bitte [ Gefällt mir ] klicken. :-)

  • Zum Bleistift so:

    PHP
    function pz_insert_post( $post_ID, $post ) {
        $content = apply_filters( 'the_content', $post->post_content );
        if( preg_match( '/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $content, $matches ) )
            update_post_meta( $post_ID, '_thumbnail_url_value', $matches[1] );
    }
    
    
    add_action( 'wp_insert_post', 'pz_insert_post', 10, 2 );

    Gruß
    Ingo

    Wenn ich helfen konnte, bitte [ Gefällt mir ] klicken. :-)

  • Zum Bleistift so:

    PHP
    function pz_insert_post( $post_ID, $post ) {
        $content = apply_filters( 'the_content', $post->post_content );
        if( preg_match( '/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $content, $matches ) )
            update_post_meta( $post_ID, '_thumbnail_url_value', $matches[1] );
    }
    
    
    add_action( 'wp_insert_post', 'pz_insert_post', 10, 2 );

    Gruß
    Ingo

    Danke, im Prinzip klappt es prima. Allerdings taucht folgendes Problem auf.

    Übernommen wird natürlich die URL aus dem Text:
    /wp-content/uploads/2009/10/vw-060723-0698-150x150.jpg

    Und nicht die "originale" URL:
    /wp-content/uploads/2009/10/vw-060723-0698.jpg

    Ist natürlich doof, weil so die Thumbnails durch das benutzerdefinierte Feld vom "Mediathek-Thumbnail" des Artikels und nicht von der Ursprungsdatei erzeugt werden :(

    Jemand eine Idee?

  • Naja, wenn mein erster Blick stimmt, wird immer das letzte Bild genommen. Ist ja auch irgendwie doof, dann müsste ich rückwärts hochladen, wenn ich das erste Bild aus Thumbnail haben will, oder nicht?


    Nein, es müsste das erste Bild sein. Aber bin mir nicht sicher.

    "Eine gut gestellte Frage ist schon halb beantwortet."

  • Danke, im Prinzip klappt es prima. Allerdings taucht folgendes Problem auf.

    Übernommen wird natürlich die URL aus dem Text:
    /wp-content/uploads/2009/10/vw-060723-0698-150x150.jpg

    Und nicht die "originale" URL:
    /wp-content/uploads/2009/10/vw-060723-0698.jpg

    Ist natürlich doof, weil so die Thumbnails durch das benutzerdefinierte Feld vom "Mediathek-Thumbnail" des Artikels und nicht von der Ursprungsdatei erzeugt werden :(

    Jemand eine Idee?


    Mußte halt das preg_match() anpassen. Könnte so aussehen:

    PHP
    if( preg_match( '/<a.+href=[\'"]([^\'"]+\.(jpg|png|gif))[\'"].*><img.+?\/a>/i', $content, $matches ) )


    Gruß
    Ingo

    Wenn ich helfen konnte, bitte [ Gefällt mir ] klicken. :-)

  • Mußte halt das preg_match() anpassen. Könnte so aussehen:

    PHP
    if( preg_match( '/<a.+href=[\'"]([^\'"]+\.(jpg|png|gif))[\'"].*><img.+?\/a>/i', $content, $matches ) )


    Gruß
    Ingo

    Mh, irgendwie sagt mir dieser Codeschnipsel gar nichts. Könntest du die Sache vllt näher erläutern?

  • Ich war bei meinem Beispiel davon ausgegangen, wie ich es bei mir handhabe. Da verweist das im Artikel gezeigte Thumbnail direkt auf die originale Bilddatei. Dafür funktionioniert mein Code.

    Ansonsten müßte man mit der erhaltenen URL in den Tabelle 'wp_postmeta' suchen und sich die Adresse des Originalbildes besorgen. Das wird etwas komplizierter.

    Gruß
    Ingo

    Wenn ich helfen konnte, bitte [ Gefällt mir ] klicken. :-)

  • Ich war bei meinem Beispiel davon ausgegangen, wie ich es bei mir handhabe. Da verweist das im Artikel gezeigte Thumbnail direkt auf die originale Bilddatei. Dafür funktionioniert mein Code.

    Ah, das ist genau die Erklärung, die ich erhofft habe. Danke dir recht herzlich, es funzt nun prima!

  • Da habe ich ja eine mächtige Diskusion ausgelöst.
    Und alles nur wegen einem kleinem Tipfehler, den ich im nachfolgenden Code hatte :-) (pfeif)

    Die beiden Codezeilen werkeln soweit ganz gut.
    Ziel war es ja externe Bilder, die durch das einbinden von Feeds geladen
    werden, auch in der entsprechenden Thumbnailgröße darzustellen.

    Habe das ganze noch ein wenig dahingehend verfeinert, das er erkennen soll,
    ob es nun ein externes oder internes image ist

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!