[anti-both]
上 次 替 大 家 寫 了 一 個 很 簡 單 的 WordPress Plugin,接 著 再 來 為 大 家 介 紹 如 何 編 寫 可 以 讓 使 用 者 定 義 參 數 的 設 定 頁 ,以 及 如 何 將 那 些 參 數 儲 存 到 資 料 庫 。如 果 你 有 開 發 php 的 經 驗 ,你 會 覺 得 WordPress 令 這 個 過 程 變 得 異 常 地 簡 單 。現 在 先 回 顧 一 下 上 次 寫 的 plugin。
<?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; } ?>
要 令 WordPress 增 加 一 個 plugin 的 設 定 頁 ,我 們 要 用 add_action,在 WordPress 處 理 admin_menu 的 時 候 做 點 什 麼 ,那 些 什 麼 也 是 用 一 條 自 定 義 的 function 來 表 示 ,在 這 裡 我 叫 他 add_space_menu。
add_action('admin_menu', 'add_space_menu');
在 add_space_menu 用 add_menu_page 增 加 一 個 設 定 頁 面 。
function add_space_menu() { add_menu_page('Add Space Plugin Settings', 'Add Space', 'administrator', __FILE__, 'add_space_settings_page'); }
而 當 中 的 add_space_settings_page,是 另 一 條 自 定 義 function,裡 面 就 是 裝 著 設 定 頁 的 html 碼 的 。
function add_space_settings_page() { ?> <div class="wrap"> <h2>Add Space for Chinese</h2> <form method="post" action="options.php"> <input type="checkbox" name="add_space" value="1" /> Add Space to all Chinese characters.<br /> Add extra text to space <input type="checkbox" name="add_space_text" value="" /> <p class="submit"> <input type="submit" class="button-primary" value="Save Changes" /> </p> </form> </div> <? }
心 水 清 的 讀 者 ,大 概 會 注 意 到 ,上 面 的 程 式 碼 ,都 沒 有 處 理 到 使 用 者 設 定 參 數 的 問 題 。這 是 因 為 想 簡 化 程 式 碼 ,好 讓 大 家 更 容 易 讀 懂 。
WordPress 在 處 理 使 用 者 設 定 參 數 方 面 ,發 展 了 一 個 方 法 ,令 我 們 可 以 少 寫 很 多 程 式 碼 。首 先 要 為 我 們 的 參 數 群 改 一 個 名 字 ,例 子 中 會 使 用 add-space-group。
我 們 現 在 要 向 WordPress 登 記 我 們 會 使 用 的 參 數 。首 先 要 在 add_space_menu 裡 面 增 加 一 個 action,在 管 理 員 登 入 後 台 管 理 頁 面 的 時 候 登 記 我 們 的 參 數 。register_add_space_sttings 是 我 們 的 自 定 義 function,是 用 來 登 記 參 數 的 。裡 面 登 記 了 一 個 參 數 add_space 。
function add_space_menu() { add_menu_page('Add Space Plugin Settings', 'Add Space', 'administrator', __FILE__, 'add_space_settings_page'); add_action( 'admin_init', 'register_add_space_settings' ); } function register_add_space_settings() { register_setting( 'add-space-group', 'add_space' ); }
要 在 我 們 的 設 定 頁 處 理 這 些 參 數 ,我 們 只 要 在 form 的 開 頭 加 入 settings_fields 和 do_settings_fields 兩 條 function,WordPress 就 會 為 我 們 處 理 所 有 資 料 庫 存 取 的 問 題 。要 使 用 參 數 ,就 用 get_option。
function add_space_settings_page() { ?> <div class="wrap"> <h2>Add Space for Chinese</h2> <form method="post" action="options.php"> <?php settings_fields('add-space-group'); ?> <?php do_sttings_fields('add-space-group',__FILE__); ?> <input type="checkbox" name="add_space" value="1" <?php if (get_option('add_space')==1) echo "checked" ; ?> /> Add Space to all Chinese characters.<br /> <p class="submit"> <input type="submit" class="button-primary" value="Save Changes" /> </p> </form> </div> <? }
利 害 吧 ?幾 行 程 式 碼 就 搞 定 了 連 接 資 料 庫 的 問 題 。不 只 完 全 不 用 管 sql, table name,field name 什 麼 的 ,連 要 你 寫 幾 行 php 程 式 碼 去 處 理 回 傳 的 變 數 都 不 用 ,通 通 指 向 option.php 就 會 自 動 幫 你 處 理 。
那 我 儲 存 的 這 個 add_space 參 數 有 什 麼 用 呢 ?我 用 它 來 決 定 是 否 要 在 the_content filter 加 上 空 白 。
function add_space_for_chinese($content) { $add_space = get_option('add_space'); if ($add_space) { $convmap = array(0x80, 0xffff, 0, 0xffff); $output = mb_encode_numericentity($content, $convmap, 'UTF-8'); $output = preg_replace('/(\&\#[0-9]{5}\;)/', '\\1'.' ', $output); return $output; } else { return $content; } }
那 為 什 麼 要 關 閉 加 空 白 的 功 能 呢 ?因 為 不 知 道 使 用 者 寫 文 章 的 習 慣 ,將 所 有 中 文 都 加 空 白 可 能 會 對 某 些 使 用 者 做 成 不 便 。然 後 ,我 們 可 以 在 plugin 加 上 一 個 自 定 義 的 shortcode,讓 使 用 者 在 有 需 要 的 段 落 ,才 使 用 這 個 加 空 白 的 功 能 。這 裡 我 使 用 的 shortcode 名 稱 是 add-space。使 用 方 法 就 是 [add-space]文 章 內 容 [/add-space]。
add_shortcode( 'add-space', 'add_space_shortcode' ); function add_space_shortcode( $atts, $content = null ) { $convmap = array(0x80, 0xffff, 0, 0xffff); $output = mb_encode_numericentity($content, $convmap, 'UTF-8'); $output = preg_replace('/(\&\#[0-9]{5}\;)/', '\\1'.' ', $output); return $output; }
要 增 加 一 個 自 定 義 的 shortcode 亦 很 簡 單 ,用 add_shortcode 就 可 以 。add_space_shortcode 是 自 定 義 的 function,用 來 處 理 文 章 裡 面 shortcode 中 包 著 的 內 容 ,那 些 內 容 就 是 包 含 在 變 數 $content 之 中 。
然 後 所 有 東 西 加 到 一 起 ,加 上 本 來 的 plugin,一 起 貼 到 下 面 。在 新 版 本 中 ,使 用 者 可 以 在 設 定 頁 選 擇 是 否 要 為 全 文 增 加 空 白 ,也 可 以 選 擇 性 的 ,用 [add-space] shortcode 來 增 加 空 白 。習 慣 上 ,把 version 稍 為 增 加 到 0.2。
<?php /* Plugin Name: Add space for Chinese Description: It will add a space between each Chinese character Version: 0.2 Author: C.T.Leung License: GPL2 */ add_filter('the_content', 'add_space_for_chinese', 11 ); function add_space_for_chinese($content) { $add_space = get_option('add_space'); if ($add_space) { $convmap = array(0x80, 0xffff, 0, 0xffff); $output = mb_encode_numericentity($content, $convmap, 'UTF-8'); $output = preg_replace('/(\&\#[0-9]{5}\;)/', '\\1'.' ', $output); return $output; } else { return $content; } } add_shortcode( 'add-space', 'add_space_shortcode' ); function add_space_shortcode( $atts, $content = null ) { $convmap = array(0x80, 0xffff, 0, 0xffff); $output = mb_encode_numericentity($content, $convmap, 'UTF-8'); $output = preg_replace('/(\&\#[0-9]{5}\;)/', '\\1'.' ', $output); return $output; } add_action('admin_menu', 'add_space_menu'); function add_space_menu() { add_menu_page('Add Space Plugin Settings', 'Add Space', 'administrator', __FILE__, 'add_space_settings_page'); add_action( 'admin_init', 'register_add_space_settings' ); } function register_add_space_settings() { register_setting( 'add-space-group', 'add_space' ); } function add_space_settings_page() { ?> <div class="wrap"> <h2>Add Space for Chinese</h2> <form method="post" action="options.php"> <?php settings_fields('add-space-group'); ?> <?php do_sttings_fields('add-space-group',__FILE__); ?> <input type="checkbox" name="add_space" value="1" <?php if (get_option('add_space')==1) echo "checked" ; ?> /> Add Space to all Chinese characters.<br /> <p class="submit"> <input type="submit" class="button-primary" value="Save Changes" /> </p> </form> </div> <? } ?>