本章以計數器外掛與 Widget 作為實作主題,練習把功能、資料儲存、前台輸出與後台設定組合成更完整的外掛。
本章學習目標
能規劃計數器外掛,儲存使用次數,並建立可放入側邊欄或頁尾的小工具。
13.1 計數器外掛介紹
計數器可用來統計瀏覽次數、按鈕點擊、下載次數或表單送出次數。設計時要先決定計數範圍:全站、單篇文章、單一使用者或特定事件。
資料儲存選擇
- 簡單全站數值:可用
options。 - 文章相關數值:可用 post meta。
- 大量事件紀錄:應考慮自訂資料表。
計數器需求分析
開始寫程式前,先釐清計數器到底要統計什麼。不同需求會導向不同資料結構:
- 統計全站總瀏覽數:使用 option 即可。
- 統計每篇文章瀏覽數:使用 post meta 較直覺。
- 統計每日瀏覽趨勢:需要日期維度,可能要自訂資料表。
- 統計使用者行為:要考慮隱私、登入狀態與資料保留政策。
本章示範以文章瀏覽計數為主,因為它能練習 post meta、前台更新與列表顯示。
避免灌水與效能問題
單純每次載入文章就加一,容易被重新整理灌水,也可能在高流量網站造成資料庫寫入壓力。簡化教學可以先接受這個限制;正式網站則可加入 cookie、快取或排程批次寫入。
13.2 計數器外掛實作
以下是使用 option 儲存全站計數的簡化範例:
function wp2026_increment_counter() {
$count = (int) get_option('wp2026_counter', 0);
$count++;
update_option('wp2026_counter', $count);
return $count;
}
文章瀏覽數 post meta
若要統計每篇文章瀏覽數,可以把數值存到該文章的 post meta。以下範例只在單篇文章頁、主查詢中增加瀏覽數。
add_action('wp', 'wp2026_track_post_views');
function wp2026_track_post_views() {
if (!is_singular('post')) {
return;
}
$post_id = get_queried_object_id();
$views = (int) get_post_meta($post_id, '_wp2026_views', true);
update_post_meta($post_id, '_wp2026_views', $views + 1);
}
這個版本適合教學理解,但正式環境可再加入 cookie 或 transient,避免同一使用者短時間內重複計數。
前台顯示
add_shortcode('wp2026_counter', function () {
$count = (int) get_option('wp2026_counter', 0);
return '<span class="wp2026-counter">' . esc_html($count) . '</span>';
});
若要顯示單篇文章瀏覽數,可以改讀目前文章的 post meta:
function wp2026_get_post_views($post_id = null) {
$post_id = $post_id ?: get_the_ID();
return (int) get_post_meta($post_id, '_wp2026_views', true);
}
add_shortcode('wp2026_post_views', function () {
return esc_html(wp2026_get_post_views()) . ' 次瀏覽';
});
在後台文章列表加入欄位
為了讓管理者快速看到瀏覽數,可以在文章列表新增欄位。
add_filter('manage_post_posts_columns', 'wp2026_add_views_column');
function wp2026_add_views_column($columns) {
$columns['wp2026_views'] = '瀏覽數';
return $columns;
}
add_action('manage_post_posts_custom_column', 'wp2026_render_views_column', 10, 2);
function wp2026_render_views_column($column, $post_id) {
if ('wp2026_views' === $column) {
echo esc_html(wp2026_get_post_views($post_id));
}
}
13.3 建立小工具 Widget
Widget 可讓管理者把功能放在側邊欄、頁尾或支援 Widget 的區域。區塊主題中傳統 Widget 的使用情境減少,但理解它仍有助於維護舊網站。
Widget 設計重點
- 後台表單欄位要清楚。
- 前台輸出要轉義。
- 預設值要合理,避免空白畫面。
- 功能不應依賴特定主題。
Widget 類別骨架
傳統 Widget 會繼承 WP_Widget,並實作前台輸出、後台表單與更新設定三個方法。
class WP2026_Views_Widget extends WP_Widget {
public function __construct() {
parent::__construct(
'wp2026_views_widget',
'WP2026 瀏覽數小工具',
['description' => '顯示目前文章瀏覽數']
);
}
public function widget($args, $instance) {
echo $args['before_widget'];
echo '<p>' . esc_html(wp2026_get_post_views()) . ' 次瀏覽</p>';
echo $args['after_widget'];
}
}
註冊 Widget:
add_action('widgets_init', function () {
register_widget('WP2026_Views_Widget');
});
Widget 與區塊小工具
新版 WordPress 的小工具區也能放區塊,因此傳統 Widget 並不是唯一選擇。若你維護舊網站,傳統 Widget 很有用;若開發新功能,則可以評估用 shortcode、block 或 pattern 呈現。
本章練習
- 建立一個計數器 option。
- 用 shortcode 顯示目前數字。
- 設計一個 Widget 顯示計數器與標題。
- 測試停用外掛後前台是否不再輸出。