게시물 콘텐츠에서 첫 번째 이미지 가져 오기 (예 : 핫 링크 된 이미지)


10

이 코드를 코덱스 에서 직접 사용하고 있습니다 .

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

당신이 원하는 경우 콘텐츠에 삽입 된 이미지 표시 (예를 들어, hotlinked 이미지),이 같은 기능을 사용해야합니다 (소스) :

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() ?>이미지를 표시 할 위치에 배치 하십시오.

참고 : 컨텐츠에 방금 배치 한 핫 링크 이미지는 대량 워드 프레스 기능인 추천 이미지로 설정할 수 없습니다.


예, 나는 그 코드를 보았습니다 ... 약간의 해킹처럼 보입니다. "WordPress"방식이 있다고 생각할 것입니다 ... 코덱스에서 할 수 있다고 말할 때 왜 preg_match를 사용 해야하는지 궁금합니다. 내가 위에 게시 한대로. 그것은 정말로 정직한 질문입니다. 내가 게시 한 코드가 잘못 되었습니까? ... 실제로 작동시키는 것보다. 그러나 고맙게도 이것을 사용해야 할 수도 있습니다. "콘텐츠에 방금 배치 한 이미지를 추천 이미지로 설정할 수 없습니다"의 중요성을 이해하지 못합니다. 그것은 어떤 식 으로든 이것에 영향을 줍니까? 추천 이미지가 아닌 게시물의 첫 번째 이미지를 표시하려고합니다.
byronyasgur

게시물 / 페이지 콘텐츠 내에 이미지 링크를 배치하고 이미지를 첨부하는 것에는 큰 차이가 있습니다. 이미지를 전혀 표시하지 않고 첨부 할 수 있습니다. 코덱스 예제는 게시물 / 페이지에 파일을 첨부하는 방법에 대한 것입니다. 링크를 통해 이미지를 가져올 수있는 방법은 없으며 핫 링크는 WP가 PHP 정규 표현식없이 처리하는 기능이 아닙니다.
Diana

COdex 참조 정보 : doc이 함수 이름 다음에 호출되는 것을 볼 수 있듯이 get_childre첨부 파일은 하위 게시물 이므로이 예제는 첨부 된 컨텐츠에 대해서만 작동합니다.
Diana

예 이미지를 삽입하지 않고 첨부 할 수 있다는 것을 알고 있습니다. 비트는 분명합니다. 그러나 이미지를 첨부하지 않고 삽입하는 방법을 볼 수 없습니다 ... 업로드 / 삽입을 누를 때 컴퓨터에서 파일을 업로드 할 때 그리고 insert into post and update를 누른 다음 미디어 라이브러리 라이브러리로 이동하여 업로드 한 이미지가 게시물에 "첨부"되었음을 알려줍니다. ... 또는 첨부 된 이미지에서만 작동하는 코드에 대해 이해하고 있기 때문에 의미론을 이야기하고 있습니까?
byronyasgur

1
이미지 파일을 어디서나 핫 링크 할 수 있습니다. 이미지 / 미디어 삽입을 클릭하면 이미지 URL (예 : imageshack 서비스)을 알려주는 "URL에서"탭이 있습니다. 정규 표현식은이 이미지를 가져올 수 있지만 ( "있는 그대로") WP는이 이미지를 추천 이미지로 사용할 수 없습니다.
Diana

3

두 가지 방법을 제안합니다.

플러그인 사용

Get The Image 플러그인 사용을 고려하여 다음과 같은 작업을 수행 할 수 있습니다.

$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

코드는 완벽하게 안전 해 보입니다. 말한 것처럼 게시물에 이미지가 첨부되어 있지 않습니다 .

미디어 관리자 패널로 이동하여 해당 게시물에 이미지를 첨부하십시오.

또는 게시물 내용을 이미지의 정규식으로 스크랩하십시오.


"첨부 된"이 정확히 무엇을 의미하는지에 대한 오해가 있습니까? .... 게시물에 이미지가 있습니다 ... '게시물에 추가'를 클릭해도 첨부되지 않습니까?
byronyasgur

1
귀하의 질문에서, wp가 반드시 첨부 할 필요는없는 이미지에 연결하는 html 코드를 입력 한 것 같습니다.
pcarvalho

1

나는 이것이 매우 오래된 질문이라는 것을 이해하지만 대부분의 투표 응답은 PHP를 처음 사용하는 사람들에게는 적합하지 않기 때문에 여기에 답을 넣고 있습니다.

preg_match는 정규식 용이고 HTML은 정규식이 아니기 때문에 preg_match는 PHP에서 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을 구문 분석하는 올바른 방법이기 때문에 정말 좋습니다.

첫 번째 이미지를 얻기 위해 워드 프레스 기능 (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.