Ottenere la prima immagine dal contenuto del post (es.: immagini hotlink)
Sto utilizzando questo codice direttamente dal 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); // Stampa gli allegati
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">';
}
}
}
Lo richiamo all'interno del loop in questo modo echo_first_image ($post->ID);
La funzione viene chiamata ma non viene mostrato nulla... per quanto posso vedere non c'è nulla in $attachments
Ho un'immagine nel post che sto utilizzando. Non è un'immagine in evidenza né in una galleria, è semplicemente nel post.
Sto facendo qualcosa di sbagliato, o c'è qualcosa che non va nel codice iniziale?

Se vuoi mostrare un'immagine che è inserita nel tuo contenuto (un'immagine hotlinkata, ad esempio), devi usare una funzione come questa (fonte):
Aggiungi nel file 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)){ //Definisce un'immagine predefinita
$first_img = "/images/default.jpg";
}
return $first_img;
}
Poi inserisci <?php echo catch_that_image() ?>
dove vuoi mostrare l'immagine.
Nota: un'immagine hotlinkata inserita semplicemente nel tuo contenuto non può essere impostata come Immagine in evidenza, una funzionalità integrata di WordPress.

Sì, ho visto quel codice in giro... sembra un po' un hack, penseresti che ci dovrebbe essere un modo "WordPress"... Mi chiedo perché devo usare preg_match quando il codex dice che puoi farlo come ho postato sopra. Questa è davvero la mia domanda, onestamente. Il codice che ho postato è sbagliato? ... più che altro che cercare di farlo funzionare. Ma grazie, potrei finire per dover usare questo. Non capisco il significato di "un'immagine appena inserita nel tuo contenuto non può essere impostata come Immagine in evidenza". Questo ha qualche impatto su tutto ciò? Sto solo cercando di visualizzare la prima immagine del post, non l'immagine in evidenza.

C'è una grande differenza tra inserire un link a un'immagine all'interno del contenuto del tuo post/pagina e allegare un'immagine. Puoi allegare un'immagine senza mostrarla affatto. L'esempio nel Codex riguarda ottenere un file allegato al tuo post/pagina, non c'è modo di ottenere un'immagine inserita tramite link, inoltre l'hotlinking non è una funzionalità con cui WP avrà a che fare senza regex PHP.

Riguardo al riferimento nel Codex: come puoi vedere il documento si chiama come il nome della funzione get_childre
, un allegato è un post figlio quindi questo esempio può funzionare solo per contenuti allegati.

Sì, so che posso allegare un'immagine senza inserirla, questa parte è chiara... ma non capisco come si possa inserire un'immagine senza allegarla... quando premo carica/inserisci, carico un file dal mio computer e premo inserisci nel post e aggiorno, poi vado nella libreria media e mi dice che l'immagine che ho caricato è "allegata" al post? ... o stiamo parlando di semantica qui perché capisco quello che dici riguardo a quel pezzo di codice che funziona solo per le immagini allegate.

Puoi collegare direttamente un file immagine da qualsiasi parte. Quando clicchi su Inserisci Immagine/Media, c'è una scheda "Da URL", dove inserisci un URL dell'immagine, ad esempio da un servizio come imageshack. La regex sarà in grado di ottenere questa immagine ("così com'è"), ma WP non sarà in grado di usare questa immagine come Immagine in evidenza, per esempio.

Suggerisco due metodi:
Utilizzando un Plugin
Consiglierei di utilizzare il plugin Get The Image, così potresti fare qualcosa come:
$args = array(
'post_id' => <id>
'image_scan' => true
);
get_the_image($args);
Il codice sopra cercherà di eseguire le operazioni in questo ordine:
- Cercare l'immagine in evidenza del post
- Cercare la prima immagine allegata
- Analizzare il contenuto del post per trovare un'immagine inserita
Creare il supporto nel tuo tema
Tuttavia, sto utilizzando una funzione in un plugin che implementa i primi due punti dell'elenco sopra.
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;
}
Puoi adattarla per includere anche il terzo punto utilizzando lo snippet di Diana:
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;
}
Inserisci queste due funzioni nel tuo file functions.php
e usale nel loop in questo modo:
<?php while (have_posts()) : the_post(); ?>
<?php if ($img_src = find_img_src($post)) : ?>
<img src="<?php echo $img_src; ?>" />
<?php endif; ?>
<?php endwhile; ?>

Il tema sarà in vendita commercialmente, quindi non voglio dire all'utente finale che deve installare un plugin, ma grazie.

Il codice sembra perfettamente sicuro. Come hai detto, non hai alcuna immagine allegata al post.
Considera di andare nel pannello di amministrazione dei media e allegare un'immagine a quel post.
In alternativa, puoi analizzare il contenuto del post con un'espressione regolare per trovare immagini al suo interno.

Ho un fraintendimento su cosa significhi esattamente "allegato"? ... HO un'immagine nel post ... non è allegata quando clicchi 'aggiungi al post'?

Capisco che questa sia una domanda molto vecchia, ma sto inserendo la mia risposta qui poiché la risposta più votata non è adatta per le persone nuove a PHP.
preg_match non è un approccio adatto per analizzare HTML in PHP poiché preg_match è per le espressioni regolari e l'HTML non è un'espressione regolare.
Possiamo invece usare DOM.
function primaImmagine($html){
$dom = new DOMDocument;
$dom->loadHTML($html);
$immagini = $dom->getElementsByTagName('img');
foreach ($immagini as $immagine) {
return $immagine->getAttribute('src');
}
return false;
}
Utilizzare DOM è davvero utile perché puoi fare molte più cose oltre a ottenere semplicemente la prima immagine ed è il modo corretto per analizzare l'HTML.
Vorrei poter fornire una risposta utilizzando le funzioni di WordPress (funzioni dal CODEX e dal core) per ottenere la prima immagine, ma questo è anche il problema con cui sto avendo a che fare.
Questa non è una risposta valida per ogni caso!
Considera il caso dell'ottimizzazione della dimensione delle immagini. In quel caso, non puoi semplicemente usare questo codice perché il post può contenere immagini di qualsiasi dimensione.

Questo codice funziona per me:
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;
}
}

Se stai cercando di trovare l'ID di un allegato con la funzione attachment_url_to_postid dopo aver trovato un'immagine nel contenuto, potresti non trovare quell'ID se l'immagine trovata è una versione ridimensionata dell'originale.
- attachment_url_to_postid potrebbe trovare cats.jpg
- attachment_url_to_postid potrebbe non trovare cats-800x600.jpg
Se non sei preoccupato per immagini con nomi simili, puoi sostituire "-800x600.jpg" utilizzando 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,
);
Puoi anche cercare manualmente l'ID dell'allegato nel database se sei preoccupato per nomi di file fuorvianti (ad esempio, cats-800x600.jpg potrebbe essere una ridimensionamento di un'immagine vecchia di un gatto, mentre l'attuale cats.jpg è in realtà una foto di un'oca).
