Используйте "средний" размер с функцией 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;
}
Я хотел бы использовать размеры большого пальца, среднего и т. Д. В цикле сообщений.
У вас, ребята, есть какие-нибудь идеи, как я могу это сделать?
Приветствия
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.
Вам нужно будет захватить изображение, получить его идентификатор, а затем использовать 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
был полностью заменен выводом фильтра.
Иногда я использовал аналогичный подход к вашему, поэтому вот простая функция, которую нужно скопировать/вставить в ваш 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');?>
Где вы хотите, чтобы было показано ваше "пойманное" изображение.