功能
指定文章ID提取出文章中的图片,并生成缩略图,利用了timthumb.php
插件。
可以自定义缩略图的大小,对原图进行裁剪。
可以自定义图片的CSS类。
可以自定义从第几张开始,提取多少张图片。
可以自定义每张图片的包裹元素,比如<div><li><span>等等。
可以自定义直接输出html代码或着返回html代码方便二次处理。
参数
$id: 文章的ID,当没有传入ID参数的时候,自动获取当前文章的ID,只有在循环中才有效。
$width, $height: 必需。缩略图的宽高属性。
$class: 缩略图的CSS class属性,默认为空。
$num: 提取多少张缩略图,默认提取 1 张,0 为全部提取。
$start: 起点值。从第几张开始提取,默认是第 1 张。
$before, $after: 缩略图的 html 父级元素。
$echo:直接输出代码,还是返回一个 string 。
代码
function get_art_thumb($id, $width, $height, $class='', $num=1, $start=1, $before='', $after='', $echo=1){
// 传参虽然为1,但序列号是从0开始的,实际使用的时候要减1
$start = $start - 1;
// 默认获取当前文章ID
if ( $id == null ) $id = get_the_ID();
// 获取文章的正文
$content = get_post($id) -> post_content;
// 定义正则。主题图片利用的WP自带的[caption]短代码,所以正则是匹配[caption]的
$z = '/\[caption.*?\]<a\s+href=".*?"><img.*?src="(.*?)".*?\/><\/a>.*?\[\/caption\]/i';
// 用正则提取出缩略图,[0]是[caption]到[/caption]的整段代码;[1]是图片的URL
preg_match_all($z, $content, $thumb, PREG_PATTERN_ORDER);
// $num 传入参数为0时,提取全部缩略图
if( $num == 0 ) $num = count( $thumb[1] );
// 如果起始值不为0,提取数量如果不加上起点值的话,提取的图片数会少
$num = $num + $start;
/*
* 如果有缩略图,提取。
* 用for循环而不用foreach是为了控制提取数量和起点值更方便
* 定义 $m 为起点值,$m小于图片总数,并且小于提取数量时,依次提取
*/
if ( !empty( $thumb[1] ) ){
for( $m = $start; $m < count( $thumb[1] ) && $m < $num; $m++){
$html .= $before . '<img class="' . $class . '" src="' . get_template_directory_uri();
$html .= '/timthumb.php?src=' . $thumb[1][$m];
$html .= '&h=' . $height . '&w=' . $width . '&q=90&zc=1&ct=1" ';
$html .= 'alt="' . get_the_title($id) . '" />' . $after;
}
/*
* 如果没有缩略图,使用默认图片
* get_option( 'post_default_thumbnail' ) 是后台设置中定义的默认图片URL,可以改成任意的图片地址
*/
} else {
$html = $before . '<img class="' . $class . '" src="' . get_template_directory_uri();
$html .= '/timthumb.php?src=' . get_option( 'post_default_thumbnail' );
$html .= '&h=' . $height . '&w=' . $width . '&q=90&zc=1&ct=1" ';
$html .= 'alt="' . get_the_title($id) . '" />' . $after;
}
// 输出还是返回
if($echo == 1){
echo $html;
}else{
return $html;
}
}
调用
比如当前缩略图的需求是这样:
- 调用当前文章图片,生成480 X 360像素的缩略图。
- 缩略图CSS class为thumb。
- 从第1张开始,全部提取。
- 图片包裹器为<div class="thumb-wrap">......</div>。
- 直接输出html代码。
在放缩略图的地方输入以下代码即可:
<?php
get_art_thumb('', 480, 360, 'thumb', 0, 1, '<div class="thumb-wrap">', '</div>', 1);
?>
将输出以下形式的html代码:
<div class="thumb-wrap">
<img class="thumb" src="主题目录/timthumb.php?src=图片地址&h=360&w=480&q=90&zc=1&ct=1" alt="文章标题" />
</div>
<!-- ..........N次直到该文章所有图片被提取 -->
最后,上传timthumb.php到主题根目录下。
TODO. 传参有些麻烦,默认值也必须传入一个空值,可以改为数组传参。
待续……