Используйте "средний" размер с функцией catch that image()


У меня есть эта функция, которую, я уверен, многие из вас уже знают:

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

  return $first_img;
}

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

У вас, ребята, есть какие-нибудь идеи, как я могу это сделать?

Приветствия

Author: Telmo Gonçalves, 2013-04-29

3 answers

Когда первое изображение является вложением изображения Wordpress.

В версии 3.6 есть более простой способ.

function get_first_image_medium_size_url($post_id) {

 if(!$images = get_attached_images($post_id))
    return false;

 $first_image = current($images);

 if(!$src = wp_get_attachment_image_src($first_image->ID,'medium'))
    return false;

 $medium_url = current($src);

 return $medium_url;
}

Get_attached_images доступен в версии 3.6.

Wp_get_attachment_image_src доступен с версии 2.5.0, которая автоматически получает или масштабирует вложение изображения до указанного размера.

Поскольку версия 3.6 еще не выпущена, вы можете создать свою собственную функцию get_attached_images

function my_get_attached_images( $post_id = 0 ) {
    $post = empty( $post_id ) ? get_post() : get_post( $post_id );
    if ( empty( $post ) )
        return;

    $args = array(
        'post_parent' => $post->ID,
        'post_type' => 'attachment',
        'post_mime_type' => 'image',
        'posts_per_page' => -1,
        'orderby' => 'menu_order',
        'order' => 'ASC',
    );


    $children = get_children( $args );

    return (array)$children;
}

Что, если изображение не является Тип вложения Wordpress?

Например, вы ссылаетесь на изображение flickr.

Ну, вот моя версия catch_first_image

function get_first_image($content){
    if(!$content)
        return false;
    preg_match("@<img.+?src=[\"'](.+?)[\"'].+?>@",$content,$m);

    if($m[1])
        if(filter_var($m[1], FILTER_VALIDATE_URL))
            return $m[1];
    return false;
}

Я думаю, что это лучше, чем у вас. Часто мое сердцебиение учащается, когда я вижу функции ob_*. хе-хе

Как изменить размер изображения?

Я хотел бы использовать Wordpress Photon для этого.

function photon_image_url($orgin_url){
        $orgin_url = str_replace(array('http://','https://'),'',$origin_url);
        return 'http://i0.wp.com/'.$origin_url.'?w=50%';
}

Примечание: эта функция предназначена только для того, чтобы дать вам общее представление о том, как использовать photon.


Конечно, вы можете использовать Photon для обоих сценариев. Вы знаете, это своего рода услуга CDN.

 4
Author: Jesse, 2013-04-30 00:49:52

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

function first_image_medium_wpse_97658($content) {
  global $wpdb;
  $pattern = '|<img.*?src="([^"]+)".*?/>|';
  preg_match($pattern,$content,$matches);
  if (!empty($matches[1])) {
    $path = pathinfo($matches[1]);
    if (!empty($path['filename'])) {
      $id = $wpdb->get_var($wpdb->prepare("SELECT ID FROM {$wpdb->posts} WHERE post_name = %s",$path['filename']));
      if (!empty($id)) {
        $content = wp_get_attachment_image($id,'medium'); 
      }
    }
  }
  return $content;
}
add_filter('the_content','first_image_medium_wpse_97658');

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

function first_image_medium_wpse_97658_v2($content) {
  $pattern = '|<img.*?class="([^"]+)".*?/>|';
  preg_match($pattern,$content,$matches);
  if (!empty($matches[1])) {
    $classes = explode(' ',$matches[1]);
    $id = preg_grep('|^wp-image-.*|',$classes);
    if (!empty($id)) {
      $id = str_replace('wp-image-','',$id);
      if (!empty($id)) {
        $id = reset($id);
        $content = wp_get_attachment_image($id,'medium');  
      }
    }
  }
  return $content;
}
add_filter('the_content','first_image_medium_wpse_97658_v2');

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

echo first_image_medium_wpse_97658_v2($post->post_content);

Для замены отрывка первым изображением из содержимого требуется незначительное менять. Фильтр the_excerpt передает содержимое, как фильтр the_content, но нет гарантии, что изображения _post_content_ будут там.

function first_image_medium_wpse_97658_v3($excerpt) {
  global $post;
  $content = $post->post_content;
  $pattern = '|<img.*?class="([^"]+)".*?/>|';
  preg_match($pattern,$content,$matches);
  if (!empty($matches[1])) {
    $classes = explode(' ',$matches[1]);
    $id = preg_grep('|^wp-image-.*|',$classes);
    if (!empty($id)) {
      $id = str_replace('wp-image-','',$id);
      if (!empty($id)) {
        $id = reset($id);
        $excerpt = wp_get_attachment_image($id,'medium');  
      }
    }
  }
  return $excerpt;
}
add_filter('the_excerpt','first_image_medium_wpse_97658_v3',100);

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

 2
Author: s_ha_dum, 2013-04-30 13:40:01

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

Как вы можете видеть, он устанавливает ширину изображения = 100 пикселей и высоту изображения = 80 пикселей, я знаю, что это не лучшее решение, так как изображение не обрезается или не изменяется, и оно также может быть "тяжелым" изображением, но если единственное, что вы ищете, это быстрая функция, которая ловит ваше первое изображение... вот оно.

Получить первую ширину изображения= высота 100 пикселей = 80 пикселей

<?php
function getImage10080($num) {
global $more;
$more = 1;
$link = get_permalink();
$content = get_the_content();
$count = substr_count($content, '<img');
$start = 0;
for($i=1;$i<=$count;$i++) {
$imgBeg = strpos($content, '<img', $start);
$post = substr($content, $imgBeg);
$imgEnd = strpos($post, '>');
$postOutput = substr($post, 0, $imgEnd+1);
$postOutput = preg_replace('/width="([0-9]*)" height="([0-9]*)"/', '/width="100px" height="80px"/',$postOutput);
$image[$i] = $postOutput;
$start=$imgEnd+1;
}
if(stristr($image[$num],'<img')) { echo ''.$image[$num].""; }
$more = 0;
};
?>

После размещения этого кода в вашем functions.php (без) вам нужно будет только написать это:

<?php getImage10080('1');?>

Где вы хотите, чтобы было показано ваше "пойманное" изображение.

 0
Author: Downloadtaky, 2013-04-30 00:30:41