Ottieni la prima immagine dal contenuto del post (ad es .: immagini hotlinked)


10

Sto usando questo codice direttamente dal codice .

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

        }
    }
}

Lo chiamo all'interno del ciclo in questo modo echo_first_image ($post->ID);

La funzione chiama ma non viene emesso nulla ... per quanto posso vedere non c'è nulla in $attachments

Ho un'immagine nel post che sto usando. Non è un'immagine in primo piano o in una galleria, solo nel post.

Sto facendo qualcosa di sbagliato o c'è qualcosa di sbagliato nel codice in primo luogo?

Risposte:


22

Se si desidera visualizzare un'immagine inserita nel contenuto (un'immagine hotlink, ad esempio), è necessario utilizzare una funzione come questa (fonte) :

aggiungi in 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)){ //Defines a default image
    $first_img = "/images/default.jpg";
  }
  return $first_img;
}

Quindi posizionare <?php echo catch_that_image() ?>dove si desidera visualizzare l'immagine.

Nota: un'immagine hotlink appena inserita nei tuoi contenuti non può essere impostata come Immagine in primo piano, una caratteristica di WordPress di bultin.


Sì, ho visto quel codice in giro ... sembra un po 'un trucco, penseresti che ci sarebbe un modo "WordPress" ... Mi chiedo perché devo usare preg_match quando il codice dice che puoi fare come ho postato sopra. Questa è davvero la mia domanda. Il codice che ho pubblicato è sbagliato? ... più che cercare di farlo funzionare davvero. Ma grazie potrei finire per doverlo usare. Non capisco il significato di "un'immagine appena inserita nei tuoi contenuti non può essere impostata come Immagine in primo piano". Questo ha un impatto su questo in qualche modo. Sto solo cercando di visualizzare la prima immagine dal post, non l'immagine in primo piano.
byronyasgur,

C'è una grande differenza tra posizionare un link immagine all'interno del contenuto di un post / pagina e allegare un'immagine. È possibile allegare un'immagine senza visualizzarla affatto. L'esempio del codice riguarda come ottenere un file allegato al tuo post / pagina, non c'è modo di inserire un'immagine all'interno di un collegamento, inoltre il hotlinking non è una funzionalità che WP tratterà senza regex PHP.
Diana,

Informazioni sul riferimento COdex: come puoi vedere, il documento viene chiamato dopo il nome della funzione get_childre, un allegato è un post secondario quindi questo esempio può funzionare solo per il contenuto allegato.
Diana,

Sì, lo so che posso allegare un'immagine senza inserirla, quel bit è chiaro ... ma non vedo come puoi inserire un'immagine senza allegarla ... quando premo upload / insert, carica un file dal mio computer e premi inserisci in post e aggiorna quindi vai alla libreria della libreria multimediale mi dice che l'immagine che ho caricato è "allegata" al post? ... o stiamo parlando di semantica qui perché capisco cosa stai dicendo su quel pezzo di codice che funziona solo per le immagini allegate.
byronyasgur,

1
È possibile collegare a caldo un file di immagine ovunque. Quando si fa clic su Inserisci immagine / supporto, c'è una scheda "Da URL", in cui si informa un URL di immagine, ad esempio il servizio imageshack. Il regex sarà in grado di ottenere questa immagine ("così com'è"), ma WP non sarà in grado di usare questa immagine come Immagine in primo piano, per esempio.
Diana,

3

Suggerisco due modi:

Utilizzando un plugin

Vorrei prendere in considerazione l'utilizzo del plug-in Get The Image , in modo da poter fare qualcosa del tipo:

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

Quanto sopra proverà a fare le cose in questo ordine:

  1. Cerca l'anteprima del post
  2. Cerca la prima immagine allegata
  3. Scansiona il contenuto del post per un'immagine inserita.

Costruire supporto nel tuo tema

Tuttavia, sto usando una funzione in un plugin che implementa i primi due elementi 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 adattarlo per abbinare anche il terzo elemento nello 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);
        $img = $img[0];
    }
    return $img;
}

Basta inserire queste due funzioni nel functions.phpfile e usarle nel ciclo come:

<?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 è in vendita commercialmente, quindi non voglio dire all'utente finale che devono installare un plugin, ma grazie.
byronyasgur,

@byronyasgur Modificato la risposta per chiarire che ti ho dato due soluzioni. Non è necessario installare un plug-in per seguire il secondo.
vmassuchetto,

2

il codice sembra perfettamente sicuro. come hai detto, non hai alcuna immagine allegata al post.

Prendi in considerazione l'idea di accedere al pannello di amministrazione multimediale e allegare un'immagine a quel post.

In alternativa, scarta il contenuto del post con una regex per le immagini al suo interno.


Ho un malinteso su cosa significhi esattamente "in allegato"? .... Ho un'immagine nel post ... non è allegata quando fai clic su "aggiungi al post"?
byronyasgur,

1
dalla tua domanda, sembra che tu abbia digitato il codice html che si collega a un'immagine non necessariamente allegata da wp.
pcarvalho,

1

Capisco che questa è una domanda molto antica, ma sto inserendo la mia risposta qui poiché la risposta più votata non è appropriata per le persone che non conoscono PHP.

preg_match non è un buon approccio per analizzare HTML in PHP poiché preg_match è per un'espressione regolare e HTML non è un'espressione regolare.

Possiamo invece usare DOM.

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

L'utilizzo di DOM è davvero positivo poiché puoi fare più cose oltre a ottenere la prima immagine ed è il modo giusto per analizzare HTML.

Vorrei poter dare una risposta per l'utilizzo delle funzioni wordpress (funzioni di CODEX e core) per ottenere la prima immagine, ma questo è anche il problema che sto affrontando.

Questa non è una risposta per ogni caso!

Considera il caso dell'ottimizzazione delle dimensioni dell'immagine. In tal caso, non puoi semplicemente usare questo codice perché il post può contenere qualsiasi dimensione dell'immagine.


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;
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.