Как получить URL первой картинки из контента записи?
Мне нужно получить ссылку на первую картинку, которая присутствует в тексте поста.
Например в тексте есть теги картинок <img src="ссылка" alt="">. Как мне проверить текст записи и получить первую ссылку на картинку?
Также, нужно учесть наличие миниатюры у записи. Т.е. если установлена миниатюра записи, то брать её и не искать ничего в тексте...
Такой код вам поможет:
/** * Получает первую картинку из контента указанной записи. * Если у записи есть миниатюра, то получит её URL. * * @param integer/WP_Post $post ID или объект поста, картинку из контента которого нужно получить. * По умолчанию: текущий пост * @param string $default_src URL на картинку по умолчанию, если не удалось найти её в контенте записи. * @return string URL на картинку. */ function get_post_first_image_src( $post = 0, $default_src = '' ){ if( ! $post || ! is_object($post) ) $post = get_post($post); // если у записи есть миниатюра if( $thumbnail_id = get_post_meta( $post->ID, '_thumbnail_id', true ) ) if( $src = wp_get_attachment_url( $thumbnail_id ) ) return $src; // миниатюры нет, ищем в контенте preg_match('/<img[^>]+src=[\'"]([^\'"]+)[\'"][^>]*>/i', $post->post_content, $match ); if( ! $match ) return $default_src; return $match[1]; }Варианты вызова:
Я себе недавно такой код написал:
### Код вывода 1 изображения из статьи, если больше уже нечего ### function get_first_post_link_image() { global $post; $first_img = ''; $output = preg_match("/<img\s[^>]*src=([\"'])?([^\s]+)\\1[^>]*\/?>/is", $post->post_content, $matches ); if ( isset( $matches [2] ) ) { $first_img = $matches [2]; } if(empty($first_img)){ $first_img = get_template_directory_uri() . "/img/post-default.jpg"; } return esc_url( $first_img ); } function the_alternative_image(){ global $post; printf('<a href="%s"><img src="%s" alt=""></a>', get_the_permalink($post->ID), get_first_post_link_image() ); } /** * Выводит миниатюру записи. Учитывает все возможные ситуации. В случае неудачи (картинок нет вообще) отобразит дефолтную картинку. * * @param int $post_id - ID записи. Если не передать, то обратится к глобальной переменной $post. */ function the_post_my_thumbnail( $post_id = 0 ) { global $post; if ( !$post_id && !$post ) return; $post_id = ( $post_id ) ? $post_id : $post->ID; // Если ЕСТЬ миниатюра - показываем if( has_post_thumbnail() ) { printf('<a href="%s">%s</a>', get_the_permalink($post->ID), get_the_post_thumbnail( $post->ID, 'thumbnail' ) ); return; } // Миниатюры НЕТ, пробуем установить миниатюру из прикрепленных картинок к записи, если их нет - отдаём 1 картинку из контента $args = array( 'post_type' => 'attachment', 'posts_per_page' => -1, 'post_status' => null, 'post_parent' => $post_id ); $attachments = get_posts( $args ); if ( $attachments ){ $media = $attachments[0]; $check_set = set_post_thumbnail( $post_id, $media->ID ); if ( $check_set ) printf('<a href="%s">%s</a>', get_the_permalink($post->ID), get_the_post_thumbnail( $post_id, 'thumbnail' ) ); }else{ the_alternative_image(); } } ######################################################Там всё прокомментировано, но повторюсь.
Используем в шаблоне функцию the_alternative_image(). Работает по такому принципу:
1) Если есть миниатюра у поста - показывает её;
2) Если миниатюры нет - обращается к записи, пытаясь найти прикрепленные к ней изображения и в случае удачи устанавливает первую картинку в посте как миниатюру, сразу её и выводит;
3) Если нет вообще картинок, то возвращает дефолтную картинку.
Плюс такой функции следующие. Видел решения, когда каждый раз сканируется контент записи на наличие картинки и вывод её. Когда заходишь в рубрику с отображением 20-30 записей, то страница может грузиться 1 секунду и больше. А если у записей есть миниатюры, то страница грузится 0,15-0,3 секунды. В несколько раз быстрее! Потому эта функция старается во всех записях добавить миниатюру.
Единственное, что можно было бы доработать - это загрузка первого изображения, если оно не находится в медиабиблиотеки сайта.
три дня мучился, пробовал сотни вариантов, выводил подряд первое изображение первой записи на всех, где не были заданы миниатуры, но ваш код
выводил именно изображение той записи, в которой находися. Спасибо, отдуши