WordPress как на ладони
wordpress jino

Как получить URL первой картинки из контента записи?

Мне нужно получить ссылку на первую картинку, которая присутствует в тексте поста.

Например в тексте есть теги картинок <img src="ссылка" alt="">. Как мне проверить текст записи и получить первую ссылку на картинку?

Также, нужно учесть наличие миниатюры у записи. Т.е. если установлена миниатюра записи, то брать её и не искать ничего в тексте...

2
Гость 1.2 года назад
  • 0
    Kama4660

    Такой код вам поможет:

    /**
     * Получает первую картинку из контента указанной записи.
     * Если у записи есть миниатюра, то получит её 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];
    }

    Варианты вызова:

    // в цикле
    $src = get_post_first_image_src();
    
    // где угодно
    $src = get_post_first_image_src( $post );
    Комментировать
  • 1
    campusboy1946 cайт: www.youtube.com/c/wpplus

    Я себе недавно такой код написал:

    ### Код вывода 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 секунды. В несколько раз быстрее! Потому эта функция старается во всех записях добавить миниатюру.

    Единственное, что можно было бы доработать - это загрузка первого изображения, если оно не находится в медиабиблиотеки сайта.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Регистрация. Вход.