前些天看到通过 Google API 来生成二维码,但 Google 的服务在国内一直都不太稳定,所以我就考虑到缓存到本地,然后折腾出核心功能代码,再自己修改下,使它支持 首页、分类、标签、文章和页面 。
添加缓存函数到主题的 functions.php 文件
function
get_qr($url,$path,$qrpic){ set_time_limit (10); //设置十秒超时
$destination_folder = $path?$path.'/':''; $localname =
$destination_folder .$qrpic; $file = fopen ($url, "rb"); //fopen 函数的 r+模式:
读写方式打开 文件指针指向文件头 if ($file) { $newf = fopen ($localname, "wb"); //
w+, 读写方式打开 文件指针指向文件头 如果文件不存在则尝试创建之 if ($newf) while(!feof($file)) {
fwrite( $newf, fread($file, 1024 * 2 ), 1024 * 2 );
//写入文件,fread 控制文件最大的大小, 这里是 2M } } if ($file) { fclose($file);
//关闭 fopen 打开的文件 } if ($newf) { fclose($newf); } }
注:以上代码是缓存到本地的功能
建相关文件夹
在网站根目录建立一个叫 qrcode 的新文件夹,确保有写入权限 (755 或 777),用于保存图片。
将代码放到需要输出二维码图片的地方
如 single.php 、 sidebar.php 等
<?php
if(is_single() || is_page() || is_home() || is_front_page() ||
is_category() || is_tag()) ://只在文章、页面、首页、分类/标签存档,才加载下面的代码 $imgsize =
150; //二维码图片大小 if (is_single() || is_page()) $imgname =
get_the_id();//使用文章/页面 ID 命名图片 elseif (is_home() || is_front_page())
$imgname = 'home';//首页使用 home 命名 elseif(is_category()) $imgname =
'cat-'.get_query_var('cat');//分类使用 cat-ID 命名 elseif(is_tag()) $imgname =
'tag-'.get_query_var('tag_id');//标签使用 tag-ID 命名 $localqr = ABSPATH
.'qrcode/'.$imgname.'.jpg'; if (!file_exists($localqr))
{//如果图片已经存在, 则不会再次保存 get_qr(
"http://chart.googleapis.com/chart?cht=qr&chs=".$imgsize."x".$imgsize."&choe=UTF-8&chld=L|2&chl=".get_permalink()
,"qrcode", $imgname.".jpg"); } ?> <img src="<?php echo
home_url( '' ); ?>/qrcode/<?php echo $imgname ?>.jpg"
width="<?php echo $imgsize ?>" height="<?php echo $imgsize
?>" alt="QR Code"/> <?php endif; ?>
注:以上代码是命名和显示二维码图片。添加代码后,页面在被第一次访问就会生成图片,然后缓存到本地
使
用 ID 来命名图片,主要是考虑到 WordPress 的 ID 是独一无二的 (标签、分类的 ID 和文章、页面的 ID 可能会重复,所以前面两种都添加的前缀命
名),而且是 ID 基本不会改变的。这样一来每个页面只生成一次图片并缓存到本地目录,然后直接调用本地的图片,不需要每次都访问 Google
API,从而提高加载速度。