Obține prima imagine din conținutul articolului (de ex.: imagini hotlink)
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?

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.

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.

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.

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.

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.

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.

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:
- Caută thumbnail-ul articolului
- Caută prima imagine atașată
- 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; ?>

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.

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'?

Î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.

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

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.
- attachment_url_to_postid poate găsi cats.jpg
- attachment_url_to_postid s-ar putea să nu găsească cats-800x600.jpg
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ă).
