Получить первое изображение из содержимого публикации (например, изображения с горячей ссылкой)


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

Если вы хотите отобразить изображение, которое вставлено в ваш контент (например, изображение с горячей ссылкой), вы должны использовать такую ​​функцию (источник) :

добавить в 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() ?> где вы хотите отобразить изображение.

Примечание: изображение с горячей ссылкой, только что размещенное в вашем контенте, не может быть установлено как Featured Image, как черта WordPress'а.


Да, я видел этот код вокруг ... кажется немного хаком, вы могли бы подумать, что будет "WordPress" способ ... Интересно, почему мне нужно использовать preg_match, когда кодекс говорит, что вы можете сделать это как я писал выше. Это мой вопрос, если честно. Код, который я разместил неправильно? ... более того, чем пытаться заставить его работать на самом деле. Но спасибо, я могу в конечном итоге использовать это. Я не понимаю значения того, что «изображение, размещенное в вашем контенте, не может быть установлено в качестве избранного изображения». Влияет ли это на это каким-то образом? Я просто пытаюсь отобразить первое изображение из поста, а не показанное изображение.
byronyasgur

Существует большая разница между размещением ссылки на изображение внутри вашего поста / содержимого страницы и прикреплением изображения. Вы можете прикрепить изображение, не отображая его вообще. Пример Кодекса о том, как прикрепить файл к вашему сообщению / странице, нет способа поместить изображение внутрь, используя ссылки, также хотлинкинг не является функцией, с которой WP справится без регулярного выражения PHP.
Диана

О ссылке COdex: как вы видите, документ вызывается после имени функции get_childre, вложение - это дочерняя запись, поэтому этот пример может работать только для вложенного содержимого.
Диана

Да, я знаю, что могу прикрепить изображение, не вставляя его, этот бит ясен ... но я не вижу, как вы можете вставить изображение, не прикрепляя его ... когда я нажимаю выгрузить / вставить, загрузить файл с моего компьютера и нажмите вставить в сообщение и обновить, а затем перейти в библиотеку мультимедиа, где сообщается, что загруженное изображение «прикреплено» к сообщению? ... или мы говорим здесь семантику, потому что я понимаю, что вы говорите о том фрагменте кода, который работает только для прикрепленных изображений.
Byronyasgur

1
Вы можете установить ссылку на файл изображения в любом месте. При нажатии «Вставить изображение / мультимедиа» появляется вкладка «С URL», где вы сообщаете URL-адрес изображения, т.е. сервис imageshack. Регулярное выражение сможет получить это изображение («как есть»), но WP не сможет использовать это изображение, например, в качестве избранного изображения.
Диана

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

Вы можете настроить его так, чтобы он соответствовал третьему элементу во фрагменте Дианы:

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
Исходя из вашего вопроса, вам показалось, что вы набрали 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 и Core), чтобы получить первое изображение, но это также проблема, с которой я имею дело.

Это не ответ для каждого случая!

Рассмотрим случай оптимизации размера изображения. В этом случае вы не можете просто использовать этот код, потому что пост может содержать изображение любого размера.


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;
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.