รับภาพแรกจากเนื้อหาโพสต์ (เช่นภาพที่ลิงก์)


10

ฉันกำลังใช้รหัสนี้โดยตรงจาก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">';

        }
    }
}

ฉันเรียกมันว่าภายในวงแบบนี้ echo_first_image ($post->ID);

ฟังก์ชั่นนี้เรียกใช้ แต่ไม่มีอะไรรับเอาท์พุท ... เท่าที่ฉันเห็นว่าไม่มีสิ่งใดเข้ามา $attachments

ฉันมีภาพในโพสต์ที่ฉันใช้ มันไม่ใช่ภาพเด่นหรือในแกลเลอรี่เพียงแค่โพสต์

ฉันกำลังทำอะไรผิดหรือมีบางอย่างผิดปกติกับรหัสในตอนแรกหรือไม่

คำตอบ:


22

หากคุณต้องการแสดงภาพที่แทรกลงในเนื้อหาของคุณ (เช่นรูปภาพที่เชื่อมโยงกัน) คุณต้องใช้ฟังก์ชั่นเช่นนี้(แหล่งที่มา) :

เพิ่มใน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;
}

จากนั้นวาง<?php echo catch_that_image() ?>ตำแหน่งที่คุณต้องการแสดงภาพ

หมายเหตุ: รูปภาพ hotlinked ที่เพิ่งวางในเนื้อหาของคุณไม่สามารถตั้งค่าเป็นภาพเด่น, เป็นคุณลักษณะ WordPress'bultin


ใช่ฉันเคยเห็นโค้ดรอบ ๆ ... ดูเหมือนแฮ็คสักหน่อยคุณคิดว่าจะมีวิธี "WordPress" ... ฉันสงสัยว่าทำไมฉันต้องใช้ preg_match เมื่อ codex บอกว่าคุณทำได้ มันตามที่ฉันโพสต์ข้างต้น นั่นคือคำถามของฉันที่จะซื่อสัตย์ รหัสที่ฉันโพสต์ผิดหรือเปล่า? ... มากไปกว่าการพยายามทำให้มันใช้งานได้จริง แต่ขอบคุณฉันอาจต้องใช้สิ่งนี้ ฉันไม่เข้าใจความสำคัญของ "ภาพที่วางอยู่ในเนื้อหาของคุณไม่สามารถตั้งค่าเป็นภาพเด่น" ไม่ส่งผลกระทบต่อเรื่องนี้ในทางใดทางหนึ่ง ฉันแค่พยายามแสดงภาพแรกจากโพสต์ไม่ใช่ภาพเด่น
byronyasgur

มีความแตกต่างอย่างมากระหว่างการวางลิงค์รูปภาพไว้ในเนื้อหาโพสต์ / หน้าของคุณและแนบรูปภาพ คุณสามารถแนบภาพโดยไม่แสดงภาพเลย ตัวอย่าง Codex เป็นเรื่องเกี่ยวกับการแนบไฟล์ไปยังโพสต์ / หน้าของคุณไม่มีวิธีที่จะได้รับรูปภาพที่อยู่ข้างในโดยการเชื่อมโยงและการเชื่อมโยงด้วยกันไม่ใช่คุณสมบัติที่ WP จะจัดการโดยไม่มี PHP regex
ไดอาน่า

เกี่ยวกับการอ้างอิง COdex: ในขณะที่คุณสามารถเห็นเอกสารนั้นถูกเรียกหลังจากชื่อฟังก์ชั่นget_childreสิ่งที่แนบเป็นโพสต์ลูกดังนั้นตัวอย่างนี้สามารถทำงานกับเนื้อหาที่แนบมาเท่านั้น
Diana

ใช่ฉันรู้ว่าฉันสามารถแนบภาพโดยไม่ต้องแทรกบิตนั้นชัดเจน ... แต่ฉันไม่เห็นวิธีที่คุณสามารถแทรกภาพโดยไม่ต้องแนบ ... เมื่อฉันกดอัปโหลด / แทรกให้อัปโหลดไฟล์จากคอมพิวเตอร์ของฉัน และกดแทรกลงในโพสต์และอัปเดตจากนั้นไปที่ไลบรารีไลบรารีสื่อมันบอกฉันว่าภาพที่ฉันอัปโหลดนั้น "แนบ" กับโพสต์หรือไม่ ... หรือเรากำลังพูดถึงซีแมนทิกส์ที่นี่เพราะฉันเข้าใจสิ่งที่คุณกำลังพูดเกี่ยวกับรหัสบิตนั้นใช้ได้กับรูปภาพที่แนบมาเท่านั้น
byronyasgur

1
คุณสามารถเชื่อมโยงไฟล์ภาพได้ทุกที่ เมื่อคลิกแทรกรูปภาพ / สื่อจะมีแท็บ "จาก URL" ที่คุณแจ้ง URL รูปภาพเช่นบริการ imageshack Regex จะสามารถรับภาพนี้ ("ตามสภาพ") แต่ WP จะไม่สามารถใช้ภาพนี้เป็นภาพที่แนะนำได้
ไดอาน่า

3

ฉันแนะนำสองวิธี:

ใช้ปลั๊กอิน

ฉันจะพิจารณาใช้ปลั๊กอินรับภาพเพื่อให้คุณสามารถทำสิ่งที่ชอบ:

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

ด้านบนจะพยายามทำสิ่งต่าง ๆ ตามลำดับนี้:

  1. ค้นหาภาพขนาดย่อของโพสต์
  2. ค้นหาภาพแรกที่แนบ
  3. สแกนเนื้อหาโพสต์สำหรับภาพที่แทรก

สร้างการสนับสนุนในธีมของคุณ

อย่างไรก็ตามฉันใช้ฟังก์ชันในปลั๊กอินที่ใช้สองรายการแรกของรายการด้านบน

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 ด้วย:

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

เพียงติดฟังก์ชั่นทั้งสองนี้ไว้ในfunctions.phpไฟล์ของคุณแล้วใช้ในลูปดังนี้:

<?php while (have_posts()) : the_post(); ?>
    <?php if ($img_src = find_img_src($post) : ?>
        <img src="<?php echo $img_src; ?>" />
    <?php endif; ?>
<?php endwhile; ?>

ชุดรูปแบบมีไว้สำหรับขายในเชิงพาณิชย์ดังนั้นฉันไม่ต้องการบอกผู้ใช้ว่าต้องติดตั้งปลั๊กอิน แต่ขอบคุณ
byronyasgur

@byronyasgur แก้ไขคำตอบเพื่อชี้แจงว่าฉันให้ทางออกสองทางแก่คุณ คุณไม่จำเป็นต้องติดตั้งปลั๊กอินเพื่อติดตามอันที่สอง
vmassuchetto

2

รหัสดูเหมือนปลอดภัยอย่างสมบูรณ์ อย่างที่คุณพูดคุณไม่มีภาพที่แนบมากับโพสต์

พิจารณาไปที่แผงผู้ดูแลสื่อและแนบภาพไปที่โพสต์นั้น

หรือมิฉะนั้นให้คัดลอกเนื้อหาโพสต์ด้วย regex สำหรับรูปภาพในนั้น


ฉันมีความเข้าใจผิดในสิ่งที่ "แนบ" หมายถึงอะไรกันแน่? .... ฉันมีภาพในโพสต์ ... มันไม่ได้แนบมาเมื่อคุณคลิก 'เพิ่มในโพสต์'?
byronyasgur

1
จากคำถามของคุณดูเหมือนว่าคุณพิมพ์รหัส html ที่เชื่อมโยงไปยังรูปภาพที่ไม่จำเป็นต้องใช้ wp
pcarvalho

1

ฉันเข้าใจว่านี่เป็นคำถามที่เก่ามาก แต่ฉันกำลังวางคำตอบของฉันที่นี่เนื่องจากคำตอบที่โหวตส่วนใหญ่ไม่เหมาะสำหรับผู้ที่เพิ่งเริ่มใช้ PHP

preg_match ไม่ใช่วิธีที่ดีในการแยกวิเคราะห์ HTML ใน PHP เนื่องจาก preg_match ใช้สำหรับการแสดงออกปกติและ HTML ไม่ใช่การแสดงออกปกติ

เราสามารถใช้ DOM แทน

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

การใช้ DOM นั้นดีมากเพราะคุณสามารถทำสิ่งต่าง ๆ ได้มากกว่าแค่รับภาพแรกและมันก็เป็นวิธีที่ถูกต้องในการแยกวิเคราะห์ HTML

ฉันหวังว่าฉันสามารถตอบสำหรับการใช้ฟังก์ชั่น wordpress (ฟังก์ชั่นจาก CODEX และหลัก) เพื่อให้ได้ภาพแรก แต่นั่นก็เป็นปัญหาที่ฉันกำลังเผชิญอยู่

นี่ไม่ใช่คำตอบสำหรับทุกกรณี!

พิจารณากรณีของการปรับขนาดภาพให้เหมาะสมที่สุด ในกรณีนี้คุณไม่สามารถใช้รหัสนี้ได้เนื่องจากโพสต์สามารถมีภาพทุกขนาด


0

รหัสนี้เหมาะกับฉัน:

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;
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.