[anti-both]
據 說 ,WordPress 的 市 場 佔 有 率 很 高 。不 止 個 人 網 誌 ,連 很 多 商 業 網 站 ,都 是 使 用 WordPress 的 。我 想 WordPress 的 其 中 一 個 好 處 ,就 是 有 很 多 好 用 的 Plugins。但 你 可 能 不 知 道 ,原 來 要 寫 個 WordPress Plugin 亦 是 很 容 易 的 。
WordPress 本 身 是 用 php 寫 的 ,要 寫 WordPress Plugin 你 也 要 懂 得 一 點 php。今 天 教 大 家 寫 一 個 為 文 章 中 的 中 文 字 加 上 空 白 的 Plugin。
有 部 分 博 主 ,跟 著 者 一 樣 ,不 太 喜 歡 網 站 裡 的 中 文 字 排 得 太 密 ,看 起 來 不 太 舒 服 。我 們 會 在 每 個 中 文 字 之 間 加 入 一 個 空 白 (Space),令 文 章 更 容 易 閱 讀 。有 些 博 主 會 直 接 在 後 台 的 文 字 編 輯 器 裡 面 ,自 行 為 每 個 中 文 字 加 入 空 白 。但 這 樣 一 來 工 程 巨 大 ,費 時 失 事 ,二 來 文 章 保 存 之 後 ,要 修 改 也 麻 煩 。
我 的 解 決 方 法 是 在 WordPress 加 一 個 Plugin,在 博 文 顯 示 出 來 的 時 候 才 自 動 加 上 空 白 。那 保 存 在 資 料 庫 裡 面 的 文 章 ,還 是 正 常 沒 有 空 白 的 ,往 後 要 修 改 也 方 便 一 些 。
一 個 WordPress Plugin,最 簡 單 的 形 式 ,就 是 一 個 php 檔 案 ,就 像 WordPress 裡 的 範 例 Hello Dolly。所 以 ,今 天 為 大 家 示 範 的 的 Plugin,也 是 由 最 簡 單 的 方 式 ,一 個 php 檔 案 開 始 。首 先 ,用 你 喜 歡 的 純 文 字 編 輯 器 開 一 個 新 的 純 文 字 檔 ,改 個 簡 單 易 懂 的 名 字 ,例 子 中 會 叫 做 add_space.php。記 得 要 儲 存 為 UTF-8 編 碼 ,因 為 WordPress 是 用 UTF-8 的 。
第 一 樣 我 們 要 寫 的 ,是 Standard Plugin Information。WordPress 會 在 Plugin 頁 顯 示 你 輸 入 的 這 些 資 訊 。至 少 ,你 要 輸 入 Plugin Name,其 他 部 分 則 是 選 擇 性 的 。這 些 資 訊 並 不 會 影 響 Plugin 的 功 能 。
<?php /* Plugin Name: Name Of The Plugin Plugin URI: http://URI_Of_Page_Describing_Plugin_and_Updates Description: A brief description of the Plugin. Version: The Plugin's Version Number, e.g.: 1.0 Author: Name Of The Plugin Author Author URI: http://URI_Of_The_Plugin_Author License: A "Slug" license name e.g. GPL2 */
在 我 們 的 範 例 ,我 寫 簡 單 一 點 。
<?php /* Plugin Name: Add space for Chinese Description: It will add a space between each Chinese character Version: 0.1 Author: C.T. Leung License: GPL2 */
WordPress 提 供 了 幾 種 不 同 的 方 法 ,讓 你 跟 WordPress 裡 面 的 功 能 和 資 料 互 動 。第 一 種 方 法 叫 filters,是 方 便 你 提 取 WordPress 裡 面 的 資 料 出 來 ,再 作 處 理 的 。WordPress 裡 面 的 資 料 有 很 多 ,例 如 每 一 個 Post,就 會 有 title、content、category、comment、tag、author、publish date 等 等 的 資 料 ,使 用 不 同 的 filters ,就 可 以 抽 取 出 要 處 理 的 資 料 ,再 進 行 處 理 。
第 二 種 方 法 叫 actions,就 是 我 們 一 般 說 的 event。當 有 特 定 的 事 件 發 生 ,例 如 我 們 寫 完 了 博 文 按 Publish 鍵 ,就 會 產 生 一 個 action 叫 publish_post。我 們 可 以 自 行 定 義 一 些 程 式 碼 ,在 指 定 的 actions 的 時 候 執 行 。例 如 ,在 publish_post 的 時 候 ,向 一 些 讀 者 發 送 電 郵 提 示 。
第 三 種 方 法 是 向 WordPress 增 加 shortcode,就 是 你 自 己 定 義 的 Tag。例 如 :[anti rclick]、[QT]等 。很 多 這 些 shortcode 都 是 在 plugin 裡 面 定 義 的 。
由 於 我 是 要 在 博 文 顯 示 出 來 之 前 加 上 空 白 ,所 以 我 們 要 用 的 是 filters。首 先 我 們 要 用 add_filter 增 加 一 個 filter。
add_filter('hook_name','your_filter',[priority],[accepted_args]);
我 想 要 使 用 的 hook_name 是 the_content。the_content 的 定 義 是 剛 從 資 料 庫 提 取 出 來 ,並 且 在 顯 示 之 前 的 博 文 內 容 。your_filter 就 是 你 自 定 義 的 function,也 就 是 你 想 要 執 行 的 動 作 。之 後 兩 個 參 數 都 是 選 擇 性 的 。再 來 看 看 我 們 的 例 子 。
add_filter('the_content', 'add_space_for_chinese', 11 ); function add_space_for_chinese($content) { // do something you want return $content; }
然 後 再 看 看 我 的 自 定 義 function add_space_for_chinese 要 怎 麼 寫 。$content 就 是 我 們 從 the_content filter 提 取 出 來 的 博 文 內 容 。
function add_space_for_chinese($content) { $convmap = array(0x80, 0xffff, 0, 0xffff); $output = mb_encode_numericentity($content, $convmap, 'UTF-8'); $output = preg_replace('/(\&\#[0-9]{5}\;)/', '\\1'.' ', $output); return $output; }
首 先 ,我 們 用 mb_encode_numericentity 把 中 文 字 轉 成 字 碼 (就 像 〹),方 便 一 會 兒 用 preg_replace 來 加 上 空 白 。$convmap 是 用 來 指 定 什 麼 字 要 轉 ,什 麼 字 不 轉 的 。在 我 們 的 例 子 ,就 是 英 文 字 符 等 的 字 通 通 都 不 轉 。
在 preg_replace 裡 面 ,我 們 用 regular expression 找 出 所 有 符 合 〹 樣 子 的 字 串 ,再 在 子 串 之 後 加 上 一 個 空 白 。
就 這 樣 ,我 們 的 第 一 個 WordPress Plugin 完 成 了 。下 面 就 是 整 個 add_space.php 檔 案 的 內 容 。
<?php /* Plugin Name: Add space for Chinese Description: It will add a space between each Chinese character Version: 0.1 Author: C.T. Leung License: GPL2 */ add_filter('the_content', 'add_space_for_chinese', 11 ); function add_space_for_chinese($content) { $convmap = array(0x80, 0xffff, 0, 0xffff); $output = mb_encode_numericentity($content, $convmap, 'UTF-8'); $output = preg_replace('/(\&\#[0-9]{5}\;)/', '\\1'.' ', $output); return $output; } ?>
只 要 你 把 這 個 php 檔 案 上 傳 到 WordPress 的 Plugin 資 料 夾 ,再 activate 一 次 ,便 會 看 到 效 果 的 了 。下 次 我 們 再 談 ,如 何 為 plugin 加 上 使 用 者 選 項 ,和 如 何 在 資 料 庫 儲 存 使 用 者 選 項 。