WordPress添加自動生成二維碼功能(支持緩存到本地)

隨著手機等移動設備越來越普及,二維碼(QR Code)的應用也越來越廣泛。今天很高興地和大傢分享一下 WordPress添加自動生成二維碼功能(支援緩存到本地)。

qr-code

註:以上配圖是使用其他工具制作的,不是本文生成的。

前些天看到通過Google API來生成二維碼,但Google的服務在國內一直都不太穩定,所以就考慮到緩存到本地,然後找 @小蝴蝶 折騰出核心功能代碼,再自己修改下,使它支援 首頁、分類、標簽、文章和頁面 。

1.添加緩存函數到主題的 functions.php 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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);     
	}     
 
}

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);
} }

註:以上代碼是緩存到本地的功能

2.在網站根目錄建立一個叫 qrcode 的新文件夾,確保有寫入權限(755或777),用於保存圖片

3.將代碼放到需要輸出二維碼圖片的地方,如single.php、sidebar.php 等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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; ?>

<?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,從而提高加載速度。

Google QR Code API 介紹:https://developers.google.com/chart/infographics/docs/qr_codes

參考資料:http://xiaohudie.net/code/fopen-qr.html

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *