Chào các bạn, đã lâu lắm rồi max chưa viết được bài nào do vướng chuyện học hành và làm một số project.
Đã có rất nhiều người từng thắc mắc rằng … “Tại sao ảnh trong theme của tôi không hoạt động?”, “Tại sao tôi đã chèn link ảnh đúng theo hướng dẫn mà không được” hay “Làm thế nào để tôi có thể chèn ảnh thumbnail từ host ngoài mà vẫn sử dụng chức năng cắt ảnh của timthumb” (Host ngoài như: Tinypics, Imageshack, Photobucket, Flickr…)
![]()
Mình thử nghiên cứu về vấn đề này nhưng cũng không thể làm được do khả năng và thời gian còn bị giới hạn khá nhiều. Đã có một số bạn gửi cho mình một số module cắt ảnh của Joomla để mình tích hợp vào WordPress nhưng dung lượng lớn quá (~200kb) nên mình không thể ứng dụng được.
Và mình tình cờ tìm được file timthumb.php được modify lại để có thể cắt ảnh từ host ngoài. Nói là cắt ảnh từ host ngoài thì cũng không hoàn toàn đúng, bởi vì nó download về host của bạn trước khi tiến hành cắt vì thế host của bạn vẫn phải hỗ trợ thư viện GD.
Ưu điểm:
- Tiết kiệm thời gian đăng bài và backup (Bạn nào thường xuyên chuyển host thì sẽ thấy bất tiện thế nào và có ảnh bên ngoài thì thật là tuyệt)
Nhược điểm:
- File này tự động download về máy, vì thế CPU sẽ load cao hơn.
- Không hề tiết kiệm băng thông tẹo nào.
Cài đặt
- Copy đoạn code của timthumb về
- Tiến hành cài đặt như các file timthumb khác hoặc chép đè vào file timthumb.php nếu theme của các bạn đã có file này rồi.
- Have fun!
<” Mình nói vậy không biết có bạn nào chưa hiểu không, nếu chưa hiểu thì cứ mạnh dạn hỏi nhé” >
[codesyntax lang="php"]
<?php
// TimThumb script created by Tim McDaniels and Darren Hoyt with tweaks by Ben Gillbanks
// http://code.google.com/p/timthumb/
// MIT License: http://www.opensource.org/licenses/mit-license.php
/* Parameters allowed: */
// w: width
// h: height
// zc: zoom crop (0 or 1)
// q: quality (default is 75 and max is 100)
// HTML example: <img src="/scripts/timthumb.php?src=/images/whatever.jpg&w=150&h=200&zc=1" alt="" />
error_reporting(E_ALL);
if(!isset($_REQUEST["src"])) {
die("no image specified");
}
// clean params before use
$src = clean_source( $_REQUEST[ "src" ] );
// set document root
$doc_root = get_document_root($src);
// get path to image on file system
if(!preg_match('/http\:\/\//',$src)){
$src = $doc_root . '/' . $src;
}
$new_width = preg_replace( "/[^0-9]+/", "", get_request( 'w', 100 ) );
$new_height = preg_replace( "/[^0-9]+/", "", get_request( 'h', 100 ) );
$zoom_crop = preg_replace( "/[^0-9]+/", "", get_request( 'zc', 1 ) );
$quality = preg_replace( "/[^0-9]+/", "", get_request( '9', 80 ) );
// set path to cache directory (default is ./cache)
// this can be changed to a different location
$cache_dir = './cache';
// get mime type of src
$mime_type = mime_type($src);
// check to see if this image is in the cache already
//check_cache($cache_dir, $mime_type);
// make sure that the src is gif/jpg/png
if(!valid_src_mime_type($mime_type)) {
die("Invalid src mime type: $mime_type");
}
// check to see if GD function exist
if(!function_exists('imagecreatetruecolor')) {
die("GD Library Error: imagecreatetruecolor does not exist");
}
if(strlen($src)) {
// open the existing image
$image = open_image($mime_type, $src);
if($image === false) {
die('Unable to open image : ' . $src);
}
// Get original width and height
$width = imagesx($image);
$height = imagesy($image);
// don't allow new width or height to be greater than the original
if( $new_width > $width ) {
$new_width = $width;
}
if( $new_height > $height ) {
$new_height = $height;
}
// generate new w/h if not provided
if( $new_width && !$new_height ) {
$new_height = $height * ( $new_width / $width );
} elseif($new_height && !$new_width) {
$new_width = $width * ( $new_height / $height );
} elseif(!$new_width && !$new_height) {
$new_width = $width;
$new_height = $height;
}
// create a new true color image
$canvas = imagecreatetruecolor( $new_width, $new_height );
if( $zoom_crop ) {
$src_x = $src_y = 0;
$src_w = $width;
$src_h = $height;
$cmp_x = $width / $new_width;
$cmp_y = $height / $new_height;
// calculate x or y coordinate and width or height of source
if ( $cmp_x > $cmp_y ) {
$src_w = round( ( $width / $cmp_x * $cmp_y ) );
$src_x = round( ( $width - ( $width / $cmp_x * $cmp_y ) ) / 2 );
} elseif ( $cmp_y > $cmp_x ) {
$src_h = round( ( $height / $cmp_y * $cmp_x ) );
$src_y = round( ( $height - ( $height / $cmp_y * $cmp_x ) ) / 2 );
}
imagecopyresampled( $canvas, $image, 0, 0, $src_x, $src_y, $new_width, $new_height, $src_w, $src_h );
} else {
// copy and resize part of an image with resampling
imagecopyresampled( $canvas, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height );
}
// output image to browser based on mime type
show_image( $mime_type, $canvas, $quality, $cache_dir );
// remove image from memory
imagedestroy( $canvas );
} else {
if(strlen($src)) {
die($src . ' not found.');
} else {
die('no source specified.');
}
}
function show_image( $mime_type, $image_resized, $quality, $cache_dir ) {
// check to see if we can write to the cache directory
$is_writable = 0;
$cache_file_name = $cache_dir . '/' . get_cache_file();
if(@touch($cache_file_name)) {
// give 666 permissions so that the developer
// can overwrite web server user
chmod($cache_file_name, 0666);
$is_writable = 1;
} else {
$cache_file_name = NULL;
header('Content-type: ' . $mime_type);
}
if(stristr($mime_type, 'gif')) {
imagegif($image_resized, $cache_file_name);
} elseif(stristr($mime_type, 'jpeg')) {
imagejpeg($image_resized, $cache_file_name, $quality);
} elseif(stristr($mime_type, 'png')) {
$quality = floor($quality * 0.09);
imagepng($image_resized, $cache_file_name, $quality);
}
if($is_writable) {
show_cache_file( $cache_dir, $mime_type );
}
die();
}
function get_request( $property, $default = 0 ) {
if( isset($_REQUEST[$property]) ) {
return $_REQUEST[$property];
} else {
return $default;
}
}
function open_image($mime_type, $src) {
if(stristr($mime_type, 'gif')) {
$image = imagecreatefromgif($src);
} elseif(stristr($mime_type, 'jpeg')) {
@ini_set('gd.jpeg_ignore_warning', 1);
$image = imagecreatefromjpeg($src);
} elseif( stristr($mime_type, 'png')) {
$image = imagecreatefrompng($src);
}
return $image;
}
function mime_type($file) {
$os = strtolower(php_uname());
$mime_type = '';
// use PECL fileinfo to determine mime type
if( function_exists('finfo_open')) {
$finfo = finfo_open(FILEINFO_MIME);
$mime_type = finfo_file($finfo, $file);
finfo_close($finfo);
}
// try to determine mime type by using unix file command
// this should not be executed on windows
if(!valid_src_mime_type($mime_type) && !(strstr('windows', $os))) {
if(preg_match("/freebsd|linux/", $os)) {
$mime_type = trim(@shell_exec('file -bi $file'));
}
}
// use file's extension to determine mime type
if(!valid_src_mime_type($mime_type)) {
// set defaults
$mime_type = 'image/jpeg';
// file details
$fileDetails = pathinfo($file);
$ext = strtolower($fileDetails["extension"]);
// mime types
$types = array(
'jpg' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'png' => 'image/png',
'gif' => 'image/gif'
);
if(strlen($ext) && strlen($types[$ext])) {
$mime_type = $types[$ext];
}
}
return $mime_type;
}
function valid_src_mime_type($mime_type) {
if(preg_match("/jpg|jpeg|gif|png/i", $mime_type)) {
return true;
}
return false;
}
function check_cache($cache_dir, $mime_type) {
// make sure cache dir exists
if(!file_exists($cache_dir)) {
// give 777 permissions so that developer can overwrite
// files created by web server user
mkdir($cache_dir);
chmod($cache_dir, 0777);
}
show_cache_file($cache_dir, $mime_type);
}
function show_cache_file($cache_dir, $mime_type) {
$cache_file = $cache_dir . '/' . get_cache_file();
if( file_exists( $cache_file ) ) {
if( isset( $_SERVER[ "HTTP_IF_MODIFIED_SINCE" ] ) ) {
// check for updates
$if_modified_since = preg_replace( '/;.*$/', '', $_SERVER[ "HTTP_IF_MODIFIED_SINCE" ] );
$gmdate_mod = gmdate( 'D, d M Y H:i:s', filemtime( $cache_file ) );
if( strstr( $gmdate_mod, 'GMT' ) ) {
$gmdate_mod .= " GMT";
}
if ( $if_modified_since == $gmdate_mod ) {
header( "HTTP/1.1 304 Not Modified" );
exit;
}
}
$fileSize = filesize($cache_file);
// send headers then display image
header("Content-Type: " . $mime_type);
//header("Accept-Ranges: bytes");
header("Last-Modified: " . gmdate('D, d M Y H:i:s', filemtime($cache_file)) . " GMT");
header("Content-Length: " . $fileSize);
header("Cache-Control: max-age=9999, must-revalidate");
header("Expires: " . gmdate("D, d M Y H:i:s", time() + 9999) . "GMT");
readfile($cache_file);
die();
}
}
function get_cache_file () {
global $quality;
static $cache_file;
if(!$cache_file) {
$frags = explode(".", $_REQUEST['src'] );
$ext = strtolower( $frags[ count( $frags ) - 1 ] );
if(!valid_extension($ext)) { $ext = 'jpg'; }
$cachename = get_request( 'src', 'timthumb' ) . get_request( 'w', 100 ) . get_request( 'h', 100 ) . get_request( 'zc', 1 ) . get_request( '9', 80 );
$cache_file = md5( $cachename ) . '.' . $ext;
}
return $cache_file;
}
function valid_extension ($ext) {
if( preg_match( "/jpg|jpeg|png|gif/i", $ext ) ) return 1;
return 0;
}
function clean_source ( $src ) {
// remove http/ https/ ftp
//$src = preg_replace("/^((ht|f)tp(s|):\/\/)/i", "", $src);
// remove domain name from the source url
$host = $_SERVER["HTTP_HOST"];
$src = str_replace($host, "", $src);
$host = str_replace("www.", "", $host);
$src = str_replace($host, "", $src);
//$src = preg_replace( "/(?:^\/+|\.{2,}\/+?)/", "", $src );
//$src = preg_replace( '/^\w+:\/\/[^\/]+/', '', $src );
// don't allow users the ability to use '../'
// in order to gain access to files below document root
// src should be specified relative to document root like:
// src=images/img.jpg or src=/images/img.jpg
// not like:
// src=../images/img.jpg
$src = preg_replace( "/\.\.+\//", "", $src );
return $src;
}
function get_document_root ($src) {
if( @file_exists( $_SERVER['DOCUMENT_ROOT'] . '/' . $src ) ) {
return $_SERVER['DOCUMENT_ROOT'];
}
// the relative paths below are useful if timthumb is moved outside of document root
// specifically if installed in wordpress themes like mimbo pro:
// /wp-content/themes/mimbopro/scripts/timthumb.php
$paths = array( '..', '../..', '../../..', '../../../..' );
foreach( $paths as $path ) {
if( @file_exists( $path . '/' . $src ) ) {
return $path;
}
}
}
?>
[/codesyntax]




61 Comments
vẫn không hiện được thumail bác ơi, đã làm mọi cách
http://edtmedia.tk/
các pro giúp em
em sử dụng phpthump .
dùng theme genesis và sử dụng custom fields để hiển thị ảnh ngoài host
em muốn nhờ các bác hướng dẫn em resize ảnh thumail khi hiển thị ra trang chủ. cụ thể là height vì cái ảnh của em nó khá là dài . nhìn mất mỹ quan. thanks các bác nhìu ạ!
http://nf2.upanh.com/b3.s10.d1/3edde4a64a76a1c31b09d3470126f2fe_38168682.11.jpg
Dùng timthumb cho gọn nhẹ đi bác
Em chưa dùng phpthumb bao giờ nên ko support được cho bác rồi.
Các bác cho em hỏi, em test timthumb này trên server thì được đối với các host ngoài nhưng đối với domain của em thì lại không được . Thêm nữa, em up lên host thì file này không hoạt động … em đã cmod 777 đối với thư mục cache của theme nhưng vẫn không ăn thua … bác max chỉ giùm em với đc không ạ :P
mail em là tolatungs@gmail.com
có gì bác chỉ em qua yahoo tolatung cho tiện nhé. Em cám ơn bác nhiều
Vẫn bình thường mà
Code ngon quá, thanks
bác max2max có email ko, cho em xin để em hỏi cái này chút. Sao em dùng cái timthumb này cái ảnh của em lúc nào nó cũng nhỏ hơn cái khung viền bên ngoài. Em muốn sửa mà ko bít vào đâu cả… có gì bác giúp em nha
Có lẽ style của theme nó là như vậy thôi.
Email của em là tannt@fpt.edu.vn.
code pro quá vậy
xem tu vi
em dùng cái theme childtheme cho thesis không hỗ trợ slidebar và hiển thị footer. dùng code gì để cho hiện thị khi kéo wiget vào slidebar và footer ?
Lâu quá không thấy viết bài, có tính bỏ blog không đấy bạn ơi?
lâu quá không ghé thăm.
Năm mới phát tài chứ bạn hiền
Năm nay chơi bài ăn tiền chai.. mà đưa thằng em làm cái đi uống cafe chưa tới 15 phút thua sạch sẽ…
hix
Mình muốn hỏi bác max một tí có bao giờ bác gặp phải mấy cái spam kiểu này ko. Cái tên và email của nó thế này này: cqnzvzeljx
Em dùng akismet, cứ các cm có trong mục spam là em del liền nên chẳng bao giờ để ý.
Theme cua ban xinh qua. Ban lam code tot do
Điều này là đương nhiên rồi
Minh copy cai code nay roi past de zo cai file cua theme vn new 1.4 ma no van ko ra thumbnail
ga wa.
Ban nao co cach nao lam cho cai vn new 1.4 no tu nhan thumbnail ko xin chi giao
Để khi nào em ra phiên bản 2.0 bác dùng 1 thể nhé. Sau tết nguyên đán là có ngay. ^_^
Lâu rùi ko làm blog cũng ko ghé thăm các bác.
Nay vào nhìn thấy cái poll của bác nó kì kì. 2 lựa chọn đều là có :(
Cái này chắc hao Băng thông lắm ta.
Vâng, nếu bác định làm site tự động thì có thể làm cái này ^_^
ah mình cần resize và sử dụng link ảnh host ngoài (mình dùng host)
tại host mình dung lượng thấp nếu leech về host thì ko chơi đc
nick yahoo mình là: anh_chang_dep_trai_tk25@yahoo.com
thanks bạn trước
Vậy thì bác chỉ có thể resize chứ không crop được,
bác vì mấy hôm nay em đi làm không reply bác ngay được. ^_^ nếu bác chưa modify thì sáng mai em gửi cho bác ngay. em hứa rồi đó.
cám ơn bạn trước … ^^
bạn làm dùm mình chưa ^^!
Em đã gửi hướng dẫn qua Yahoo rồi đấy, mời bác check, lần sau nhớ dùng gmail thì em hướng dẫn nhanh hơn.
Vâng, em hiểu, nhưng cụ thể bác chỉ muốn lấy ảnh host ngoài hay là cả 2? Bác có muốn tự động cắt ảnh hay không cần. Bác dùng host hay server?
+ Nếu chỉ muốn resize chứ không cần tự động cắt ảnh, em có thể giúp.
+ Nếu bác muốn leech ảnh về host, bác chỉ cần chép đè nội dung trong bài viết này của em vào file timthumb.php
alo cho mình hỏi
mình đang xài theme weekly
mình rất thích chức năng thumbnail link ảnh host ngoài của theme vn-news
bác có thể giúp mình đc ko
yahoo mình là : anh_chang_dep_trai_tk25@yahoo.com
Dạ, dạo này em rất bận, khó có thể giúp bác được. Em nghĩ rằng em sẽ bổ sung bộ giao diện mới cho Vn-News có thể chuyển sang giống Weekly để mọi người có thể sử dụng hàng Made in Vietnam mà không vi phạm bản quyền. Em sẽ cố gắng hoàn thành trước tết âm lịch. Cảm ơn bác đã gợi ý.
hixx mình mò mấy ngày nay rồi mà làm ko đc, nếu bạn có ít thời gian thì giúp mình nha
hix
Vâng, nếu em hoàn thành xong dự án này em quay sang phát triển Vn-News 2.0 liền. Trong lúc đó em sẽ gửi bác.
ý mình là giúp vụ thumbnail thôi, chắc ko làm mất nhiều thời gian của bạn đâu ^^
@Desire’s Blog: Làm gì đến mức đó hả bác, đến đời thứ 50 là cùng
Các bạn đang nói gì thế
Bác là sinh viên của trường Nhân Văn, chắc ko quan tâm đến tiền như bọn em rồi
Tiền ai mà chả thích
Đang mong tự nhiên trên trời rơi xuống vài chục triệu để mau cannon 550D đây
Em chỉ cần cái Google Nexus Two là đủ rồi ^_<
Cái sự đời nó rối ren quá trời, thế này thì chỉ khổ cho người nghèo thôi!
Em cũng nghèo như bác thôi
Như vậy thì đến bao giờ mới được gọi là có của ăn của để đây?
Đến khi nào tương đương với Quốc Cường Gia Lai là được rồi
Chắc lúc đó là đời thứ 100 của con cháu mình rồi
Bác ơi em dùng thesis. Làm thế nào để ảnh trong bài viết có cái khung xung quanh ý nhỉ?
Trong file custom.css bác thêm vào
#content img{
padding: 5px;
border: 1px solid #ddd;
}
Tiện đây bác cho em hỏi, khi em up ảnh lên flickr, đuôi và kích cỡ ảnh của nó bị thay đổi. Ví dụ đuôi PNG thành JPG là lẽ tại sao bác nhỉ?
Em toàn chơi JPG nên chưa thử với PNG
Bác kiếm được cái này hay nhỉ, nhưng nó vẫn tốn dung lượng host để chứa ảnh leech về, giống theme RedCarpet ấy
Không có cách nào cắt trực tiếp được đâu
Về lý thuyết phải down về mới cắt được mà. Nếu cắt mà không cần leech file về thì ảnh ấy lưu ở đâu???
à, khi dùng Timthumb mà dùng thêm LazyLoad thì kết quả là load thumb trên site không hết, không phải die link nhưng giống die link…
Còn các hình ảnh trong content thì làm việc bình thường..
Không biết cái này khắc phục sao bác max nhỉ
Em chưa xài lazyload nên không rõ, sau này làm magazine giống bác thì em mới dùng
Dùng LazyLoading thì một số ảnh đôi khi sẽ không load được do tùy thuộc vào vị trí đặt code và còn tùy vào……sự kéo chuột trên trình của người dùng
.
Mình nghĩ nếu muốn hiển thị hình ảnh thumb đầy đủ nhất thì bạn không nên dùng Lazyloading
Show Gvatar người yêu? Bác thích trêu ngươi anh em à?
Yeah, thế này thì mai mốt không sợ thay theme bị lỗi không hiển thị hình ảnh rồi
Hì hì, nếu CPU load không cao thì không sao nhưng nó load cao quá thì phải tắt chức năng này đi. Đa số các trang warez và các trang tin tức thích dùng cái này.
Cái này thường dùng làm auto post hoặc các site leech, warez.
chắc dùng cho trang autopost thì hợp, chứ thường thì 1,2 bài thấm gì nhỉ.ok
Nó giống như là việc ta leech một file vậy.
oh. Yes
xacuop!