前些天看到透過 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,從而提高載入速度。