netconstructorcom
  • 0
Мастер

Извлечь и отобразить НАСТОЯЩЕЕ первое изображение, прикрепленное к сообщению – расширить the_post_thumbnail()

  • 0

У меня есть интересная проблема, которую я уверен, что кто-то здесь может решить. Я перебрал множество различных плагинов и фрагментов кода в поисках идеального кода для извлечения основного изображения, которое будет связано с публикацией.

Если используется новый элемент избранного изображения WP 3.0, то, конечно, нет проблем, но есть множество ситуаций, когда сообщению может не быть назначено «избранное изображение». В этих ситуациях, если бы вы использовали стандартный код:

<?php echo the_post_thumbnail( array(200,200) ); ?>

в вашем шаблоне… ничего не будет отображаться.

Для таких ситуаций я ищу идеальное решение. По сути, мне нужна возможность иметь тип «отказоустойчивости», когда the_post_thumbnail не существует, но мне также нужна возможность устанавливать размер изображения так же, как я могу с кодом из the_post_thumbnail.

Я считаю, что этот «отказоустойчивый переход» должен состоять из двух шагов:

  1. Проверьте «Медиа-галерею» для этого поста и найдите изображение с наивысшим порядком сортировки (или добавьте родительский пост, как показано в плагине ниже).
  2. Если порядок сортировки не установлен или пуст, извлеките первое изображение из содержимого публикации.

Хорошей новостью является то, что для двух пунктов выше я, кажется, нашел два отдельных фрагмента кода, которые заботятся об этих запросах по отдельности (скопировано ниже для обзора), но ничего, что объединяло бы все три из этих элементов в одном.

Итак, резюмируя: вместо того, чтобы выполнять кучу вызовов if/then, чтобы проверить, существует ли миниатюра сообщения, а затем запускать проверку кода ниже, я надеялся, что кто-то сможет предоставить чистую/комбинированную функцию, которая позволит мне чтобы повторить одну функцию вместе с переменными размера, которые могут достичь всех трех этих целей, как указано выше.

ЗДЕСЬ БИТЫ КОДА, УПОМЯНУТЫЕ ВЫШЕ:


ДЛЯ № 1: Получить первое изображение на основе порядка из медиагалереи: этот код работает, сначала ища любые вложения в таблице базы данных wp_posts, которые имеют идентификатор «post_parent», который соответствует текущему сообщению, и в качестве второго шага для сообщения с несколькими прикрепленными изображениями, возвращая вложение с полем «menu_order», установленным на «1». Если нет прикрепленных изображений, соответствующих текущему идентификатору сообщения, плагин возвращает «false».

// AUTOMATICALLY EXTRACT IMAGES BASED ON ASSOCIATED GALLERY ORDER
// THIS CODE EXTRACTS THE FIRST IMAGE BASED ON THE ORDER IN THE MEDIA GALLERY
// PLUGIN FROM: http://mekosh.org/projects/ordered-thumbnails
   function ordered_thumbnails( $display = 'true', $class='' ) {
    global $post;
    // get all image attachments for this post
    $images = get_children( array( 'post_type' => 'attachment', 'post_parent' => $post->ID, 'post_mime_type' => 'image', order=>"asc" ) );
    // if the post has image attachments
    if( $images !== false ) {
        // find the image in position 1
        foreach($images as $i) {
            if ( $i->menu_order == 1 ) {
                $img_id = $i->ID;
            }
        }
        // if the images were unordered
        if ( $img_id == '' ) {
            $i = array_slice( $images, 0, 1 );
            $img_id = $i[0]->ID;
        }
        // get image data
        $image = wp_get_attachment_image_src( $img_id, 'thumbnail' );
        $result = array(
            'url'       => $image[0],
            'width' => $image[1],
            'height'    => $image[2]
        );
        // should the image be displayed or should data be returned as an array?
        if ( $display == 'true' ) {
            return _e( '<img src="'.$result['url'].'" width="'.$result['width'].'" height="'.$result['height'].'" class="'.$class.'" />' );
        } else {
            return $result;
        }
    } else {
        // post does not have any image attachments
        return (bool) false;
    }
   }
// create template tag "ordered_thumbnails"
   add_action( 'ordered_thumbnails', 'ordered_thumbnails', 2 );

ДЛЯ № 2: извлеките первое изображение из содержимого сообщения.

// THIS CODE GETS THE FIRST IMAGE EXTRACTED DIRECTLY FROM THE POST CONTENT

    function bm_extract_string($start, $end, $original) {
    $original = stristr($original, $start);
    $trimmed = stristr($original, $end);
    return substr($original, strlen($start), -strlen($trimmed));
    }
    function getFirstImage() {
    $content = get_the_content();
    $pic_string = bm_extract_string('src="','" ',$content);
    $imagesize = getimagesize($pic_string);
    list($width, $height, $type, $attr) = getimagesize($pic_string);
    $link = get_permalink();
    $title = get_the_title($post->post_title);
    echo '<a href="'.$link.'" style="background:url('.$pic_string.'); display:block; width:'.$width.'px; height:'.$height.'px;" title="'.$title.'"></a>';
    }
Share
  1. @all Я нашел решение своей проблемы, которое я представил ниже, если кому-то интересно. Спасибо всем, кто пытался найти решение.

    • 0
    • есть несколько вещей, которые мне непонятны. Зачем вам нужны регулярные выражения, чтобы найти первое изображение из содержимого? get_children должен позаботиться о поиске любых вложенных изображений. Вам не нужно обрабатывать удаленные изображения, просто добавьте атрибуты ширины/высоты в <img> тег эскиза и позвольте браузеру обработать это. Также в чем причина использования ООП в этой ситуации?

      • 0
    • хотя это не то, что я ищу, я ценю, что вы предоставили код. Однако я действительно ищу здесь конкретное решение, которое, я чувствую, многие другие найдут ценность в

      • 0
    • Ответ должен быть чем-то большим, чем просто ссылка на внешний сайт. Пожалуйста, добавьте решение.

      • 0
  2. Я предлагаю проверить плагин Get the Image. По сути, это одна функция, которая действует как гибкая и настраиваемая оболочка для поиска изображений в сообщениях с помощью различных методов (метаполя сообщений, избранные изображения, прикрепленные изображения, изображения в теле сообщения).

    • 0
  3. Вот решение моей проблемы, кому интересно.

    Включите это в свой файл functions.php

    require_once('custom/extract-post-thumbnail.php');
        $extract_img = new extract_post_image();
        add_filter( 'post_thumbnail_html', array(&$extract_img, 'get_post_image'),1,5 );
    

    Создайте новый файл и назовите его «extract-post-thumbnail.php», поместите его в папку с именем «custom» и поместите его в тот же каталог, где находится файл functions.php вашей темы. Наконец, вставьте приведенный ниже код в этот файл.

    <?php
    class extract_post_image {
        public $html;
        public $post_id;
        public $post_image_id;
        public $size;
        public $attr;
        public function extract_post_image()  {
        }
        public function get_post_image ($html,$post_id, $post_image_id, $size, $attr) {
    $this->html = $html;
            $this->post_id = $post_id;
            $this->post_image_id = $post_image_id;
            $this->size = $size;
            $this->attr = $attr;
        if ($this->html == '') {
             $this->post_image_id = $this->get_post_image_id ();
             if ($this->post_image_id) {
               do_action( 'begin_fetch_post_thumbnail_html', $this->post_id, $this->post_image_id, $this->size ); 
            $this->html = wp_get_attachment_image( $this->post_image_id, $this->size, false, $this->attr );
            do_action( 'end_fetch_post_thumbnail_html', $this->post_id, $this->post_image_id, $this->size );
        } else {
            $this->html = $this->get_image_in_content ();
        }
        }
        return $this->html;
    }
    public function get_post_image_id () {
        $images = get_children(
        array(
            'post_parent' => $this->post_id,
            'post_status' => 'inherit',
            'post_type' => 'attachment',
            'post_mime_type' => 'image',
            'order' => 'ASC',
            'orderby' => 'menu_order',
            'numberposts' => 1
            )
        );
        if ($images) {
            foreach ($images as $img) {
            $img_id = $img->ID;
            }
            return $img->ID;
            } else {
               return NULL;
            }
    }
    public function remote_file_exists($image) {
        if ( @file($image)) {
            return true;
        }
        return false;
    }
    public function get_image_in_content () {
        $my_post = get_post($this->post_id);
        preg_match_all( '|<img.*?src=['"](.*?)['"].*?>|i', $my_post->post_content, $matches );
        if ( isset( $matches ) ) {
                $image = $matches[1][0];
        if ( $matches[1][0] && $this->remote_file_exists($image) ) {
                $altpattern = '/alt=(['"])?(.*?)\\1/';
                preg_match($altpattern, $matches[0][0], $m);
                $alt = $m[2];
                $default_attr = array(
                'src'   => $image,
                'class' => "attachment-$size",
                'alt'   => $alt
            );
                $this->attr = wp_parse_args($this->attr, $default_attr);
            $attr = array_map( 'esc_attr', $this->attr );
            $attributes = '';
            foreach ( $this->attr as $name => $value ) {
                $attributes .= " $name=" . '"' . $value . '"';
            }
               $imgwh = getimagesize($image);
               $imgsize = image_constrain_size_for_editor($imgwh[0], $imgwh[1], $this->size);
               $wh = image_hwstring($imgsize[0], $imgsize[1]);
               $this->html = ' <img '.$attributes.' '.$wh.' />';
                    return $this->html;
            }
            } else {
            return NULL;
            }
    }
    }
    ?>
    
    • 0
  4. @NetConstructor,

    Эта функция не решит всех ваших проблем, но я подумал, что она поможет. Он получает первое изображение, прикрепленное к сообщению, и добавляет изображение среднего размера the_content . Если порядок сортировки не установлен, он получит изображение с порядком сортировки «0». Он ничего не извлекает из содержимого сообщения, и если изображение находится в содержании сообщения, оно будет отображаться 2 раза.

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

    function the_image($size = 'medium' , $class = ”){
    global $post;
    
    //setup the attachment array
    $att_array = array(
    'post_parent' => $post->ID,
    'post_type' => 'attachment',
    'post_mime_type' => 'image',
    'order_by' => 'menu_order'
    );
    
    //get the post attachments
    $attachments = get_children($att_array);
    
    //make sure there are attachments
    if (is_array($attachments)){
    //loop through them
    foreach($attachments as $att){
    //find the one we want based on its characteristics
    if ( $att->menu_order == 0){
    $image_src_array = wp_get_attachment_image_src($att->ID, $size);
    
    //get url – 1 and 2 are the x and y dimensions
    $url = $image_src_array[0];
    $caption = $att->post_excerpt;
    $image_html = '<img src="%s" alt="%s" />';
    
    //combine the data
    $html = sprintf($image_html,$url,$caption,$class);
    
    //echo the result
    echo $html;
    }
    }
    }
    }
    
    • 0
  5. Вы можете проверить полезные фрагменты кода здесь, я нашел их полезными, чтобы вытащить первое изображение из поста.

    • 0

Оставить ответ

You must login to add an answer.