Ottenere la prima immagine dal contenuto del post (es.: immagini hotlink)

31 lug 2012, 05:20:13
Visualizzazioni: 39.3K
Voti: 13

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?

0
Tutte le risposte alla domanda 6
6
30

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.

31 lug 2012 09:26:30
Commenti

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.

byronyasgur byronyasgur
31 lug 2012 22:06:39

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.

Diana Diana
1 ago 2012 01:52:53

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.

Diana Diana
1 ago 2012 02:01:03

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.

byronyasgur byronyasgur
1 ago 2012 03:01:19

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.

Diana Diana
1 ago 2012 05:37:02

Solo qualche informazione aggiuntiva qui, puoi "allegare" un'immagine al Post #1, ma usarla comunque nel Post #2. Anche se è usata nel Post #2, è allegata al Post #1 quindi non verrebbe mostrata tramite wp_get_attachment_url

Nathan Nathan
15 giu 2016 03:28:44
Mostra i restanti 1 commenti
2

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:

  1. Cercare l'immagine in evidenza del post
  2. Cercare la prima immagine allegata
  3. 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; ?>
31 lug 2012 14:37:27
Commenti

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

byronyasgur byronyasgur
31 lug 2012 22:11:39

@byronyasgur Ho modificato la risposta per chiarire che ti ho dato due soluzioni. Non è necessario installare un plugin per seguire la seconda.

vmassuchetto vmassuchetto
1 ago 2012 00:41:59
2

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.

31 lug 2012 05:41:36
Commenti

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

byronyasgur byronyasgur
31 lug 2012 22:04:47

dalla tua domanda, sembrava che tu avessi digitato il codice html che rimanda a un'immagine non necessariamente allegata da wp.

pcarvalho pcarvalho
1 ago 2012 05:57:41
1

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.

28 apr 2018 17:40:05
Commenti

"preg_match non è un approccio valido per analizzare l'HTML in PHP dato che preg_match è per le espressioni regolari e l'HTML non è un'espressione regolare." non è vero -- qualsiasi cosa con del testo può essere analizzata tramite Espressioni Regolari

bresson bresson
3 gen 2021 19:15:54
0

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

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.

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

22 mag 2022 19:53:01