Извлеките и отобразите РЕАЛЬНОЕ первое изображение, прикрепленное к сообщению - увеличьте миниатюру сообщения ()


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

Если используется новый элемент изображения с признаками 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>';
    }
Author: NetConstructor.com, 2010-09-17

4 answers

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

 2
Author: Rarst, 2010-09-17 18:07:47

Вот решение моей проблемы для всех, кому это интересно.

Включите это в свой 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 ", поместите его в папку с именем "пользовательский" и поместите ее в тот же каталог, что и ваши темы 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;
        }
}
}
?>
 1
Author: NetConstructor.com, 2010-09-17 23:28:29

@ Сетевой конструктор,

Эта функция не решит всех ваших проблем, но я подумал, что это поможет. Он получает первое изображение, прикрепленное к сообщению, и добавляет изображение среднего размера в 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
Author: Chris_O, 2010-09-17 17:59:17

Вы можете проверить полезные фрагменты кода здесь Я нашел их полезными, чтобы вытащить первое изображение из поста.

 0
Author: me-too, 2012-05-24 05:38:06