Nhận hình ảnh đầu tiên từ nội dung bài đăng (ví dụ: hình ảnh được liên kết nóng)


10

Tôi đang sử dụng mã này trực tiếp từ 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">';

        }
    }
}

Tôi gọi nó trong vòng lặp như thế này echo_first_image ($post->ID);

Hàm này gọi nhưng không có gì nhận được đầu ra ... theo như tôi có thể thấy không có gì trong $attachments

Tôi có một hình ảnh trong bài tôi đang sử dụng. Đây không phải là một hình ảnh đặc trưng hoặc trong một bộ sưu tập, chỉ trong bài viết.

Tôi đang làm gì đó sai, hoặc có gì đó sai với mã ở nơi đầu tiên?

Câu trả lời:


22

Nếu bạn muốn hiển thị một hình ảnh được chèn vào nội dung của bạn (ví dụ như một hình ảnh được liên kết nóng), bạn phải sử dụng một chức năng như thế này (nguồn) :

thêm vào hàm.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;
}

Sau đó, <?php echo catch_that_image() ?>nơi bạn muốn hiển thị hình ảnh.

Lưu ý: hình ảnh được liên kết nóng vừa được đặt trong nội dung của bạn không thể được đặt thành Hình ảnh nổi bật, tính năng bultin WordPress.


Có, tôi đã thấy mã xung quanh ... có vẻ như là một chút hack, bạn nghĩ rằng sẽ có cách "WordPress" ... Tôi tự hỏi tại sao tôi cần sử dụng preg_match khi codex nói bạn có thể làm như tôi đã đăng ở trên Đó là câu hỏi của tôi thực sự phải trung thực. Là mã mà tôi đăng sai? ... nhiều hơn là cố gắng làm cho nó hoạt động thực sự. Nhưng cảm ơn tôi cuối cùng có thể phải sử dụng này. Tôi không hiểu tầm quan trọng của "một hình ảnh vừa được đặt trong nội dung của bạn không thể được đặt là Hình ảnh nổi bật". Điều đó có ảnh hưởng đến điều này theo một cách nào đó. Tôi chỉ cố gắng hiển thị hình ảnh đầu tiên từ bài đăng, không phải hình ảnh đặc trưng.
byronyasgur

Có một sự khác biệt lớn giữa việc đặt một liên kết hình ảnh bên trong nội dung bài đăng / trang của bạn và đính kèm một hình ảnh. Bạn có thể đính kèm một hình ảnh mà không hiển thị nó cả. Ví dụ về Codex là về việc lấy một tệp được đính kèm vào bài đăng / trang của bạn, không có cách nào để có được một hình ảnh được đặt bên trong bằng cách liên kết, còn hotlinking không phải là một tính năng mà WP sẽ xử lý nếu không có regex PHP.
Diana

Về tham chiếu COdex: như bạn có thể thấy tài liệu được gọi sau tên hàm get_childre, tệp đính kèm là một bài đăng con nên ví dụ này chỉ có thể hoạt động cho nội dung đính kèm.
Diana

Có Tôi biết tôi có thể đính kèm hình ảnh mà không cần chèn nó, bit đó rất rõ ràng ... nhưng tôi không thấy cách bạn có thể chèn hình ảnh mà không đính kèm ... khi tôi nhấn tải lên / chèn, tải lên một tệp từ máy tính của tôi và nhấn chèn vào bài đăng và cập nhật sau đó vào thư viện thư viện phương tiện. Nó cho tôi biết rằng hình ảnh tôi đã tải lên được "đính kèm" vào bài đăng? ... hoặc chúng ta đang nói về ngữ nghĩa ở đây bởi vì tôi hiểu những gì bạn đang nói về đoạn mã đó chỉ hoạt động cho các hình ảnh đính kèm.
byronyasgur

1
Bạn có thể liên kết một tập tin hình ảnh bất cứ nơi nào. Khi nhấp vào Chèn hình ảnh / Phương tiện, có một tab "Từ URL", nơi bạn thông báo một URL hình ảnh, tức là dịch vụ chụp ảnh. Regex sẽ có thể có được hình ảnh này ("như hiện tại"), nhưng WP sẽ không thể sử dụng hình ảnh này làm Hình ảnh nổi bật, ví dụ.
Diana

3

Tôi đề nghị hai cách:

Sử dụng Plugin

Tôi sẽ xem xét sử dụng plugin Get The Image , vì vậy bạn có thể làm một cái gì đó như:

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

Ở trên sẽ cố gắng làm mọi thứ theo thứ tự này:

  1. Tìm hình thu nhỏ của bài đăng
  2. Tìm kiếm hình ảnh đính kèm đầu tiên
  3. Quét nội dung bài đăng cho một hình ảnh được chèn.

Xây dựng hỗ trợ trong chủ đề của bạn

Tuy nhiên, tôi đang sử dụng một chức năng trong một plugin thực hiện hai mục đầu tiên của danh sách trên.

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

Bạn có thể điều chỉnh nó để phù hợp với mục thứ ba trong đoạn trích của 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;
}

Chỉ cần dán hai hàm này vào functions.phptệp của bạn và sử dụng chúng trong vòng lặp như:

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

Chủ đề là để bán thương mại vì vậy tôi không muốn nói với người dùng cuối họ phải cài đặt một plugin, nhưng cảm ơn.
byronyasgur

@byronyasgur Chỉnh sửa câu trả lời để làm rõ rằng tôi đã cho bạn hai giải pháp. Bạn không cần phải cài đặt một plugin để làm theo cái thứ hai.
vmassuchetto

2

mã có vẻ hoàn toàn an toàn. Như bạn đã nói, bạn không có bất kỳ hình ảnh nào được đính kèm vào bài viết.

Cân nhắc đến bảng điều khiển quản trị phương tiện và đính kèm hình ảnh vào bài đăng đó.

Thay phiên, loại bỏ nội dung bài đăng với một regex cho hình ảnh trong đó.


Tôi có hiểu nhầm về "đính kèm" nghĩa là gì không? .... Tôi có một hình ảnh trong bài viết ... nó không được đính kèm khi bạn nhấp vào 'thêm vào bài viết'?
byronyasgur

1
từ câu hỏi của bạn, có vẻ như bạn đã nhập mã html liên kết đến một hình ảnh không nhất thiết phải được đính kèm bởi wp.
pcarvalho

1

Tôi hiểu đây là câu hỏi rất cũ, nhưng tôi đang đặt câu trả lời của mình ở đây vì hầu hết câu trả lời được bình chọn là không phù hợp với những người mới sử dụng PHP.

preg_match không phải là một cách tiếp cận tốt để phân tích cú pháp HTML trong PHP vì preg_match dành cho biểu thức chính quy và HTML không phải là biểu thức chính quy.

Chúng ta có thể sử dụng DOM thay thế.

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

Sử dụng DOM thực sự tốt vì bạn có thể làm nhiều việc khác ngoài việc chỉ lấy hình ảnh đầu tiên và đó là cách đúng để phân tích html.

Tôi ước tôi có thể đặt câu trả lời cho việc sử dụng các hàm wordpress (các hàm từ CODEX và lõi) để có được hình ảnh đầu tiên nhưng đó cũng là vấn đề mà tôi đang xử lý.

Đây không phải là câu trả lời cho mọi trường hợp!

Xem xét trường hợp tối ưu hóa kích thước hình ảnh. Trong trường hợp đó, bạn không thể chỉ sử dụng mã này vì bài đăng có thể chứa bất kỳ kích thước hình ảnh nào.


0

Mã này hoạt động với tôi:

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;
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.