it-swarm.com.de

Holen Sie sich das erste Bild aus dem Inhalt des Beitrags (z. B. mit einem Link verknüpfte Bilder).

Ich benutze 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 in der Schleife wie folgt echo_first_image ($post->ID);

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

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

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

10
byronyasgur

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

add in functions.php :

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

Platzieren Sie dann <?php echo catch_that_image() ?> an der Stelle, an der Sie das Bild anzeigen möchten.

Hinweis: Ein mit einem Hotlink versehenes Bild, das gerade in Ihren Inhalt eingefügt wurde, kann nicht als "Empfohlenes Bild" festgelegt werden. Dies ist in WordPress ein weiteres Merkmal.

21
Diana

Ich schlage zwei Möglichkeiten vor:

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

Die oben genannten werden 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 Inhalt des Beitrags 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 dem dritten Element in Dianas Snippet entspricht:

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.php -Datei 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; ?>
3
vmassuchetto

der Code scheint vollkommen sicher zu sein. Wie du gesagt hast, hast du kein Bild angehängt an den Beitrag.

Rufen Sie das Medienadministrationsfenster auf und hängen Sie ein Bild an diesen Beitrag an.

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

2
pcarvalho

Ich verstehe, dass dies eine sehr alte Frage ist, aber ich gebe hier meine Antwort, 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 ist.

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 Antworten für die Verwendung von WordPress-Funktionen (Funktionen aus CODEX und Core) geben, um das erste Bild zu erhalten, aber das ist auch das Problem, mit dem ich mich befasse.

Dies ist nicht in jedem 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.

1
Victor

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;
    }
}
0
Mario62RUS