最後更新:2026/10/15
每年一月,總有網站的頁尾還寫著去年的版權年。首頁想放一個「現在營業中」的小標籤,要靠客人自己算時間。活動頁想寫「早鳥優惠倒數 12 天」,隔天就變成錯的。這些都是很小的功能,裝外掛太重,每天手動改又不可能。
WordPress 有一個很適合做這種小功能的機制叫短代碼:在文章或頁面裡寫一個中括號包起來的標籤,例如 [mimi_year],顯示的時候會換成程式算出來的內容。這篇用四個例子教你自己寫:從一行就好的年份,到帶參數的營業時間、倒數、最新文章清單。看懂這四個,你就能寫出自己網站需要的任何小標籤。
不想自己改?把這篇交給 AI
把這篇的網址(或全文)連同下面這段話貼給 AI:
我的網站是 WordPress。我想照下面這篇文章,自己寫幾個短代碼,例如顯示年份、營業中、活動倒數、最新文章。
請先問我:我要哪幾個、營業時間是幾點到幾點、活動結束日期、最新文章要幾篇。
問清楚之後,再一步一步告訴我:要用哪一段程式碼、貼在哪裡、哪些地方要換成我自己的資料,以及在頁面裡怎麼放短代碼、怎麼確認有效。
如果文章的做法不適合我的網站,請直接告訴我原因和替代做法。
文章:(貼上這篇的網址,或整篇內容)
改之前先備份,密碼不要貼給 AI。
短代碼的三個規則
寫之前先記住三件事。第一,短代碼是用 add_shortcode('名稱', 函式) 登記的,名稱用小寫英文和底線,前面加你自己的前綴(我們用 mimi_),才不會跟外掛撞名。第二,函式要「回傳」字串,不是「印出」;用 echo 會印在頁面最上面而不是短代碼的位置。第三,短代碼可以帶參數,像 [mimi_open hours="10:00-18:00"],函式用 shortcode_atts 把參數和預設值合起來,沒填的參數就用預設值。
完整程式碼
// 第 84 篇:自己寫一個短代碼
// 1. [mimi_year]:今年的年份,頁尾的版權年用這個就不用每年改
add_shortcode('mimi_year', function () {
return wp_date('Y');
});
// 2. [mimi_open hours="10:00-18:00" days="1-6"]:現在營業中還是休息中(days:1 是週一、7 是週日)
add_shortcode('mimi_open', function ($atts) {
$a = shortcode_atts(['hours' => '09:00-18:00', 'days' => '1-5', 'open' => '營業中', 'closed' => '休息中'], $atts);
[$from, $to] = explode('-', $a['hours']);
[$d1, $d2] = array_map('intval', explode('-', $a['days']));
$now = current_datetime();
$weekday = (int) $now->format('N');
$time = $now->format('H:i');
$is_open = $weekday >= $d1 && $weekday <= $d2 && $time >= $from && $time < $to;
return '<span class="mimi-open ' . ($is_open ? 'is-open' : 'is-closed') . '">' . esc_html($is_open ? $a['open'] : $a['closed']) . '</span>';
});
// 3. [mimi_countdown to="2024-12-31" label="早鳥優惠倒數"]:還有幾天
add_shortcode('mimi_countdown', function ($atts) {
$a = shortcode_atts(['to' => '', 'label' => '倒數', 'done' => '已經結束'], $atts);
$end = $a['to'] ? date_create($a['to'] . ' 23:59:59', wp_timezone()) : null;
if (!$end) {
return '';
}
$days = (int) floor(($end->getTimestamp() - current_datetime()->getTimestamp()) / DAY_IN_SECONDS);
return '<span class="mimi-countdown">' . esc_html($days >= 0 ? sprintf('%s %d 天', $a['label'], $days + 1) : $a['done']) . '</span>';
});
// 4. [mimi_latest n="3" cat="news"]:最新幾篇文章的清單
add_shortcode('mimi_latest', function ($atts) {
$a = shortcode_atts(['n' => 3, 'cat' => ''], $atts);
$posts = get_posts(['numberposts' => (int) $a['n'], 'category_name' => $a['cat']]);
if (!$posts) {
return '<p>目前沒有文章。</p>';
}
$out = '<ul class="mimi-latest">';
foreach ($posts as $p) {
$out .= '<li><a href="' . esc_url(get_permalink($p)) . '">' . esc_html(get_the_title($p)) . '</a> <small>' . esc_html(get_the_date('Y/m/d', $p)) . '</small></li>';
}
return $out . '</ul>';
});
程式碼放在 Code Snippets 這類外掛或子主題,放法和備份方式見〈WooCommerce 結帳頁改成台灣習慣〉。
四個例子各學到什麼
第 1 個是最小的短代碼:沒有參數、一行回傳。wp_date('Y') 用網站設定的時區算今年,頁尾寫成「© [mimi_year] MIMI網頁設計」,以後每年一月自動變。頁尾如果是用區塊編輯器的頁尾範本,放一個「短代碼」區塊進去就好。
第 2 個學參數。hours 是營業時間、days 是星期幾到星期幾(1 是週一、7 是週日)、open 和 closed 是要顯示的字。程式用網站設定的時區拿現在的星期和時間,在範圍內就回傳「營業中」,不在就回傳「休息中」,外面包一個有類別的 span,你可以用 CSS 把營業中做成綠色小圓點、休息中灰色。有兩段營業時間(中午休息)的店,放兩個短代碼或自己多加一組參數。
第 3 個學日期。to 是結束日期,程式把它當成那天的 23:59:59,算到現在還有幾天,活動當天顯示「倒數 1 天」,過了顯示「已經結束」。這種倒數是在伺服器算的,頁面有快取的話會停在快取當時的數字,快取時間設一天以內就看不出差別;要每秒跳動的那種倒數要用瀏覽器端的程式,這篇沒做。
第 4 個學輸出一段 HTML。n 是幾篇、cat 是分類代稱,用 get_posts 拿文章,組成一個清單回傳。注意每一個從資料庫拿出來的東西都經過 esc_html 或 esc_url,這是寫短代碼的習慣,不管內容來自哪裡都先消毒。
測試結果
我們在本機測試站建一頁,放進四個短代碼:
[mimi_year]顯示今年的年份。[mimi_open hours="00:00-23:59" days="1-7"]顯示「營業中」,[mimi_open hours="03:00-03:01" days="1-7"]顯示「休息中」,兩個的span類別分別是is-open和is-closed。[mimi_countdown to="2030-12-31" label="活動倒數"]顯示「活動倒數 1539 天」,[mimi_countdown to="2020-01-01"]顯示「已經結束」。[mimi_latest n="2"]顯示一個清單,裡面是測試站僅有的一篇文章和日期。
短代碼放在哪裡才會動
文章和頁面的內文直接打就會動。區塊編輯器用「短代碼」區塊最保險,段落裡也可以。小工具(傳統佈景主題的側欄、頁尾)用「短代碼」小工具或文字小工具。佈景主題的範本檔裡要用 echo do_shortcode('[mimi_year]')。WooCommerce 的商品簡短說明也吃短代碼,商品分類描述則不一定,看佈景主題。
短代碼在 WordPress 裡到處都是:WooCommerce 的購物車、結帳頁以前就是短代碼,表單外掛也多半用短代碼放表單。看懂怎麼寫,就看得懂別人的,像〈WooCommerce 會員限定內容〉用短代碼把一段文字包起來只給會員看,〈WooCommerce 商品太多客人找不到?〉用短代碼印一張商品表格,骨架都是這篇的樣子。
小功能自己寫,網站才不會外掛越裝越多
年份、營業中、倒數、最新文章,每一個都有外掛可以裝,裝四個外掛就多四個要更新、四個可能衝突的東西。幾行短代碼做完,放在子主題或程式碼片段裡,網站乾淨,自己也看得懂。
如果你的網站有一些「別人的外掛做不到、自己又不會寫」的小需求,可以先看〈IG 帳號不是你的資產〉想想網站要做到什麼。MIMI 專做客製化網頁設計,客製功能網站可以依你的需求寫這些小功能。MIMI 提供新北網頁設計服務,新北的店家可以用電話、Email 直接和設計師討論;費用可以先看首頁的製作費用參考,歡迎聯絡 MIMI。
