Dapatkan gambar pertama dari konten posting (mis .: gambar hotlink)

10

Saya menggunakan kode ini langsung dari 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">';

        }
    }
}

Saya menyebutnya dalam loop seperti ini echo_first_image ($post->ID);

Fungsi ini memanggil tetapi tidak ada yang mendapat output ... sejauh yang saya bisa lihat tidak ada di dalamnya $attachments

Saya memiliki gambar di postingan yang saya gunakan. Ini bukan gambar unggulan atau di galeri, hanya di pos.

Apakah saya melakukan sesuatu yang salah, atau ada sesuatu yang salah dengan kode itu?

byronyasgur
sumber

Jawaban:

22

Jika Anda ingin menampilkan gambar yang dimasukkan ke dalam konten Anda (gambar hotlink, misalnya), Anda harus menggunakan fungsi seperti ini (sumber) :

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

Lalu tempatkan di <?php echo catch_that_image() ?>mana Anda ingin menampilkan gambar.

Catatan: gambar hotlink yang baru saja ditempatkan di konten Anda tidak dapat ditetapkan sebagai Featured Image, fitur WordPress bultin.

Diana
sumber
Ya saya telah melihat kode itu di sekitar ... sepertinya sedikit hack, Anda akan berpikir akan ada cara "WordPress" ... Saya ingin tahu mengapa saya perlu menggunakan preg_match ketika codex mengatakan Anda bisa melakukan seperti yang saya posting di atas. Itu pertanyaan saya benar-benar jujur. Apakah kode yang saya posting salah? ... lebih daripada mencoba membuatnya benar-benar bekerja. Tapi terima kasih saya akhirnya harus menggunakan ini. Saya tidak mengerti pentingnya "gambar yang baru saja ditempatkan di konten Anda tidak dapat ditetapkan sebagai Gambar Unggulan". Apakah itu berdampak pada ini dalam beberapa cara. Saya hanya mencoba menampilkan gambar pertama dari pos, bukan gambar unggulan.
byronyasgur
Ada perbedaan besar antara menempatkan tautan gambar di dalam konten posting / halaman Anda dan melampirkan gambar. Anda dapat melampirkan gambar tanpa menampilkannya sama sekali. Contoh codex adalah tentang mendapatkan file yang dilampirkan ke posting / halaman Anda, tidak ada cara untuk mendapatkan gambar ditempatkan di dalamnya dengan menautkan, juga hotlinking bukan fitur WP akan berurusan dengan tanpa regex PHP.
Diana
Tentang referensi COdex: karena Anda dapat melihat dokumen dipanggil setelah nama fungsi get_childre, lampiran adalah posting anak-anak jadi contoh ini hanya dapat berfungsi untuk konten yang dilampirkan.
Diana
Ya saya tahu saya bisa melampirkan gambar tanpa memasukkannya, bit itu jelas ... tapi saya tidak melihat bagaimana Anda bisa memasukkan gambar tanpa melampirkannya ... ketika saya menekan unggah / masukkan, unggah file dari komputer saya dan tekan masukkan ke dalam posting dan perbarui kemudian pergi ke perpustakaan perpustakaan media itu memberitahu saya bahwa gambar yang saya unggah "terlampir" ke posting? ... atau kita berbicara semantik di sini karena saya mengerti apa yang Anda katakan tentang sedikit kode yang hanya berfungsi untuk gambar terlampir.
byronyasgur
1
Anda dapat melakukan hotlink file gambar di mana saja. Ketika mengklik Sisipkan Gambar / Media, ada tab "Dari URL", di mana Anda menginformasikan URL gambar, yaitu layanan imageshack. Regex akan bisa mendapatkan gambar ini ("sebagaimana adanya"), tetapi WP tidak akan dapat menggunakan gambar ini sebagai Gambar Unggulan, misalnya.
Diana
3

Saya menyarankan dua cara:

Menggunakan Plugin

Saya akan mempertimbangkan untuk menggunakan plugin Get The Image , sehingga Anda dapat melakukan sesuatu seperti:

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

Di atas akan mencoba melakukan hal-hal dalam urutan ini:

  1. Cari thumbnail posting
  2. Cari gambar terlampir pertama
  3. Pindai konten posting untuk gambar yang dimasukkan.

Membangun dukungan dalam tema Anda

Namun, saya menggunakan fungsi dalam plugin yang mengimplementasikan dua item pertama dari daftar di atas.

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

Anda dapat menyesuaikannya agar juga cocok dengan item ketiga dalam cuplikan 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;
}

Cukup tempelkan kedua fungsi ini di functions.phpfile Anda dan gunakan di loop seperti:

<?php while (have_posts()) : the_post(); ?>
    <?php if ($img_src = find_img_src($post) : ?>
        <img src="<?php echo $img_src; ?>" />
    <?php endif; ?>
<?php endwhile; ?>
vmassuchetto
sumber
Tema akan dijual secara komersial jadi saya tidak ingin memberi tahu pengguna akhir bahwa mereka harus memasang plugin, tapi terima kasih.
byronyasgur
@byronyasgur Mengedit jawaban untuk menjelaskan bahwa saya memberi Anda dua solusi. Anda tidak perlu menginstal plugin untuk mengikuti yang kedua.
vmassuchetto
2

kode ini tampaknya sangat aman. seperti yang Anda katakan, Anda tidak memiliki gambar yang dilampirkan pada pos.

Coba buka panel admin media dan lampirkan gambar ke posting itu.

Bergantian, memo konten posting dengan regex untuk gambar di dalamnya.

pcarvalho
sumber
Apakah saya memiliki kesalahpahaman tentang apa yang sebenarnya berarti "melekat"? .... SAYA MEMILIKI gambar di posting ... apakah itu tidak dilampirkan ketika Anda mengklik 'tambahkan ke posting'?
byronyasgur
1
dari pertanyaan Anda, sepertinya Anda mengetikkan kode html yang menghubungkan ke gambar yang belum tentu dilampirkan oleh wp.
pcarvalho
1

Saya mengerti ini adalah pertanyaan yang sangat lama, tetapi saya meletakkan jawaban saya di sini karena jawaban yang paling banyak dipilih tidak cocok untuk orang yang baru mengenal PHP.

preg_match bukan pendekatan yang baik untuk parsing HTML dalam PHP karena preg_match adalah untuk ekspresi reguler dan HTML bukan ekspresi reguler.

Kita bisa menggunakan DOM saja.

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

Menggunakan DOM benar-benar baik karena Anda dapat melakukan lebih banyak hal selain hanya mendapatkan gambar pertama dan ini adalah cara yang tepat untuk mem-parsing html.

Saya berharap saya dapat memberikan jawaban untuk menggunakan fungsi wordpress (fungsi dari CODEX dan inti) untuk mendapatkan gambar pertama tetapi itu juga masalah yang saya hadapi.

Ini bukan jawaban untuk setiap kasus!

Pertimbangkan kasus optimasi ukuran gambar. Dalam hal ini, Anda tidak dapat hanya menggunakan kode ini karena kiriman dapat berisi ukuran gambar apa pun.


sumber
0

Kode ini berfungsi untuk saya:

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