Obține prima imagine din conținutul articolului (de ex.: imagini hotlink)

31 iul. 2012, 05:20:13
Vizualizări: 39.3K
Voturi: 13

Folosesc acest cod direct din 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">';

        }
    }
}

Îl apelez în interiorul buclei astfel: echo_first_image ($post->ID);

Funcția este apelată dar nu se afișează nimic... din câte pot vedea nu există nimic în $attachments

Am o imagine în articolul pe care îl folosesc. Nu este o imagine reprezentativă și nici nu face parte dintr-o galerie, este doar în articol.

Fac ceva greșit sau există o problemă cu codul în primul rând?

0
Toate răspunsurile la întrebare 6
6
30

Dacă dorești să afișezi o imagine care este inserată în conținutul tău (de exemplu, o imagine încărcată direct prin link), trebuie să utilizezi o funcție precum aceasta (sursă):

Adaugă în 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)){ // Definește o imagine implicită
    $first_img = "/images/default.jpg";
  }
  return $first_img;
}

Apoi plasează <?php echo catch_that_image() ?> în locul unde dorești să afișezi imaginea.

Notă: o imagine încărcată direct în conținut nu poate fi setată ca Featured Image (imagine reprezentativă), o funcționalitate integrată în WordPress.

31 iul. 2012 09:26:30
Comentarii

Da, am văzut acel cod pe ici-colo... pare un pic cam hack, ai crede că ar exista o metodă "WordPress"... Mă întreb de ce trebuie să folosesc preg_match când codex spune că poți face așa cum am postat mai sus. Asta e întrebarea mea, sincer să fiu. Este codul pe care l-am postat greșit? ... mai degrabă decât încercând să-l fac funcțional. Dar mulțumesc, poate voi ajunge să-l folosesc. Nu înțeleg semnificația "o imagine plasată în conținut nu poate fi setată ca Featured Image". Are asta vreo legătură cu acest lucru? Eu doar încerc să afișez prima imagine din postare, nu featured image.

byronyasgur byronyasgur
31 iul. 2012 22:06:39

Există o diferență mare între a plasa un link de imagine în conținutul postării/paginii și a atașa o imagine. Poți atașa o imagine fără să o afișezi deloc. Exemplul din Codex este despre obținerea unui fișier atașat la postarea/pagina ta, nu există nicio modalitate de a obține o imagine plasată în interior prin simplul link, iar hotlinking nu este o funcționalitate cu care WP se va ocupa fără regex PHP.

Diana Diana
1 aug. 2012 01:52:53

Referitor la referința Codex: după cum poți vedea, documentația se numește după numele funcției get_childre, un atașament este un post copil, așa că acest exemplu poate funcționa doar pentru conținut atașat.

Diana Diana
1 aug. 2012 02:01:03

Da, știu că pot atașa o imagine fără să o inserez, această parte este clară... dar nu înțeleg cum poți insera o imagine fără să o atașezi... când apăs upload/insert, încărc un fișier de pe computerul meu și apăs insert into post și update, apoi merg la media library și îmi spune că imaginea pe care am încărcat-o este "atașată" postării? ... sau vorbim despre semantică aici, pentru că înțeleg ce spui despre faptul că acel fragment de cod funcționează doar pentru imaginile atașate.

byronyasgur byronyasgur
1 aug. 2012 03:01:19

Poți să legi (hotlink) un fișier imagine de oriunde. Când apeși Insert Image/Media, există un tab "From URL", unde introduci un URL al imaginii, de ex. de pe serviciul imageshack. Regex-ul va putea prelua această imagine ("așa cum este"), dar WP nu va putea folosi această imagine ca Featured Image, de exemplu.

Diana Diana
1 aug. 2012 05:37:02

Doar câteva informații suplimentare aici, poți "atașa" o imagine la Post #1, dar să o folosești totuși în Post #2. Chiar dacă este folosită în Post #2, ea este atașată la Post #1, așa că nu va apărea prin wp_get_attachment_url

Nathan Nathan
15 iun. 2016 03:28:44
Arată celelalte 1 comentarii
2

Vă sugerez două metode:

Utilizarea unui Plugin

Aș recomanda folosirea plugin-ului Get The Image, astfel încât să puteți face ceva de genul:

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

Codul de mai sus va încerca să facă următoarele în această ordine:

  1. Caută thumbnail-ul articolului
  2. Caută prima imagine atașată
  3. Scanează conținutul articolului pentru o imagine inserată.

Implementarea suportului în tema dumneavoastră

Cu toate acestea, eu folosesc o funcție într-un plugin care implementează primele două puncte din lista de mai sus.

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

Puteți adapta funcția pentru a include și al treilea punct folosind snippet-ul Dianei:

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);
        if ($img) {
            $img = $img[0];
        }
    }
    return $img;
}

Adăugați aceste două funcții în fișierul functions.php și folosiți-le în loop astfel:

<?php while (have_posts()) : the_post(); ?>
    <?php if ($img_src = find_img_src($post)) : ?>
        <img src="<?php echo $img_src; ?>" />
    <?php endif; ?>
<?php endwhile; ?>
31 iul. 2012 14:37:27
Comentarii

Tema este destinată vânzării comerciale, așa că nu vreau să-i spun utilizatorului final că trebuie să instaleze un plugin, dar mulțumesc.

byronyasgur byronyasgur
31 iul. 2012 22:11:39

@byronyasgur Am editat răspunsul pentru a clarifica că ți-am oferit două soluții. Nu este necesar să instalezi un plugin pentru a urma a doua soluție.

vmassuchetto vmassuchetto
1 aug. 2012 00:41:59
2

codul pare perfect sigur. cum ai spus, nu ai nicio imagine atașată la articol.

Ia în considerare să mergi în panoul de administrare media și să atașezi o imagine la acel articol.

Alternativ, poți extrage conținutul articolului cu un regex pentru imagini în el.

31 iul. 2012 05:41:36
Comentarii

Am o neînțelegere în legătură cu ce înseamnă exact "atasat"? ... AM o imagine în postare ... nu este ea atasată când apeși 'adaugă în postare'?

byronyasgur byronyasgur
31 iul. 2012 22:04:47

din întrebarea ta, se părea că ai tastat manual codul html care face legătura către o imagine care nu e neapărat atașată prin wp.

pcarvalho pcarvalho
1 aug. 2012 05:57:41
1

Înțeleg că aceasta este o întrebare foarte veche, dar îmi postez răspunsul aici deoarece cel mai votat răspuns nu este potrivit pentru persoanele noi în PHP.

preg_match nu este o abordare bună pentru parsarea HTML în PHP, deoarece preg_match este pentru expresii regulate, iar HTML nu este o expresie regulată.

Putem folosi în schimb DOM.

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

Utilizarea DOM este foarte bună, deoarece poți face mai multe lucruri în afară de obținerea primei imagini și este modul corect de a parsa HTML.

Aș fi dorit să pot oferi un răspuns care să utilizeze funcții WordPress (funcții din CODEX și nucleu) pentru a obține prima imagine, dar aceasta este și problema cu care mă confrunt.

Acesta nu este un răspuns pentru orice caz!

Luați în considerare cazul optimizării dimensiunii imaginilor. În acest caz, nu poți folosi pur și simplu acest cod, deoarece postarea poate conține imagini de orice dimensiune.

28 apr. 2018 17:40:05
Comentarii

"preg_match nu este o abordare bună pentru parsarea HTML în PHP, deoarece preg_match este pentru expresii regulate, iar HTML nu este o expresie regulată." nu este adevărat – orice text poate fi parsabil cu Expresii Regulate

bresson bresson
3 ian. 2021 19:15:54
0

Acest cod funcționează pentru mine:

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;
    }
}
24 sept. 2018 17:45:41
0

Dacă încerci să găsești ID-ul postului de atașament folosind attachment_url_to_postid după ce ai găsit o imagine în conținut, este posibil să nu găsești acel ID dacă imaginea găsită este o versiune redimensionată a imaginii originale.

Dacă nu te îngrijorează imaginile cu nume similare, poți înlocui "-800x600.jpg" folosind preg_replace:

$first_img_url_unscaled = preg_replace(
   '/-\d+x\d+\.(jpg|jpeg|gif|png|svg|tiff|webp|heif|heic)$/i',
   '.${1}',
   $first_img_url,
);

De asemenea, poți căuta manual în baza de date ID-ul atașamentului dacă ești preocupat de nume de fișiere care ar putea induce în eroare (de exemplu, cats-800x600.jpg ar putea fi o redimensionare a unei vechi imagini cu pisici, iar actuala cats.jpg este de fapt o poză cu o gâscă).

22 mai 2022 19:53:01