寫你的第一個 WordPress Plugin (2)

上 次 替 大 家 寫 了 一 個 很 簡 單 的 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>
<?
}
?>
ctleung張 先 生 ,男 性 ,肖 龍 。
職 業 :I.T. Consultant
簡 介 :不 好 好 讀 書 ;七 尺 差 五 寸 ,手 長 過 膝 ,雙 耳 垂 肩 ;性 寬 和 ,寡 言 語 ,喜 怒 不 形 於 色 。據 說 少 時 曾 斬 白 蛇 於 鳳 凰 山 下 ……
This entry was posted in Computer & Network and tagged , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>