Gönderi içeriğinden ilk resmi alın (örneğin: hotlinked görüntüler)


10

Bu kodu doğrudan kodeksinden kullanıyorum .

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

        }
    }
}

Ben döngü içinde böyle diyorum echo_first_image ($post->ID);

Fonksiyon çağırıyor ama hiçbir şey çıktı almıyor ... görebildiğim kadarıyla hiçbir şey yok $attachments

Kullandığım yayında bir resim var. Öne çıkan bir resim veya galeride değil, yalnızca gönderide.

Yanlış bir şey mi yapıyorum yoksa kodda bir sorun mu var?

Yanıtlar:


22

İsterseniz içerik içine yerleştirilen bir resmi görüntülemek (örneğin, bir sıcak linklerini görüntüsü), böyle bir işlevi kullanmak gerekir (kaynak) :

function.php içinde ekleyin :

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

Ardından <?php echo catch_that_image() ?>görüntüyü görüntülemek istediğiniz yere yerleştirin.

Not: İçeriğinize yeni yerleştirilmiş bir hotlink bağlantılı resim, WordPress özelliği olan Öne Çıkan Resim olarak ayarlanamaz.


Evet bu kod etrafında gördüm gördüm ... biraz kesmek gibi görünüyor, bir "WordPress" yolu olacağını düşünürdüm ... Kodeks yapabileceğini söylediğinde neden preg_match kullanmam gerektiğini merak ediyorum yukarıda gönderdiğim gibi. Gerçekten dürüst olmak gerekirse sorum bu. Gönderdiğim kod yanlış mı? ... gerçekten işe yaramaya çalışmaktan daha fazlası. Ama teşekkürler bunu kullanmak zorunda kalabilirim. "İçeriğinize yeni yerleştirilen bir resim Öne Çıkan Resim olarak ayarlanamaz" ın önemini anlamıyorum. Bu bir şekilde bunu etkiler mi? Öne çıkan görüntüyü değil, yalnızca yazının ilk resmini görüntülemeye çalışıyorum.
byronyasgur

Yazı / sayfa içeriğinizin içine resim bağlantısı yerleştirmek ile resim eklemek arasında büyük bir fark vardır. Hiç görüntülemeden bir görüntü ekleyebilirsiniz. Kodeks örneği, yazı / sayfanıza eklenmiş bir dosyayı almakla ilgilidir, bağlantı kurarak içine bir resim yerleştirmenin bir yolu yoktur, ayrıca hotlinking, WP'nin PHP regex olmadan ele alacağı bir özellik değildir.
Diana

COdex başvurusu hakkında: işlev adından sonra dokümanın çağrıldığını görebileceğiniz gibi, ek bir alt gönderidir get_childre, bu nedenle bu örnek yalnızca ekli içerik için çalışabilir.
Diana

Evet Bir görüntüyü eklemeden ekleyebileceğimi biliyorum, bu biraz açık ... ama bir görüntüyü eklemeden nasıl ekleyebileceğinizi bilmiyorum ... upload / insert tuşuna bastığımda bilgisayarımdan bir dosya yükle ve yazıya ekle ve güncelle düğmesine basın ve sonra yüklediğim görüntünün yazıya "ekli" olduğunu söyleyen medya kitaplığı kütüphanesine git? ... yoksa burada anlambilimden mi bahsediyoruz, çünkü yalnızca kod ekli görüntüler için çalışan bu kod parçası hakkında ne söylediğinizi anlıyorum.
byronyasgur

1
Bir görüntü dosyasını istediğiniz yere bağlayabilirsiniz. Resim / Medya Ekle'yi tıkladığınızda, bir resim URL'si (ör. İmageshack hizmeti) bilgilendirdiğiniz bir "URL'den" sekmesi bulunur. Normal ifade bu resmi alabilir ("olduğu gibi"), ancak WP bu resmi Öne Çıkan Resim olarak kullanamaz.
Diana

3

İki yol öneririm:

Eklenti Kullanma

Get The Image eklentisini kullanmayı düşünürdünüz , böylece şöyle bir şey yapabilirsiniz:

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

Yukarıdakiler bu sırayla bir şeyler yapmaya çalışacaktır:

  1. Gönderinin küçük resmini arayın
  2. Eklenen ilk resmi arayın
  3. Eklenen görüntü için gönderi içeriğini tarayın.

Temanızda destek oluşturma

Ancak, yukarıdaki listenin ilk iki öğesini uygulayan bir eklentide bir işlev kullanıyorum .

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

Diana'nın snippet'indeki üçüncü öğeyle de eşleşecek şekilde uyarlayabilirsiniz:

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

Bu iki işlevi functions.phpdosyanıza yapıştırın ve döngüde aşağıdaki gibi kullanın:

<?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 ticari olarak satılmaktır, bu yüzden son kullanıcıya bir eklenti yüklemeleri gerektiğini söylemek istemiyorum, ama teşekkürler.
byronyasgur

@byronyasgur Size iki çözüm verdiğimi açıklığa kavuşturmak için cevabı düzenledi. İkincisini takip etmek için bir eklenti kurmanıza gerek yoktur.
vmassuchetto

2

kod tamamen güvenli görünüyor. Dediğiniz gibi, yayına eklenen herhangi bir görseliniz yok .

Medya yönetici paneline gidip bu gönderiye bir resim ekleyin.

Alternatif olarak, yayın içeriğini içindeki resimler için normal ifadeyle not alın.


"Ekli" ifadenin tam olarak ne anlama geldiğini yanlış anlıyor muyum? .... Mesajda bir resim var mı? 'Yazıyı ekle'yi tıkladığınızda eklenmiyor mu?
byronyasgur

1
Sorunuzdan, mutlaka wp tarafından eklenmeyen bir resme bağlantı veren html kodunu yazdığınız anlaşılıyor.
pcarvalho

1

Bunun çok eski bir soru olduğunu anlıyorum, ancak cevabımı buraya koyuyorum çünkü en çok oy alan cevap PHP'ye yeni gelen insanlar için uygun değil.

preg_match PHP'de HTML'yi ayrıştırmak için iyi bir yaklaşım değildir, çünkü preg_match normal ifade içindir ve HTML normal ifade değildir.

Bunun yerine DOM'u kullanabiliriz.

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

DOM'u kullanmak gerçekten çok iyi çünkü ilk görüntüyü almaktan daha fazlasını yapabilirsiniz ve html'yi ayrıştırmanın doğru yolu.

Ben ilk görüntü almak için wordpress fonksiyonları (CODEX ve çekirdek fonksiyonları) kullanarak cevap koymak isterdim ama aynı zamanda ben uğraşıyorum sorun budur.

Bu her durum için cevap değil!

Görüntü boyutu optimizasyonu durumunu düşünün. Bu durumda, gönderi herhangi bir boyutta resim içerebileceğinden bu kodu kullanamazsınız.


0

Bu kod benim için çalışıyor:

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;
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.