Holen Sie sich das erste Bild aus dem Post-Inhalt (z. B. Hotlink-Bilder)

10

Ich verwende diesen Code direkt aus dem Codex .

function echo_first_image ($postID)
{                   
    $args = array(
    'numberposts' => 1,
    'order'=> 'ASC',
    'post_mime_type' => 'image',
    'post_parent' => $postID,
    'post_status' => null,
    'post_type' => 'attachment'
    );

    $attachments = get_children( $args );

    //print_r($attachments);

    if ($attachments) {
        foreach($attachments as $attachment) {
            $image_attributes = wp_get_attachment_image_src( $attachment->ID, 'thumbnail' )  ? wp_get_attachment_image_src( $attachment->ID, 'thumbnail' ) : wp_get_attachment_image_src( $attachment->ID, 'full' );

            echo '<img src="'.wp_get_attachment_thumb_url( $attachment->ID ).'" class="current">';

        }
    }
}

Ich nenne es innerhalb der Schleife so echo_first_image ($post->ID);

Die Funktion ruft auf, aber es wird nichts ausgegeben ... soweit ich sehen kann, ist nichts drin $attachments

Ich habe ein Bild in dem Beitrag, den ich verwende. Es ist kein Bild oder eine Galerie, nur in der Post.

Mache ich etwas falsch oder stimmt überhaupt etwas mit dem Code nicht?

byronyasgur
quelle

Antworten:

22

Wenn Sie ein Bild anzeigen möchten , das in Ihren Inhalt eingefügt wird (z. B. ein Hotlink-Bild), müssen Sie eine Funktion wie diese (Quelle) verwenden :

füge in functions.php hinzu :

function catch_that_image() {
  global $post, $posts;
  $first_img = '';
  ob_start();
  ob_end_clean();
  $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
  $first_img = $matches [1] [0];

  if(empty($first_img)){ //Defines a default image
    $first_img = "/images/default.jpg";
  }
  return $first_img;
}

Stellen <?php echo catch_that_image() ?>Sie dann das Bild an die gewünschte Stelle .

Hinweis: Ein Hotlink-Bild, das gerade in Ihrem Inhalt platziert wurde, kann nicht als "Ausgewähltes Bild" festgelegt werden, eine Funktion von WordPress.

Diana
quelle
Ja, ich habe diesen Code gesehen ... scheint ein bisschen wie ein Hack zu sein, man könnte meinen, es gäbe einen "WordPress" -Weg ... Ich frage mich, warum ich preg_match verwenden muss, wenn der Codex sagt, dass Sie das können es wie ich oben gepostet habe. Das ist meine Frage, um ehrlich zu sein. Ist der Code, den ich gepostet habe, falsch? ... mehr als zu versuchen, es wirklich zum Laufen zu bringen. Aber danke, ich muss das vielleicht benutzen. Ich verstehe die Bedeutung von "Ein Bild, das gerade in Ihrem Inhalt platziert wurde, kann nicht als ausgewähltes Bild festgelegt werden" nicht. Hat das einen Einfluss darauf? Ich versuche nur, das erste Bild aus dem Beitrag anzuzeigen, nicht das vorgestellte Bild.
Byronyasgur
Es gibt einen großen Unterschied zwischen dem Platzieren eines Bildlinks in Ihrem Post- / Seiteninhalt und dem Anhängen eines Bildes. Sie können ein Bild anhängen, ohne es überhaupt anzuzeigen. Im Codex-Beispiel geht es darum, eine Datei an Ihren Beitrag / Ihre Seite anzuhängen. Es gibt keine Möglichkeit, ein Bild durch Verknüpfen darin zu platzieren. Außerdem ist Hotlinking keine Funktion, mit der WP ohne PHP-Regex umgehen kann.
Diana
Informationen zur COdex-Referenz: Wie Sie sehen, wird das Dokument nach dem Funktionsnamen aufgerufen. get_childreEin Anhang ist ein untergeordneter Beitrag, sodass dieses Beispiel nur für angehängte Inhalte verwendet werden kann.
Diana
Ja, ich weiß, dass ich ein Bild anhängen kann, ohne es einzufügen. Dieses Bit ist klar. Aber ich sehe nicht, wie Sie ein Bild einfügen können, ohne es anzuhängen. Wenn ich auf Hochladen / Einfügen drücke, laden Sie eine Datei von meinem Computer hoch und drücke Einfügen in Beitrag und Update und gehe dann zur Medienbibliothek Bibliothek. Es sagt mir, dass das Bild, das ich hochgeladen habe, an den Beitrag "angehängt" ist. ... oder sprechen wir hier über Semantik, weil ich verstehe, was Sie über diesen Code sagen, der nur für angehängte Bilder funktioniert.
Byronyasgur
1
Sie können eine Bilddatei überall mit einem Hotlink verknüpfen. Wenn Sie auf Bild / Medien einfügen klicken, gibt es eine Registerkarte "Von URL", auf der Sie eine Bild-URL, dh einen Imageshack-Dienst, angeben. Der Regex kann dieses Bild abrufen ("wie es ist"), aber WP kann dieses Bild beispielsweise nicht als empfohlenes Bild verwenden.
Diana
3

Ich schlage zwei Möglichkeiten vor:

Verwenden eines Plugins

Ich würde in Betracht ziehen, das Get The Image- Plugin zu verwenden, damit Sie Folgendes tun können:

$args = array(
    'post_id' => <id>
    'image_scan' => true
);
get_the_image($args);

Das Obige wird versuchen, die Dinge in dieser Reihenfolge zu tun:

  1. Suchen Sie nach dem Miniaturbild des Beitrags
  2. Suchen Sie nach dem ersten angehängten Bild
  3. Scannen Sie den Beitragsinhalt nach einem eingefügten Bild.

Aufbau von Unterstützung in Ihrem Thema

Ich verwende jedoch eine Funktion in einem Plugin , die die ersten beiden Elemente der obigen Liste implementiert.

function gpi_find_image_id($post_id) {
    if (!$img_id = get_post_thumbnail_id ($post_id)) {
        $attachments = get_children(array(
            'post_parent' => $post_id,
            'post_type' => 'attachment',
            'numberposts' => 1,
            'post_mime_type' => 'image'
        ));
        if (is_array($attachments)) foreach ($attachments as $a)
            $img_id = $a->ID;
    }
    if ($img_id)
        return $img_id;
    return false;
}

Sie können es so anpassen, dass es auch mit dem dritten Element in Dianas Snippet übereinstimmt:

function find_img_src($post) {
    if (!$img = gpi_find_image_id($post->ID))
        if ($img = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches))
            $img = $matches[1][0];
    if (is_int($img)) {
        $img = wp_get_attachment_image_src($img);
        $img = $img[0];
    }
    return $img;
}

Stecken Sie diese beiden Funktionen einfach in Ihre functions.phpDatei und verwenden Sie sie in der Schleife wie folgt:

<?php while (have_posts()) : the_post(); ?>
    <?php if ($img_src = find_img_src($post) : ?>
        <img src="<?php echo $img_src; ?>" />
    <?php endif; ?>
<?php endwhile; ?>
vmassuchetto
quelle
Das Thema soll kommerziell zum Verkauf stehen, daher möchte ich dem Endbenutzer nicht sagen, dass er ein Plugin installieren muss, aber danke.
Byronyasgur
@byronyasgur Die Antwort wurde bearbeitet, um zu verdeutlichen, dass ich Ihnen zwei Lösungen gegeben habe. Sie müssen kein Plugin installieren, um dem zweiten zu folgen.
Vmassuchetto
2

Der Code scheint vollkommen sicher zu sein. Wie Sie sagten, haben Sie kein Bild an den Beitrag angehängt .

Gehen Sie zum Medienverwaltungsbereich und fügen Sie diesem Beitrag ein Bild hinzu.

Alternativ können Sie den Inhalt des Beitrags mit einem regulären Ausdruck für die darin enthaltenen Bilder verschrotten.

pcarvalho
quelle
Habe ich ein Missverständnis darüber, was "angehängt" genau bedeutet? .... ich habe ein Bild im Beitrag ... ist es nicht angehängt, wenn Sie auf "Zum Beitrag hinzufügen" klicken?
Byronyasgur
1
Aus Ihrer Frage ging hervor, dass Sie den HTML-Code eingegeben haben, der mit einem Bild verknüpft ist, das nicht unbedingt von wp angehängt wurde.
Pcarvalho
1

Ich verstehe, dass dies eine sehr alte Frage ist, aber ich stelle meine Antwort hier ein, da die meisten Antworten nicht für Leute geeignet sind, die neu in PHP sind.

preg_match ist kein guter Ansatz zum Parsen von HTML in PHP, da preg_match für reguläre Ausdrücke und HTML nicht für reguläre Ausdrücke gilt.

Wir können stattdessen DOM verwenden.

function firstImg($html){
  $dom = new DOMDocument;
  $dom->loadHTML($html);
  $images = $dom->getElementsByTagName('img');
  foreach ($images as $image) {
    return $image->getAttribute('src');
  }
  return false;
}

Die Verwendung von DOM ist wirklich gut, da Sie mehr tun können, als nur das erste Bild zu erhalten, und es ist der richtige Weg, HTML zu analysieren.

Ich wünschte, ich könnte eine Antwort für die Verwendung von WordPress-Funktionen (Funktionen von CODEX und Core) geben, um das erste Bild zu erhalten, aber das ist auch das Problem, mit dem ich mich befasse.

Dies ist nicht für jeden Fall eine Antwort!

Betrachten Sie den Fall der Bildgrößenoptimierung. In diesem Fall können Sie diesen Code nicht einfach verwenden, da der Beitrag eine beliebige Bildgröße enthalten kann.


quelle
0

Dieser Code funktioniert für mich:

function get_first_image( $post_id ) {
    $attach = get_children( array(
        'post_parent'    => $post_id,
        'post_type'      => 'attachment',
        'post_mime_type' => 'image',
        'order'          => 'DESC',
        'numberposts'    => 1
    ) );
    if( is_array( $attach ) && is_object( current( $attach ) ) ) {
        return current( $attach )->guid;
    }
}
Mario62RUS
quelle