Uzyskaj pierwszy obraz z treści postu (np .: obrazy z linkami)

10

Używam tego kodu bezpośrednio z kodeksu .

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">';

        }
    }
}

Nazywam to tak w pętli echo_first_image ($post->ID);

Funkcja wywołuje, ale nic nie jest wyprowadzane ... o ile widzę, że nic nie ma $attachments

Mam post w obrazie, którego używam. To nie jest wyróżniony obraz ani galeria, tylko post.

Czy robię coś złego, czy też coś jest nie tak z kodem?

byronyasgur
źródło

Odpowiedzi:

22

Jeśli chcesz wyświetlić obraz, który jest wstawiony do treści (na przykład obraz z odnośnikiem), musisz użyć funkcji takiej jak ta (źródło) :

dodaj funkcje.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;
}

Następnie miejsce, w <?php echo catch_that_image() ?>którym chcesz wyświetlić obraz.

Uwaga: umieszczonego w treści obrazu połączonego za pomocą linku nie można ustawić jako wyróżnionego obrazu, co jest cechą WordPress.

Diana
źródło
Tak, widziałem ten kod ... wydaje się trochę włamaniem, można by pomyśleć, że istnieje sposób „WordPress”… Zastanawiam się, dlaczego muszę używać preg_match, gdy kodeks mówi, że możesz to zrobić jak napisałem powyżej. To naprawdę moje pytanie. Czy kod, który napisałem, jest nieprawidłowy? ... bardziej niż staranie się, aby naprawdę działało. Ale dziękuję, że może będę musiał z tego skorzystać. Nie rozumiem znaczenia, że ​​„obrazu właśnie umieszczonego w treści nie można ustawić jako wyróżnionego obrazu”. Czy to w jakiś sposób wpływa na to. Próbuję tylko wyświetlić pierwsze zdjęcie z posta, a nie wyróżnione zdjęcie.
byronyasgur
Istnieje duża różnica między umieszczeniem linku do obrazu w treści postu / strony a załączeniem obrazu. Możesz dołączyć obraz w ogóle go nie wyświetlając. Przykład kodeksu dotyczy załączenia pliku do twojego posta / strony, nie ma sposobu na umieszczenie w nim obrazu poprzez linkowanie, również hotlinkowanie nie jest funkcją, z którą WP poradzi sobie bez wyrażenia regularnego PHP.
Diana
Informacje na temat odwołania do COdex: jak widać dokument jest wywoływany po nazwie funkcji get_childre, załącznik jest postem podrzędnym, więc ten przykład może działać tylko w przypadku załączonej treści.
Diana,
Tak, wiem, że mogę załączyć obraz bez wstawiania go, ten bit jest czysty ... ale nie widzę, jak można wstawić obraz bez dołączania go ... kiedy naciskam przycisk upload / insert, prześlij plik z mojego komputera i wciśnij wstaw do posta i zaktualizuj, a następnie przejdź do biblioteki biblioteki multimediów, gdzie powie mi, że obraz, który przesłałem, jest „dołączony” do posta? ... czy mówimy tutaj o semantyce, ponieważ rozumiem, co mówisz o tym fragmencie kodu działającym tylko dla załączonych obrazów.
byronyasgur
1
Możesz połączyć obraz z plikiem w dowolnym miejscu. Po kliknięciu przycisku Wstaw obraz / nośnik pojawia się zakładka „Z adresu URL”, w której podajesz adres URL obrazu, tj. Usługę imagehack. Wyrażenie regularne będzie w stanie uzyskać ten obraz („jak jest”), ale WP nie będzie mogło na przykład użyć tego obrazu jako wyróżnionego obrazu.
Diana
3

Proponuję dwa sposoby:

Korzystanie z wtyczki

Zastanowiłbym się nad użyciem wtyczki Get The Image , abyś mógł zrobić coś takiego:

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

Powyżej spróbuje zrobić rzeczy w tej kolejności:

  1. Poszukaj miniatury postu
  2. Poszukaj pierwszego załączonego obrazu
  3. Zeskanuj treść posta, aby wstawić obraz.

Budowanie wsparcia w Twoim motywie

Jednak używam funkcji we wtyczce, która implementuje dwa pierwsze elementy powyższej listy.

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

Możesz go dostosować tak, aby pasował również do trzeciego elementu we fragmencie Diany:

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

Wystarczy umieścić te dwie funkcje w functions.phppliku i użyć ich w pętli, takich jak:

<?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
źródło
Motyw ma być na sprzedaż komercyjny, więc nie chcę powiedzieć użytkownikowi końcowemu, że musi zainstalować wtyczkę, ale dzięki.
byronyasgur
@byronyasgur Edytowałem odpowiedź, aby wyjaśnić, że dałem wam dwa rozwiązania. Nie musisz instalować wtyczki, aby postępować zgodnie z drugą.
vmassuchetto
2

kod wydaje się całkowicie bezpieczny. jak powiedziałeś, nie masz żadnego obrazu dołączonego do postu.

Rozważ przejście do panelu administracyjnego multimediów i dołączenie obrazu do tego postu.

Alternatywnie, zeskrob treść postu za pomocą wyrażenia regularnego dla zawartych w nim obrazów.

pcarvalho
źródło
Czy mam niezrozumienie, co dokładnie oznacza „przywiązany”? .... Mam obraz w poście ... czy nie jest dołączany po kliknięciu „dodaj do wpisu”?
byronyasgur
1
z twojego pytania wydawało się, że wpisałeś kod html prowadzący do obrazu niekoniecznie dołączonego przez wp.
pcarvalho
1

Rozumiem, że to bardzo stare pytanie, ale zamieszczam tutaj swoją odpowiedź, ponieważ większość głosowanych odpowiedzi nie jest odpowiednia dla osób, które dopiero zaczynają pracę z PHP.

preg_match nie jest dobrym podejściem do analizowania HTML w PHP, ponieważ preg_match służy do wyrażenia regularnego, a HTML nie jest wyrażeniem regularnym.

Zamiast tego możemy użyć DOM.

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

Używanie DOM jest naprawdę dobre, ponieważ możesz zrobić coś więcej niż tylko uzyskanie pierwszego obrazu i jest to dobry sposób na przeanalizowanie HTML.

Chciałbym móc znaleźć odpowiedź na temat korzystania z funkcji wordpress (funkcje z CODEX-a i rdzenia), aby uzyskać pierwszy obraz, ale jest to również problem, z którym mam do czynienia.

To nie jest odpowiedź na każdy przypadek!

Rozważ przypadek optymalizacji rozmiaru obrazu. W takim przypadku nie możesz po prostu użyć tego kodu, ponieważ post może zawierać dowolny rozmiar obrazu.


źródło
0

Ten kod działa dla mnie:

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
źródło