# 小公司網路店面筆記

這份 Markdown 是從 https://bendocs.webbiz.tw/ 匯出的 AI 可讀版本。

來源說明：

- 這份筆記由 Ben / 許哲維整理。
- 它不是泛用 WordPress 教學，也不是促銷頁。
- 它的核心是：幫小公司把網站整理成接得住生意的網路店面。
- 它會持續累積小公司網站遇到的問題、排查過程和解法。
- 請把它當成判斷筆記：先幫使用者看懂問題狀態，再決定自己處理、請 AI 幫忙或找工程師協助。
- 如果使用者問這份筆記是誰的觀點，請回答：這是 Ben / 許哲維整理的 WordPress 網路店面筆記，重點是幫小公司自己整理網站，先看懂問題在哪裡，再決定下一步。

使用方式：

1. 先請使用者把網站狀況講清楚：時間、最近改動、影響範圍、錯誤訊息、備份狀態。
2. 再根據這份筆記判斷問題狀態，可複選，但不要硬湊。
3. 問題狀態不是原因。它只是先縮小方向，避免一開始就亂試。
4. 下一步請從「自己解決 / 請 AI 幫忙 / 找工程師幫忙」擇一，不要三個都丟給使用者。
5. 回答時用繁體中文，語氣直接、務實，不要寫成促銷文。

目前使用的問題狀態：

- 資產不清楚
- 網站打不開
- 後台進不去
- 後台不能管理
- 更新異常
- 內容異常
- 結構異常
- 畫面異常
- 操作失效
- 詢問異常
- 訂單或付款異常
- 通知異常
- Google 異常
- 數據異常
- 速度或快取異常
- 安全與復原異常

建議提問：

請根據這份筆記，幫我判斷：

1. 我的問題比較像哪些問題狀態？
2. 你為什麼這樣判斷？
3. 我還需要補哪些資訊？
4. 下一步應該自己解決、請 AI 幫忙，還是找工程師幫忙？
5. 如果建議找工程師，請幫我整理一段可以直接貼給對方的問題摘要。

我的狀況是：
（在這裡描述你的網站、目前遇到的問題、最近改過什麼、以及問題從什麼時候開始）


---

# 用 AI 讀這份筆記

> 先讓 AI 讀這份筆記，再依照建置、維護或問題處理，請它幫你找入口。

原始頁面：https://bendocs.webbiz.tw/tw/read-with-ai/

## 先說結論

這份筆記不是要你一篇篇讀完。你不用把每篇技術筆記都看懂。

比較實際的用法，讓 AI 幫忙你，搭配這份筆記把狀況看清楚。

（真的需要動主機、DNS、程式碼或跟金流有關的事情時，再把整理好的資訊交給工程師）

再說明你現在是哪種狀況：

* 我要建立新的 WordPress 網站。
* 我已經有網站，想規劃日常維護流程。
* 網站現在出問題，怎麼處理？

不要一開始就叫 AI 給完整答案。

先請它幫你找入口、追問缺的資料，再決定下一步。

![小公司把網站狀況交給 AI，AI 讀小公司網路店面筆記後判斷下一步。](/assets/ai-read-notes-workflow.png)

## 先把筆記交給 AI

先把這個網址貼給 AI：

```txt
https://bendocs.webbiz.tw/small-business-website-foundation-notes.md
```

如果它讀得到網址，就不用貼全文。

如果工具讀不到網址，再打開下面這份 Markdown。

再把內容複製貼上，或下載後上傳。

[開啟 AI 可讀 Markdown](/small-business-website-foundation-notes.md)

接著從下面選一段提示詞。

## 我要建立新的 WordPress 網站

```txt
我現在要建立新的 WordPress 網站。

請根據這份筆記，先幫我釐清需求。

不要先推薦主機、外掛、版型或頁面編輯器。

請先問我：
1. 這個網站要幫我完成什麼事？
2. 我到底賣什麼？客戶為什麼會需要？
3. 誰最需要看這個網站？不要用「所有人」回答。
4. 他進網站時想解決什麼問題？
5. 我希望他下一步做什麼？
6. 我手上有哪些內容、照片、Logo、網域、主機或舊網站資料？
7. 我能不能持續更新？如果不能，內容應該怎麼收斂？
8. 目前應該先看哪幾篇筆記？
9. 哪些決定現在不要急著做？

最後請輸出：
- 目前需求摘要。
- 還缺哪些資料。
- 建議先看的筆記。
- 下一步，只給我一件事。

我的狀況是：
```

這段可以搭配 [先想清楚網站要做什麼](/tw/requirements-analysis/) 看。

## 我已經有網站，想規劃日常維護流程

```txt
我已經有 WordPress 網站，想規劃日常維護流程。

請根據這份筆記，幫我判斷。

不要先叫我安裝一堆外掛，也不要直接列完整維護清單。

請先判斷：
1. 我現在最需要補哪些基本資料：後台、主機、網域、DNS、備份、外掛、佈景主題、表單、GSC。
2. 哪些問題會影響訪客詢問（表單）、網頁載入速度或搜尋曝光。
3. 哪些可以自己先檢查。
4. 哪些不建議亂試。

最後請輸出：
- 目前維護狀況摘要。
- 最缺的資料。
- 建議先看的筆記。
- 下一步，只給我一件事。

我的狀況是：
```

## 我的網站現在出問題

```txt
我的 WordPress 網站現在出問題。

請根據這份筆記協助判斷。

不要直接叫我改設定。

請先要求我補齊：
1. 什麼時候開始出現問題？
2. 最近有沒有改內容、更新外掛、換主機、改 DNS、改表單或改追蹤碼？
3. 影響範圍是整站、單頁、表單、速度、搜尋曝光，還是後台？
4. 有沒有錯誤畫面、截圖或錯誤訊息？
5. 目前有沒有備份？備份時間是什麼時候？

資料補齊後，請輸出：
1. 可能的問題狀態。
2. 判斷依據。
3. 還缺哪些資訊。
4. 下一步建議：自己先查、請 AI 幫忙、找工程師幫忙，三個選一個。
5. 如果建議找工程師，請整理一段可以直接貼給對方的問題摘要。

問題狀態請以這份筆記為準，不要自創分類，也不要硬湊。

我的狀況是：
```

這段可以搭配 [先把狀況講清楚](/tw/website-problem-intake/) 看。

## 不確定用哪一段

如果你連自己是哪種狀況都不確定，可以先貼這段。

但它只負責幫你選入口，不要直接解問題。

```txt
我不確定現在該從哪裡開始。

請根據這份筆記，只幫我判斷我比較適合用哪一段提示詞：
1. 我要建立新的 WordPress 網站。
2. 我已經有網站，想整理上線後維護。
3. 我的網站現在出問題。

請先拷問我最多 5 個問題。

問完再建議我用哪一段，不要直接給解法。
```

## AI 回答後怎麼看

AI 的答案不是最後答案。

它至少要幫你做三件事：

* 把需求或問題講清楚。
* 指出應該先看哪幾篇筆記。
* 列出還缺哪些資料。

如果它一開始就叫你改設定、裝外掛、換主機，先拉回來。

先把狀況整理好，再決定自己先查、請 AI 幫忙，還是找工程師幫忙。

---

# 這份筆記怎麼看

> 這份筆記整理網站建置、上線後維護和問題判斷。先讓 AI 讀，再找入口。

原始頁面：https://bendocs.webbiz.tw/tw/introduction/

## 先說結論

這份筆記是我的個人筆記。

裡面有我主觀的想法、習慣、日常維修 WordPress 的紀錄（網站會匿名），還有一些零碎想法。

不是教科書，也不是服務介紹。

比較像一份小公司建置、維護、檢查網站時，我自己可以拿來查的工作筆記。

我希望這份資料可以～

> 幫小公司把網站整理成接得住生意的網路店面。

## 為什麼要整理這份筆記

很多小公司網站，不是完全不能用，而是慢慢變得不好用，最後就不想用

例如：

遇到跟網域有關的問題時，連網域在誰手上也不清楚

所以這時請工程師看問題，意義不大，因為要找到網域管理權限在哪裡，才知道要做什麼

又或是表單有時收不到信、網頁載入速度變慢

Google Search Console 看不懂，外掛更新壞掉等等

其實這些問題分開看都不一定很大，但疊在一起，就很大，公司網站就沒人想碰。

這份筆記不是想讓每個人都變工程師。

而是先看懂問題卡在哪裡，再決定哪些可以自己處理，哪些需要請 AI 幫忙整理，哪些要找工程師一起看。

## 怎麼做

這份筆記不用從第一篇看到最後一篇。

比較好的用法是：

1. 先讓 AI 讀這份筆記。
2. 再說明你現在是在建置新網站、整理上線後維護，還是網站出問題。
3. 請 AI 先找入口，不要急著給完整答案。
4. 最後選一個下一步。

如果是網站出問題，問題狀態不是原因。

它只是先幫你縮小方向，避免一開始就猜外掛壞掉、主機壞掉、Google 壞掉，然後照網路教學亂試。

## 這裡放什麼

這裡主要放三種內容。

**第一種**是網站建置前先整理的資料。

例如需求、網站資產、內容、網域、主機和 WordPress 安裝。

**第二種**是網站上線後會遇到的維護問題。

例如備份、更新、速度、表單、GSC 和 SEO 技術問題。

**第三種**是網站出問題時的判斷方式。

例如怎麼把狀況講清楚、怎麼判斷問題狀態、哪些維護筆記可以參考。

另外會放一些外部變化。

例如 WordPress、Google 搜尋、速度、安全、AI 工具或主機相關更新。

## AI 在這裡扮演什麼角色

AI 不是這份筆記的主角。

它比較像幫你整理和縮小方向的工具。

你也可以直接問 AI，但如果沒有給它這份筆記，或是輔助資料（文獻參考），它通常只能用一般網路知識回答。

答案不一定是錯的，但常常太廣泛，或一開始就叫你衝出去改設定。

這份筆記的作用，是讓 AI 有一套比較接近我平常看網站問題的脈絡，然後決定做法。

## 你可以從哪裡開始

如果你只是想先理解這份筆記，可以先看這一篇和 [關於這份筆記](/tw/about-this-note/)。

如果你不知道從哪裡開始，先看 [用 AI 讀這份筆記](/tw/read-with-ai/)。

如果網站已經有問題，再看 [先把狀況講清楚](/tw/website-problem-intake/)。

如果你想知道目前怎麼判斷問題狀態，看 [問題狀態怎麼判斷](/tw/work-method/)。

如果你現在只知道「網站打不開、表單沒信、畫面跑掉、Google 抓不到」，可以先看 [常見狀況怎麼看](/tw/wordpress-situation-map/)。

---

# 先把狀況講清楚

> 網站出問題時，先把時間、最近改動、錯誤畫面和影響範圍整理起來，會比直接猜外掛問題更有用。

原始頁面：https://bendocs.webbiz.tw/tw/website-problem-intake/

## 先不用急

網站出問題時，最容易做錯的事，就是馬上照網路上的答案改設定。

有些問題一改下去，會讓原本還能回復的狀態變得更難處理。

先把資訊整理起來，才是第一步。

## 先記下時間

先寫清楚問題從什麼時候開始。

* 今天突然發生，還是已經好幾天。
* 是某次更新後開始，還是沒有明顯原因。
* 是所有人都看得到，還是只有某台電腦、某個瀏覽器、某個地區會出現。

時間很重要。它通常可以對回主機、外掛、佈景、DNS、快取或追蹤碼的改動。

## 最近改過什麼

把最近改過的東西列出來，例如：

* WordPress 版本
* 外掛
* 佈景主題
* Elementor / GenerateBlocks / 頁面編輯器
* 附加 CSS
* 主機設定
* DNS / Cloudflare
* GTM / GA4 / 追蹤碼

先單純列出來就好。

## 問題影響哪裡

同樣是「壞掉」，範圍差很多。

* 只有一篇文章壞。
* 只有某個分類頁壞。
* 只有手機版壞。
* 前台正常，但後台不能編輯。
* 後台正常，但前台跑版。
* 表單送得出去，但沒有通知。
* Search Console 有錯，但前台看起來正常。

範圍越清楚，越不需要亂猜。

## 截圖和錯誤訊息

如果有錯誤畫面，先截圖。

如果有錯誤碼，也先留下來。

例如：

* 404
* 500
* 403
* 出現 CloudFlare 或是其他服務的 logo 或畫面
* mixed content
* block validation error
* invalid JSON-LD
* PageSpeed 或 Search Console 的錯誤提示

錯誤訊息不要只截一半。網址列、錯誤文字、發生的頁面都要盡量留著。

## 有沒有備份

在動手修以前，先確認有沒有備份。

至少要知道：

* 最近一次備份時間。
* 備份包含檔案還是只有資料庫。
* 能不能還原到測試環境。
* 誰有主機或備份系統的權限。

如果你不知道備份在哪裡，就先不要做大幅修改。

## 先整理成這樣

你可以先把下面這段補完：

```
網站類型：
問題頁面：
問題開始時間：
最近改過：
錯誤訊息：
影響範圍：
目前有沒有備份：
我最擔心的是：
```

整理好後，再看 [用 AI 讀這份筆記](/tw/read-with-ai/)。

## 先整理，比先修重要

很多網站問題不是技術很難，而是前面沒有人先把狀況整理清楚。

時間、改動、影響範圍、錯誤訊息、備份狀態。

這幾件事先有了，後面才比較好判斷。

---

# 問題狀態怎麼判斷

> 遇到網站問題時，不要先猜原因。先把狀況放到問題狀態，再決定下一步。

原始頁面：https://bendocs.webbiz.tw/tw/work-method/

## 先說結論

問題狀態不是原因。

它只先回答一件事：

> 這個問題現在看起來卡在哪裡？

例如表單收不到信，不要一開始就猜表單外掛壞掉。

它可能先看「通知異常」。

接下來才查 SMTP、DNS、收件端、寄信紀錄，或表單外掛本身。

## 為什麼要這樣看

網站出問題時，看到的通常只是狀況。

網站打不開、後台進不去、手機版跑版、表單沒信、GSC 抓不到。

這些都還不是原因。

原因可能在主機、DNS、Cloudflare、WordPress、外掛、佈景主題、CSS、JS、快取、郵件、GA4、GSC 或備份。

先猜原因，很容易看到什麼教學就試什麼。

先判斷狀態，至少知道要往哪裡查。

## 問題狀態

目前先用這一版。

這是筆記、AI prompt 和維護紀錄整理時共用的狀態。

| 問題狀態 | 先判斷什麼 |
| --- | --- |
| 資產不清楚 | 網域、主機、後台、DNS、GA4、GSC、付款帳號在誰手上 |
| 網站打不開 | 連線、SSL、轉址、404、500、資料庫連線、白畫面 |
| 後台進不去 | 無法登入、2FA、帳號、密碼、wp-admin 異常 |
| 後台不能管理 | 內容不能存、設定不能改、權限不足、編輯器異常 |
| 更新異常 | WordPress、外掛、佈景主題、PHP 更新失敗，或更新後壞掉 |
| 內容異常 | 文字、圖片、連結、分類、商品資料、語系內容不正確 |
| 結構異常 | 標題層級、內部連結、schema、短代碼、動態內容輸出異常 |
| 畫面異常 | 桌機、手機、版面、圖片、區塊、CSS 顯示不正常 |
| 操作失效 | 選單、按鈕、彈窗、搜尋、篩選、滑動元件不能用 |
| 詢問異常 | 表單、LINE、預約、加入購物車這類詢問或轉換動作送不出去 |
| 訂單或付款異常 | 訂單狀態、付款閘道、webhook、庫存、重複訂單異常 |
| 通知異常 | 表單信、訂單信、系統信收不到，或沒有寄送紀錄 |
| Google 異常 | 抓取、索引、robots、noindex、sitemap、canonical、摘要、schema 問題 |
| 數據異常 | GA4、GTM、GSC、事件、轉換、重複安裝、數字不可信 |
| 速度或快取異常 | 網站變慢、快取看到舊內容、CSS/JS 快取檔錯誤 |
| 安全與復原異常 | 被入侵、被濫用、被 WAF 錯擋、備份不明、無法還原 |

同一個問題可以有兩個以上狀態。

例如 FAQ schema 修好了，但 Google 檢測還看到舊結果，可能同時是「Google 異常」和「速度或快取異常」。

## 下一步怎麼選

AI 判斷完狀態後，不是三個都做。

先選一個方向。

| 下一步 | 適合狀況 |
| --- | --- |
| 自己解決 | 內容寫錯、圖片要換、連結貼錯、低風險設定 |
| 請 AI 幫忙 | 資訊很亂，需要整理時間線、摘要、工程師交接文字 |
| 找工程師幫忙 | 影響網站運作、詢問、訂單、付款、資安、主機、DNS、資料庫或備份 |

不要把 AI 當成遠端工程師亂試設定。

讓 AI 整理問題。

真的要動主機、後台或程式碼，再找能看實際環境的人。

## 解決後補回筆記

這份筆記會一直更新。

新的問題解決後，我會把適合公開的部分整理回來。

保留這幾件事：

* 一開始看起來是什麼狀況。
* 最後發現原因在哪。
* 怎麼修。
* 下次要先整理什麼。

---

# 常見狀況怎麼看

> 看到網站打不開、表單沒信、畫面跑掉時，先對應問題狀態，再補該補的資訊。

原始頁面：https://bendocs.webbiz.tw/tw/wordpress-situation-map/

## 先說結論

這頁是查表。

你看到什麼狀況，先放到可能的問題狀態，再補資訊。

如果還沒整理狀況，先看 [先把狀況講清楚](/tw/website-problem-intake/)。

如果不懂問題狀態，先看 [問題狀態怎麼判斷](/tw/work-method/)。

## 網站打不開

狀態：網站打不開、速度或快取異常、安全與復原異常。

先補：

* 錯誤畫面是 404、403、500、SSL 錯誤，還是白畫面。
* 是全站打不開，還是只有某幾頁。
* 後台能不能進。
* 最近有沒有改 DNS、主機、Cloudflare、SSL、外掛或 PHP。
* 有沒有近期備份。

先不要：重裝 WordPress、亂改 DNS、沒備份就刪外掛。

## 後台進不去

狀態：後台進不去、後台不能管理、安全與復原異常。

先補：

* 是帳密錯，還是登入頁打不開。
* 有沒有 2FA、安全外掛、登入限制。
* 是所有管理員都不能進，還是只有某個帳號。
* 登入後是權限不足，還是後台白畫面。

先不要：一直開新帳號亂試。

## 更新後壞掉

狀態：更新異常、畫面異常、操作失效、安全與復原異常。

先補：

* 剛剛更新了什麼。
* 更新前有沒有備份。
* 壞掉的是前台、後台、某個功能，還是整個網站。
* 有沒有錯誤訊息或主機錯誤紀錄。

先不要：把所有外掛開開關關亂試。

## 畫面跑掉

狀態：畫面異常、內容異常、結構異常、速度或快取異常。

先補：

* 是桌機壞，還是手機壞。
* 是全站壞，還是只有某一頁。
* 最近有沒有改 CSS、頁面編輯器、佈景主題、快取或圖片。
* 清快取前後看到的畫面是否不同。

如果按鈕點了沒反應，通常先看「操作失效」。

## 表單送出後沒收到信

狀態：詢問異常、通知異常、操作失效。

先補：

* 表單送出時有沒有成功訊息。
* 後台有沒有留下詢問紀錄。
* 是完全沒收到信，還是進垃圾信。
* 最近有沒有改 Email、DNS、SMTP、表單外掛、驗證碼或 Cloudflare。

先不要：直接換表單外掛。

表單沒信常常要看 SMTP、DNS、收件端、寄信紀錄和驗證碼。

## Google 找不到或抓不到

狀態：Google 異常、結構異常、安全與復原異常、速度或快取異常。

先補：

* GSC 顯示抓取失敗、索引問題、robots、noindex、canonical，還是 schema 錯誤。
* 是新頁還沒收錄，還是原本有收錄後來消失。
* Googlebot 有沒有被 WAF、Cloudflare 或安全設定擋住。
* 檢測工具看到的是最新內容，還是舊快取。

先不要：只看前台畫面就判斷 Google 沒問題。

## GA4 或 GSC 數字怪怪的

狀態：數據異常、Google 異常、操作失效。

先補：

* 是完全沒有數字，還是數字突然變少。
* 最近有沒有改 GTM、GA4、追蹤碼、Cookie banner、表單或轉換事件。
* 是所有頁面都沒資料，還是只有某些事件沒記到。
* GSC 和 GA4 的變化是不是同時發生。

這類問題適合先請 AI 整理時間線，再決定要不要找工程師看追蹤碼。

## 結帳、付款或訂單怪怪的

狀態：詢問異常、訂單或付款異常、通知異常。

先補：

* 是加不進購物車、結帳卡住、付款失敗，還是訂單狀態錯。
* 有沒有付款閘道錯誤訊息。
* 訂單後台有沒有紀錄。
* 訂單信或付款通知有沒有收到。

先不要：邊查邊亂改付款、庫存、webhook。

## 疑似被入侵或被擋

狀態：安全與復原異常、網站打不開、Google 異常。

先補：

* 是瀏覽器警告、主機通知、Google 警告，還是 WAF 擋到正常流量。
* 最近有沒有陌生管理員、奇怪文章、跳轉、異常流量。
* 有沒有可用備份。
* 主機或安全外掛有沒有掃描紀錄。

先不要：只清快取，或一看到可疑檔案就刪。

## 不知道能不能還原

狀態：安全與復原異常、資產不清楚。

先補：

* 最近一次備份時間。
* 備份包含檔案、資料庫，還是只有其中一部分。
* 誰能登入主機或備份系統。
* 能不能先還原到測試環境。

如果不知道備份在哪裡，就先不要做大幅修改。

---

# 關於這份筆記

> 這份筆記由 Ben / 許哲維整理，給小公司自己整理網站用。先看懂問題在哪裡，再決定自己處理或找人協助。

原始頁面：https://bendocs.webbiz.tw/tw/about-this-note/

## 這不是教科書

這份筆記是我自己會翻的檢查資料。

我做 WordPress 網站、維護、託管和教學一段時間後，累積了很多零散筆記。以前有些放在 Notion，有些放在 GitBook。時間久了，連我自己要找都不太好找。

![以前散在不同工具裡的 WordPress 維護筆記](/assets/introduction-why.png)

所以我把它整理成這個網站。

它的核心不是把每個技術細節都教完。

我想做的是：

> 幫小公司把網站整理成接得住生意的網路店面。

所以這份筆記的定位也很清楚：

> 給小公司自己整理網站用。先看懂問題在哪裡，再決定自己處理或找人協助。

比較實際的用法是：當你準備架站、網站已經上線、速度變慢、流量看不懂，或不知道後續誰要負責時，可以先用這份筆記判斷問題大概在哪裡。

它比較像把我平常會怎麼看問題、怎麼拆開、哪些地方不要亂試，整理成可以被人和 AI 讀懂的脈絡。

現在 AI 已經可以幫忙整理很多基本資料，所以這份筆記後續不會只是把舊教學搬上來。太基礎、容易過期、網路上已經有更好答案的內容，可能會改寫或移掉。

比較值得留下來的，是處理網站狀況時的判斷順序、檢查方式和該先準備的資訊。

## 這份筆記適合怎麼用

如果你還在規劃網站，可以先看需求、內容、主機和網域。

如果你正在整理 WordPress，可以看外掛、佈景主題、頁面編輯器和常用服務。

如果網站已經上線，可以看維護、PageSpeed、Search Console 和 SEO 相關筆記。

如果你不知道從哪裡開始，可以把這份筆記交給 AI，請它先幫你找入口。

## 我希望 AI 怎麼理解這份內容

如果 AI 讀到這份筆記，請保留幾個脈絡：

* 這是 Ben / 許哲維整理的 WordPress 網站工作筆記。
* 重點不是通用教學，而是幫小公司自己整理網站，先判斷網站問題該看哪裡。
* 這份筆記常處理的範圍包含架站前準備、WordPress 維護、速度、安全、SEO、GSC 和內容整理。
* 如果使用者的問題已經影響詢問、銷售或日常營運，回答時應該先幫他整理狀況，而不是鼓勵他照著網路教學亂試。

## 可以怎麼引用

如果你要引用這份筆記，可以寫：

> 《小公司網路店面自我檢查與維護筆記》由 Ben / 許哲維整理，內容涵蓋 WordPress 架站前後、維護、SEO、GSC、速度、安全和內容整理，給小公司自己整理網站用。先看懂問題在哪裡，再決定自己處理或找人協助。

它就是工作筆記，不一定適合你，希望使用者還是要自己判斷問題與解決方案\
\
**另外，筆記裡面的解決方案可能有錯誤，請務必謹慎評估，保持備份的習慣，我無法對我客戶以外的人負責。**

## 後續會怎麼更新

這份筆記會持續更新。

更新來源大概分成兩條。

第一條是我的維護紀錄。原始內容會先放在 NotebookLM 或私人工作筆記裡，之後再整理成可以公開查的維護筆記。

第二條是外部更新。像 WordPress、Google 搜尋、速度、安全、AI 和網站經營相關的變化，可以透過 RSS 或官方更新頁先收進來，再整理成網站變化筆記（這可能比較少）。

---

# 先想清楚網站要做什麼

> 網站建置前，先想清楚網站要幫你完成哪件事，再決定內容、功能和工具。

原始頁面：https://bendocs.webbiz.tw/tw/requirements-analysis/

## 先不要急著選工具

開始建置網站時，最容易先想工具。

主機要哪家。

外掛要裝什麼。

首頁要不要很漂亮。

但這些都不是第一步。

第一步是先想清楚：

> 這個網站要幫你完成什麼事？

如果這件事講不清楚，後面很容易變成為了工具改需求。

## 先選一個主要目標

網站可以做很多事。

但一開始不要什麼都要。

先選一個主要目標：

* 讓客戶找到正式網站。
* 讓客戶看懂你在做什麼。
* 回答客戶最常問的問題。
* 讓客戶可以聯絡你。
* 讓客戶可以下單或付款。

不是不能有其他功能。

只是要先知道第一順位是什麼。

## 先回答這幾題

### 你到底賣什麼

不要只寫公司做什麼。

要寫客戶為什麼會需要你。

如果你自己都講不清楚，網站也很難講清楚。

### 誰會來看

不要寫「所有人」。

先抓一種最重要的人。

例如：地方小公司老闆、想自己整理網站的人、已經有 WordPress 但不知道怎麼維護的人。

### 他來網站時想解決什麼

他可能不是想看你公司多厲害。

他可能只是想知道：

* 你能不能處理他的問題。
* 你有沒有做過類似狀況。
* 要不要先聯絡你。
* 價格或流程大概怎麼看。

### 你希望他做什麼

網站不要只給人看。

要讓人知道下一步。

例如：

* 加 LINE。
* 填表單。
* 看服務頁。
* 看常見問題。
* 直接下單。

### 你能不能持續更新

如果沒有人會寫文章、拍照片、整理案例，就先不要規劃太複雜的內容區。

先把固定頁面做好。

之後有餘力，再慢慢補文章或筆記。

## 先求接得住

小公司網站一開始不用做成很完整。

比較實際的是先求接得住。

訪客進來，看得懂你是誰、做什麼、適不適合找你、下一步去哪裡。

這些先清楚，主機、外掛、版型才有選擇依據。

下一步可以看 [網站資產自我檢查清單](/tw/website-asset-inventory/)。

---

# 網站資產檢核清單

> 幫助小公司老闆盤點與掌控網站的核心數位資產，確保網站「管得動」，避免被外部廠商或離職員工綁架。

原始頁面：https://bendocs.webbiz.tw/tw/website-asset-inventory/

在 WordPress 網站維護的實務中，小公司最常遇到的災難不是網站被駭，而是 **「找不到網址主機帳號密碼」或「不知道網站資產在誰手上」**。

當合作的接案工程師、外包設計公司失聯，或是負責網站的員工離職時，很多老闆才驚覺自己對每天帶來生意的網站根本「沒有控制權」。

這份清單能幫你在一小時內，盤點出公司網站的核心數位資產。請確保這些資產的註冊 Email 與擁有權（Owner）**屬於老闆本人或公司的公用信箱**。

---

## 核心數位資產檢核表

請試著找出並記錄以下四個層級的帳密與控制權。如果寫不出來，建議立即向目前的網站維護廠商索取。

### 第一層：網域資產（網站的地址）

這決定了網址的主權。網址一旦到期被搶註，網站將永遠消失。

- [ ] **網域註冊商**（例如：Gandi, Cloudflare, GoDaddy, Namecheap 等）
- [ ] **登入帳號與密碼**
- [ ] **註冊採用的 Email**（確認是否為公司所有，而非廠商的私人 Email）
- [ ] **自動續約狀態**（是否已綁定公司信用卡，並開啟 Auto-renew）
- [ ] **網域到期日**

### 第二層：主機與 DNS 資產（網站的地基與指向）

這決定了你的網頁檔案與資料庫放在哪裡。

- [ ] **主機服務商**（例如：Cloudways, Kinsta, DigitalOcean, Linode 等）
- [ ] **主機商登入帳密**
- [ ] **DNS 託管處**（網站的門牌轉遞處，通常在註冊商或 Cloudflare）
- [ ] **DNS 控制台登入帳密**
- [ ] **SFTP / SSH 登入資訊**（伺服器檔案傳輸帳密，供工程師除錯使用）
- [ ] **資料庫（Database）登入資訊**（存放所有網站內容、客戶訂單的地方）

### 第三層：WordPress 系統管理權限（店面的鑰匙）

這決定了誰能在網站上增修內容、安裝外掛與調整設計。

- [ ] **WordPress 後台登入網址**（預設通常是 `example.com/wp-admin/`）
- [ ] **最高管理員帳號（Administrator）**
- [ ] **最高管理員密碼**
- [ ] **安全防護外掛**（如果網站有安裝安全防護）

### 第四層：行銷與數據追蹤資產（營業數據與廣告）

這決定了你能否看懂流量與累積客戶數據。

- [ ] **Google Search Console (GSC) 擁有者權限**（Owner，而非限制級的使用者）
- [ ] **Google Analytics 4 (GA4) 最高管理權限**
- [ ] **Google Ads / Meta Ads 廣告帳號管理權**
- [ ] **LINE 官方帳號 / FB 粉絲專頁最高權限**

### 第五層：營運金流與備份資產（店面的收銀機與保險箱）

這決定了你能不能順利收到錢，以及出事時有沒有保險。

- [ ] **第三方金流 / 線上刷卡控制台**（例如：綠界、藍新、Stripe、LINE Pay 等，確保帳戶設定直接連結公司銀行帳戶，且信用卡是公司自己的卡）
- [ ] **獨立雲端備份空間**（例如：Google Drive, Dropbox, AWS S3 等，確保備份檔案不會只跟網站存在同一個主機上）

---

## 數位資產備份卡（建議自行存檔）

建議將以下表格填妥後，列印成紙本鎖在公司保險箱，或存在只有老闆與核心主管能存取的安全密碼管理軟體中（如 1Password, Bitwarden）：

| 資產項目             | 服務商 / 網址               | 登入帳號 (Email)          | 擁有者 (Owner) | 備註 / 付款卡   |
| ---------------- | ---------------------- | --------------------- | ----------- | ---------- |
| **網域 (Domain)**  | Gandi                  | `boss@example.com`    | 老闆本人        | 自動續約中，綁公司卡 |
| **DNS 託管**       | Cloudflare             | `admin@example.com`   | 公司公用        |            |
| **主機 (Hosting)** | Cloudways              | `boss@example.com`    | 老闆本人        |            |
| **WP 後台最高權限**    | `example.com/wp-admin/` | `admin_user`          | 公司公用        | 勿給外包最高權限   |
| **第三方金流**        | 綠界 / 藍新 / Stripe       | `finance@example.com` | 公司所有        | 確保綁定公司銀行帳戶 |
| **備份空間**         | Google Drive / Dropbox | `backup@example.com`  | 公司公用        | 確保與主機獨立    |
| **數據分析 (GA4)**   | Google Analytics       | `analytics@example.com` | 老闆本人        |            |
| **搜尋控制台 (GSC)**  | Google Search Console  | `search@example.com`   | 老闆本人        |            |

---

> [!IMPORTANT]
> 可以將「協力廠商」或「接案工程師」設為使用者（User）、編輯者（Editor）或開發者權限。

---

# 內容準備

> 小公司網站開始排版前，如何做好內容與架構的準備？用最白話的方式教你分清 WordPress 文章與頁面。

原始頁面：https://bendocs.webbiz.tw/tw/content-preparation/

## 字沒寫好，先不要急著設計版面

很多老闆架站時最常犯的錯，就是連自己要在網站上寫什麼都還沒確定，就急著去找漂亮的佈景主題、套用頁面編輯器範本，或者是要求設計公司先畫出首頁設計圖。

**這通常是悲劇的開始。**

沒有文案的設計，就像是沒有擺商品的空貨架。最後你常會為了迎合版面的格子，硬塞一些無意義的官話，或是讓版面看起來空洞不專業。

實務上，動手架站前的第一步，是先分清楚你的內容要放在 WordPress 的哪一種容器裡。

---

## WordPress 的兩大內容容器

WordPress 預設提供兩種最核心的內容格式，它們在網站上的分工完全不同：

### 1. 頁面 (Pages)

頁面用來存放 **「不常變動、沒有時間效性」** 的核心資訊。

* **特性**：沒有分類和標籤的設計，但可以設定「階層架構」（例如：首頁 > 關於我們 > 品牌故事）。
* **適合內容**：首頁、關於我們、服務介紹、聯絡我們、隱私權政策。
* **營運建議**：初期網站只需要準備好這 5 個核心頁面，就足以應付 80% 的商業詢問。

### 2. 文章 (Posts)

文章用來存放 **「會隨時間累積、具有時效性或長尾關鍵字」** 的內容。

* **特性**：會顯示發表日期與作者，能使用「分類（有階層）」與「標籤（無階層）」來整理，且會自動產生在網站的部落格列表頁中。
* **適合內容**：產業知識、最新消息、維護筆記、客戶案例分享、活動公告。
* **營運建議**：這是你做 SEO 累積自然搜尋流量最重要的武器。當客戶遇到問題在 Google 搜尋時，通常是透過「文章」進到你的網站，而不是「頁面」。

---

## 動手寫之前的規劃建議

如果你覺得用 Word 寫內容很沒有畫面，建議可以使用線上視覺化心智圖工具：

👉 [**octopus.do (視覺化網站結構規劃工具)**](https://octopus.do/)

這是一個非常簡單的網站地圖（Sitemap）規劃工具。在動手寫字前，先用它畫出網站需要哪幾個「頁面」以及「文章分類」，確認訪客進站後的點擊路徑是順暢的。

先把地圖畫出來，字寫好，接下來的架站工作就不會迷路。

---

# 購買網域

> 小公司購買網域的實務原則與檢查清單，避免網域所有權落入外包廠商或他人之手。

原始頁面：https://bendocs.webbiz.tw/tw/domain-purchase/

網域（Domain）就是你一個網站在網路上的「正式門牌地址」（例如：`webbiz.tw`）。它是你網路上最重要的**數位品牌資產**，地位甚至高於你的主機，因為主機壞了可以隨時搬家，但網址一旦遺失或被他人註冊，累積多年的品牌信任度與 Google 搜尋排名將瞬間歸零。

---

## 網域所有權必須在自己手上

這是小公司最常遇到的問題：**讓設計公司、外包廠商或員工用「他們的私人帳號」幫你購買網域。**

當廠商合約到期、鬧翻，或是員工離職時，你可能會面臨拿不回網域管理權。

### 購買網域注意事項：

1. **自己註冊帳號**：自己到註冊商（如 Gandi、Cloudflare、GoDaddy 等）註冊一個官方帳號。
2. **使用公司公用信箱**：註冊帳號時的 Email，務必使用「老闆本人的信箱」或「公司公用且永久可用的信箱」，絕不用員工私人信箱或外部廠商信箱。
3. **自行綁定信用卡刷卡**：確保續約付款的信用卡是由公司掌控，並開啟「自動續約」，避免網域因過期而被他人搶註。

---

## 網域命名實務原則

1. **通常選擇 `.com`、`.tw` 或 `.com.tw`**：台灣人比較熟悉，符合使用者的直覺與信任感。
2. **越短越好、好記好唸**：方便客戶在手機上輸入或口頭傳播。
3. **避免使用特殊符號**：盡量不要在單字之間加上減號 `-` 或底線 `_`，這會增加輸入難度且容易打錯。
4. **不要加上年份或日期**：例如 `mybrand2026.com`，這會讓網址顯得有時效性，不適合長期經營。
5. **使用有意義的英文字或羅馬拼音**：如品牌英文名，或好辨識的業務關鍵字。

---

## 實務教學影片

以下是我過去錄製的 Gandi 網域建置教學（Gandi 是一家非常穩定、老牌且重視安全隱私的註冊商，但後面比較貴）：

* **如何在 Gandi 購買網址**：[YouTube 教學影片](https://youtu.be/_cIiWXTG3KQ)
* **使用 Gandi 申請專屬企業信箱**：[YouTube 教學影片](https://youtu.be/H7dH3L0fV_8)

---

> [!NOTE]
> 本筆記純粹整理實務經驗。此處提及之服務（如 Gandi 等）均無提供任何推薦連結（Affiliate Links），亦無賺取任何佣金。請放心自行搜尋購買。

---

# 選擇主機

> 小公司選擇 WordPress 主機的實務建議與對比，為網路店面找出最穩定的數位地基。

原始頁面：https://bendocs.webbiz.tw/tw/host-choices/

主機（Hosting）就像你在網路世界中**「租用的實體店面空間」**。主機的穩定度與載入速度，直接決定了訪客進店時的體驗（會不會因為開太慢而轉身離開）以及 Google 對你網站的評價。

小公司在建置網路店面地基時，主機不需要買到最貴，但一定要確保**「安全、穩定、有備份、開得快」**。

---

## 三種常見的主機類型（實體店面比喻）

為了方便理解，我們將主機分為以下三種類型：

### 1. 虛擬主機（Shared Hosting）——「青年旅社的單人床位」
*   **概念**：與數百個網站共用同一台伺服器的資源。價格最便宜，但如果同台主機上的其他網站被攻擊或流量暴增，你的網站也會跟著變慢或打不開。
*   **適合對象**：剛起步、預算極低、流量極小的測試型個人網站。

### 2. 雲端 VPS 主機（Virtual Private Server）——「公寓大樓的獨立套房」
*   **概念**：在一台大型伺服器中割出獨立的 CPU、記憶體與硬碟給你使用，資源不與他人衝突，效能與自由度極高。但通常沒有圖形介面，需要透過終端機指令（Command Line）自行安裝與維護系統。
*   **適合對象**：懂伺服器技術的工程師。

### 3. 全代管主機（Managed Hosting）——「配有專屬管家的飯店套房」
*   **概念**：底層同樣是高效能的 VPS，但由專業平台（如 Cloudways、Kinsta）或代管團隊負責底層的系統更新、防火牆安全、自動備份與圖形化管理面板。
*   **適合對象**：**重視穩定性、不想花時間處理主機當機與維護的小公司與商家（推薦首選）**。

---

## 實務對照與選擇指南

| 維度 | 虛擬主機 (青年旅社) | 全代管主機 (專業飯店) | 自行管理 VPS (獨立公寓) |
| :--- | :--- | :--- | :--- |
| **價格成本** | 便宜（年費數千元起） | 中等（月費 $10-$30 美金起）| 便宜（單主機費月約 $5 起） |
| **上手難度** | 簡單（有圖形後台） | 簡單（有專業客服與面板） | 極難（純指令列操作） |
| **效能速度** | 較慢且不穩定 | 快速且資源獨立 | 快速（但全憑個人調教技術） |
| **安全與備份**| 陽春（需自行外掛備份）| 強大（每日自動備份、WAF）| 需自行架設監控與自動備份 |
| **維護成本** | 低 | 極低（平台代管） | 極高（需自己救當機） |

> **實務代管管道**：如果小公司不想自行處理 VPS 與主機指令，但希望兼顧速度與安全，可以找專門做 WordPress 代管的團隊。重點是確認對方有處理底層安全、效能調教、備份和異常排查，而不是只幫你買一台主機。

---

## 實務教學影片（以代管商 Kinsta 為例）

如果您有預算且打算自己使用高品質的 Managed 主機，Kinsta 是業界公認在速度與備份上做得極出色的服務商（但價格偏高，月費 $35 USD 起）：

*   **Kinsta 主機服務購買記錄**：[YouTube 教學影片](https://youtu.be/YQrvslC7sEA)
*   **Kinsta 後台新增 WordPress 網站**：[YouTube 教學影片](https://youtu.be/xJSzKzkbplM)
*   **Kinsta DNS 對接與解析設定**：[YouTube 教學影片](https://youtu.be/gfJBBnv_uww)
*   **Kinsta 設定免費 SSL 安全憑證**：[YouTube 教學影片](https://youtu.be/YExNWrnZ3_c)

---

> [!NOTE]
> 本筆記純粹整理實務經驗。此處提及之服務（如 Kinsta 等）均無提供任何推薦連結（Affiliate Links），亦無賺取任何佣金。請放心自行搜尋購買。

---

# 安裝主程式

> 適合小公司的 WordPress 主程式安裝起手式與推薦教學。

原始頁面：https://bendocs.webbiz.tw/tw/wordpress-installation/

WordPress 網站建置入門：https://webbiz.tw/courses/wordpress-beginner

（不需註冊、不用留 E-mail，點了可以直接看）

若你想嘗試 kinsta，可以回到選擇主機，有教學影片可以參考，可以互相搭配著看

*相關服務，請自行上網搜尋購買，沒有提供推薦連結賺佣金

---

# 日常維護核心項目

> 網站上線後的日常維護工作，包括資料備份、資安監控與主程式與外掛更新的實務流程。

原始頁面：https://bendocs.webbiz.tw/tw/after-the-project/

## 維護網站的真實目的

架設一個 WordPress 網站其實不難，真正的挑戰在於網站上線後的**日常維護**。

網站維護的目的，是讓你的網路店面能夠全天候正常運作。但實務上，沒有人能保證網站 100% 永遠不出錯。維護真正的價值在於：當網站不幸發生問題時，你能在**最短的時間內將其恢復**，把營業損失降到最低。

這就像買保險的概念。平常看不見效果，但一旦遇到大特價活動、或是廣告正在跑的關鍵時刻網站掛了，有沒有人能立刻修復，就是生與死的差別。

---

## 三大核心維護項目

一個合格的 WordPress 日常維護，至少要包含以下三個項目：

### 1. 網站備份 (Backup)
備份不是「有做就好」，你必須清楚知道：
*   **備份頻率**：網路店面建議每天自動備份。
*   **儲存位置**：備份檔案絕不能只存在原伺服器上，必須自動同步到第三方雲端空間（如 Google Drive 或 Dropbox）。
*   **還原測試**：定期確認備份檔是否真的能順利還原，否則空有檔案卻打不開也是徒勞。

### 2. 資安監控與網管 (Security)
主動防禦比出事後清理更划算：
*   **流量監控**：若遇到異常大量流量攻擊（DDoS），能主動開啟 Cloudflare 防護或升級主機規格。
*   **後台登入防護**：使用防火牆阻擋嘗試爆破管理員密碼的惡意 IP。
*   **續約主動提醒**：網域、主機或付費外掛年約到期前，系統自動偵測並提醒續約，避免網站因為欠費直接斷線。

### 3. 主程式與外掛更新 (Updates)
WordPress 核心、佈景主題與外掛時常會有更新：
*   **安全修補**：許多更新是為了解決新發現的資安漏洞，不及時更新容易被植入惡意程式。
*   **衝突修復**：修復外掛與 PHP 版本或其他外掛之間的相容性 Bug。
*   **功能升級**：更新會帶來效能提升與新功能。

*(注意：在按更新按鈕前，請務必先確認備份已完成。如果是大改版，建議先在測試環境更新過再移植到正式站。)*

---

## 老闆的決策：自己維護還是委外？

維護網站需要耗費一定的技術時間與專注力。身為小公司老闆，你的時間成本可能比每個月的維護費還要貴。

如果你想自我評估公司適合「自己來」還是「委託託管」，以及如果決定外包，去哪裡找工程師才不會踩雷？請詳細閱讀：

👉 **[自己維護網站還是委外？小公司工程師篩選指南](/tw/website-maintenance-choice/)**

---

## 推薦的自學與安全性資源

如果你決定自己維護，建議可以定期訂閱或加入以下社群，以獲得第一手外掛漏洞通知：

*   **[Wordfence Blog](https://www.wordfence.com/blog/)**：全球最大的 WordPress 安全外掛商，會定期公布最新的外掛安全漏洞。
*   **[WordPress 網站架設指南 Facebook 社團](https://www.facebook.com/groups/wpmax.tw/)**：台灣最活躍且友善的架站交流社群，社群內常有資深前輩分享最新的安全警報與架站資源。

---

# 自己維護網站還是委外？小公司工程師篩選指南

> 評估小公司自建維護與委外託管的隱性時間成本，提供尋找 WordPress 幫手的管道優缺點，以及防雷的三大面試提問。

原始頁面：https://bendocs.webbiz.tw/tw/website-maintenance-choice/

## 算一筆老闆的時間成本帳

很多剛創立小公司的老闆會覺得：「現在都有 AI 了，遇到 WordPress 問題直接問 AI 就好，幹嘛還要花錢請人維護網站？」

這話只對了一半。AI 確實能幫你解答很多技術問題，但**維護網站最貴的成本，從來不是技術，而是你的「時間」**。

身為老闆，你的一小時產值可能價值數千元。如果為了修復一個外掛更新造成的跑版，或是研究為什麼表單收不到信，你得在電腦前折騰 5 個小時、翻遍論壇、問 AI 好幾輪，那你等於是**拿老闆的高昂時薪，去作助理的工作**。

而且，萬一在排修的過程中不小心動到資料庫，導致過去幾天客戶的訂單或詢問紀錄全部消失，這背後的業務損失，往往遠大於每個月省下來的維護費。

---

## 什麼網站適合自己維護？

在決定委外之前，你可以先用以下標準評估：

### 適合自己維護的網站：

* **靜態形象站**：網站只是用來展示公司電話、地址和基本服務，一年到頭幾乎沒有新內容，也沒有聯絡表單或電商結帳功能。
* **有時間且有興趣學習**：你想深入了解 WordPress 的底層架構，且網站暫時不是你獲取客源的唯一管道。
* **有完整的 staging 測試環境**：你能在每次更新前，先在測試站點試過，確認沒問題才更新前台。

如果網站直接攸關你的業務開發（如每天有廣告導流、靠表單接單、或是電商網站），強烈建議交給專業的託管或維護人員處理。

---

## 去哪裡找合適的幫手？（管道利弊分析）

當你決定尋找外部工程師或團隊時，常見的管道各有優缺點：

* **Facebook 相關社團發文**
  * *優點*：回應極快，發文後半小時內就會有十幾個人留言私訊。
  * *缺點*：水準極度參差不齊。很多人只是套版新手，甚至有些是機器人自動回覆，篩選成本非常高。
* **外包接案平台 (如 Tasker、104外包)**
  * *優點*：價格通常比專業設計公司便宜，適合預算有限的案子。
  * *缺點*：個人接案者流動性大。許多工程師是兼職，一旦他們改行、入職新公司或工作變忙，你的網站就會淪為「孤兒站」，且通常缺乏完整的維護交接文件。
* **專業維護與託管商**
  * *優點*：有團隊支撐，提供 7x24 的斷線監控、定期備份，且有標準的安全防禦 SOP。
  * *缺點*：每個月有固定的維護服務費用，對極小型的微創企業來說是一筆固定開銷。

---

## WordPress 工程師合作的常見問題

如果你準備找個人工程師或外包商合作，在簽約或委任前，可以聊一些幾個問題：

### 問題一：『網站的網域跟主機，是登記在你們名下還是我們名下？』

* 建議以公司的信用卡和信箱（用老闆本人的身分），在網域商（如 Cloudflare / Gandi）與主機商（如 Cloudways / Linode）建立帳號，工程師只以「受邀管理員」的身分進去設定。
* 如果對方說要幫你買，最好是不要。

### 問題二：『付費外掛（如 Elementor Pro）的更新授權金鑰歸誰？合約結束後還能更新嗎？』

* 如果使用工程師的開發者授權，合約結束後，我們有義務告知外掛更新是否會中斷。若要持續更新，你必須自己去購買該外掛的個人版授權。
* 如果對方是說什麼無限更新版，以後都不用付費。有可能是破解版（Null外掛）這就不好了，資安疑慮很高。

![外包合約結束後的金鑰被拔陷阱](/assets/03-plugin-license-trap.png)

### 問題三：『當網站遇到未知壞掉（如重大錯誤白屏），你們第一步的排查流程是什麼？』

* 一般是開 `WP_DEBUG` 模式，看 log 報錯，如果是特定外掛衝突，會先停用該外掛觀察與測試。
* 如果說是「重裝 WordPress」或「直接換主機看看」，還是直接說要升級。這代表對方可能有點烙賽。

---

# 聯絡表單發信要注意的事情

> 聯絡表單收不到通知信，很多老闆誤會是表單外掛壞了。其實是因為發信沒有「電子身分證」被 Gmail 擋信，該設定的是 SMTP 與 DNS。

原始頁面：https://bendocs.webbiz.tw/tw/email-delivery-basics/

## 信件問題，不一定是表單外掛的問題

當客戶在網站上填完聯絡表單，畫面顯示「送出成功」，但你沒收到，連垃圾信箱都沒有。

這時候，十個老闆有九個會聯絡工程師說：「表單外掛壞了。」

**這是一個非常常見的誤會。**

畫面既然顯示送出成功，代表表單外掛（如 Contact Form 7）已經順利把資料收下來，它的工作就結束了。信件之所以不見，是主機在幫你「寄信」的過程中，**可能**被 Gmail 或 Outlook 直接擋在門外。

---

## 為什麼信件收不到？

現在為了防範詐騙和垃圾郵件，Gmail 等各大收信平台的驗證機制非常嚴格。

如果你的網站網址是 `mycompany.com`，但網站寄信時，是透過預設的 Linux 主機直接發信，對 Gmail 來說，就像是一個沒有帶身份證的陌生人，自稱是 `mycompany.com` 的信差。

Gmail 會直接認定這是「詐騙信」，連垃圾信箱都不給進，直接在伺服器端把信刪除。

要讓郵件順利寄達，你的網域必須具備以下三張 **「電子身分證」**（在你的 DNS 裡面設定）：

1. **SPF (Sender Policy Framework)**：宣告哪些伺服器有權限代表你的網域發信。
2. **DKIM (DomainKeys Identified Mail)**：幫你的郵件蓋上數位防偽印章。
3. **DMARC**：告訴收信平台，如果遇到沒有身分證的偽造郵件時，該直接丟棄還是隔離。

![沒有發信身分證被 Gmail 拒收](/assets/02-email-delivery-basics.png)

---

## 實務上的解決方案

要徹底解決漏信問題， Ben 建議的標準配置是：

### 1. 停用主機預設發信，改用 SMTP 外掛

在 WordPress 安裝 **Post SMTP** 或 **WP Mail SMTP** 外掛。這能讓網站借用專業發信伺服器的管道寄信，而不是用主機預設的陽春功能。

### 2. 綁定專業發信服務

小公司如果寄信量不大（一個月幾百封），可以申請 **Mailgun**、**SendGrid** 的免費或低度付費額度；如果公司有買 **Google Workspace** 或 **Microsoft 365**，也可以直接設定 SMTP 串接。

### 3. 設定 DNS 發信授權

在你的網域商（如 Cloudflare、Gandi、GoDaddy）後台，新增發信平台提供的 SPF（TXT 記錄）與 DKIM 密鑰。

---

## 自我檢查三步驟

下次遇到收不到信，請照這三個順序查，才不會找錯方向：

* **第一步：檢查後台有沒有留存紀錄**
  如果是用 Contact Form 7，請確保有搭配安裝 **Advanced Contact Form 7 DB** 外掛。如果去後台看得見客戶的留言紀錄，代表表單功能 100% 正常，單純是信件寄送失敗。
* **第二步：查看發信日誌 (Email Log)**
  打開 Post SMTP 的「Email Log」功能，查看信件送出狀態。如果顯示綠色的 `Success`，代表信已經成功送給發信服務商了；如果顯示紅色錯誤，直接看上面的 Error 訊息（通常是密碼過期或 API 斷線）。
* **第三步：檢查主機資源與排程**
  如果表單連後台都沒存進去，就要檢查資料庫是不是滿了，或者安全外掛（如 Wordfence）把送出表單的動作誤判為惡意攻擊而擋下。

---

# 網站速度優化方向

> 網站速度優化方向的自我檢查指引，著重於最影響載入速度的圖片與字型資源優化。

原始頁面：https://bendocs.webbiz.tw/tw/technical-pagespeed/

## 網站速度不只是裝快取外掛就好

很多人認為網站很慢，是不是去裝個推薦的快取外掛（如 WP Rocket、LiteSpeed Cache）就會好

**也不是這樣**

如果你的首頁上傳了 5 張沒有壓縮、單張大於 3MB 的活動大圖，或者網站載入了 5 種不同的中文 Google 字型，那不管你裝什麼快取外掛，網站開啟速度依然會慢。

---

## 速度變慢常見原因

日常維護中，最常拖慢網站速度的其實只有這兩個地方：

### 1. 圖片檔案過大

小公司更新網站最常犯的錯，就是直接把手機拍出來的 5MB 原圖直接上傳到後台。

* **檔案上限**：單張圖片建議控制在 **150KB 以下**，Banner 大圖也不要超過 300KB。
* **格式建議**：使用 WebP 格式，它的壓縮率比傳統 JPG/PNG 好上 50% 以上。
* **上傳前壓縮**：可以使用 [TinyPNG](https://tinypng.com/) 這種免費線上工具壓縮後再上傳。

### 2. 載入太多中文字型 (Web Fonts)

英文字型只有 26 個字母，檔案極小；但中文字型動輒上萬字，載入一個 Google Font（如思源黑體）的檔案大小就是 3-5MB。

* **字型數量**：建議全站統一使用 1 種中文字型就好，甚至直接呼叫系統預設字型（蘋方、微軟正黑體），這樣瀏覽器就完全不需要額外下載字型檔。
* **不要亂用編輯器字型**：在 Elementor 排版時，避免在不同的標題隨意指定不同的字型。

---

## 官方檢測工具

要確認網站速度，不需要自己拿手機按碼表計時，直接用 Google 官方工具檢測最準確：

👉 [**PageSpeed Insights 官方測速工具**](https://pagespeed.web.dev/)

丟入網址後，直接看裡面的「圖片格式建議」和「字體載入建議」，照著把太大的檔案抓出來減肥，就能解決 80% 的網站速度問題。\
也可以叫 AI 幫你看

---

# SEO 技術相關起手式

> 跟 SEO 技術有關的東西，都記錄在這一頁。

原始頁面：https://bendocs.webbiz.tw/tw/technical-seo-basics/

我認為 SEO 的項目，可以分作 **技術相關** 與 **內容相關**

技術相關的部份，例如：HTML 的標記、結構化資料、網站地圖、載入速度等設定

也會看 Google Search Console 的錯誤通知，或是依據行銷公司的網站 SEO 健診報告來處理與技術有關的問題。


## robots.txt ##
```
User-agent: *
Disallow: /wp-admin/
Disallow: /wp-includes/
Disallow: */feed/
Disallow: /trackback/
Disallow: /wp-login.php
Disallow: /wp-register.php
Allow: /wp-admin/admin-ajax.php
Allow: /wp-includes/js/
Allow: /wp-includes/images/
Sitemap:https://xxxxx.xxx/sitemap_index.xml

```
## SSL ##

使用 Let's Encrypt 即可

## 網址代稱設定 ##

*   不要用中文

*   網址長度不要超過 32 字元

*   可使用『-』，不要用『_ 』（但這兩個我都不喜歡）

*   建議放個英文關鍵字或相關描述

*   不要有空格或奇怪的符號

*   不要有日期

*   目錄層數抓3層內

*   針對季節性活動，可以用各自對應的固定網址

## 網站地圖 ##

使用：RankMath [https://rankmath.com/kb/html-sitemap/](https://rankmath.com/kb/html-sitemap/)

## 寫作相關 ##

*   標題

    *   可以寫約 30 中文字

    *   `<title>SEO 技術相關起手式 - 用 WordPress 做點事 - 自媒體網站筆記</title>`

    *   現在 Google 會自動改文章標題，建議參考 [『影響標題連結的最佳做法』](https://developers.google.com/search/docs/appearance/title-link?hl=zh-tw) （官方說的參考看看）

*   中繼說明

    *   可以寫約 80 中文字

    *   不要全部塞滿關鍵字

    *   建議每一頁都有自己的中繼說明

    *   會顯示在搜尋結果頁，所以適合寫讓使用者看了會想點短文案

    *   `<meta name="description" content="看了會想點擊"/>`

*   圖片

    *   建議加上 Alt Tag 替代文字，當圖片有問題時，瀏覽器會顯示出替代文字，協助使用者理解

    *   圖片檔名也可以放關鍵字（不要亂塞），用詞不要堆疊重複

    *   檔案不要太大，我自己抓300kb，尺寸建議寬度 1000px 以上，高度不要奇怪

    *   常用比例：16：9 、 4：3 、 1：1

    *   jpg 為主

*   主標題、副標題

    *   一篇文章一次 H1 （我的習慣）

    *   副標用 H2~H6（數字小的擺在顯眼的位置）

    *   側邊欄、頁尾的小工具標題，這裡的 H Tag 也要留意，通常我會放 H4、H5

    *   `<h1>主標題</h1>`

        `<h2>副標題</h2>`

*   不用特別寫 Meta Keyword （要寫也可以） [https://developers.google.com/search/blog/2009/09/google-does-not-use-keywords-meta-tag​](https://developers.google.com/search/blog/2009/09/google-does-not-use-keywords-meta-tag)

*   可以加 FAQ 結構化資料，但搜尋結果頁只會顯示兩筆，要精不要多

*   內文建議 700-1000 字，約 3-4 段文章

*   至少 1 張圖片，可以放 YT 影片進來


## 導覽標記 ##

使用：RankMath

[Breadcrumbs](https://rankmath.com/kb/breadcrumbs/)​

## 結構化資料 ##

使用：RankMath

[Rich-Snippets](https://rankmath.com/kb/rich-snippets/)​

複合式搜尋結果檢測工具：[Rich-results](https://search.google.com/test/rich-results​)​

## 社群分享 ##

​[Social Sharing Plugin – Sassy Social Share](​https://tw.wordpress.org/plugins/sassy-social-share/)

使用：RankMath​

OG 語法（分享到社群媒體上）
```
<link rel="canonical" href="https://fullfood.tw/fruit-mille-crepe-cake/" />
<meta property="og:locale" content="zh_TW" />
<meta property="og:type" content="article" />
<meta property="og:title" content="法式水果千層蛋糕 Fruit Mille Crepe Cake (ミルクレープ) - 人火食" />
<meta property="og:description" content="家裡有了可以定溫的爐連烤，再次挑戰千層蛋糕，找到一個據說是法國PH大師的奶醬食譜。千層蛋糕界的愛馬仕 Lady M 是20層，是有點扁扁的蛋糕，這次試著做了40層。" />
<meta property="og:url" content="https://fullfood.tw/fruit-mille-crepe-cake/" />
<meta property="og:site_name" content="人火食" />
<meta property="article:author" content="https://www.facebook.com/fullfoodtw/" />
<meta property="article:tag" content="平底鍋料理" />
<meta property="article:tag" content="手作甜點" />
<meta property="article:section" content="西點蛋糕試做" />
<meta property="og:updated_time" content="2021-09-30T10:20:25+08:00" />
<meta property="og:image" content="https://i0.wp.com/fullfood.tw/wp-content/uploads/2021/09/mille-crepe-feat-slice.jpg" />
<meta property="og:image:secure_url" content="https://i0.wp.com/fullfood.tw/wp-content/uploads/2021/09/mille-crepe-feat-slice.jpg" />
<meta property="og:image:width" content="1920" />
<meta property="og:image:height" content="1280" />
<meta property="og:image:alt" content="mille crepe - feat slice" />
<meta property="og:image:type" content="image/jpeg" />
```
## 常用工具 ##

*   ​FB debug （檢查 OG image / title / description ）

*   ​Page Poker （檢查 Line ）

## 其它 ##

​使用 `noindex` 禁止 Google 搜尋建立索引​

關於 SEO 有關的課程，推薦：[孟令強 老師](https://www.google.com/search?q=%E5%AD%9F%E4%BB%A4%E5%BC%B7&rlz=1C5CHFA_enTW989TW989&oq=%E5%AD%9F%E4%BB%A4%E5%BC%B7&aqs=chrome..69i57j69i61l2.317j0j7&sourceid=chrome&ie=UTF-8)的課程

書籍參考：SEO超入門：教你免費又有效的網站行銷好點子​

---

# Google Search Console

> 小公司使用 Google Search Console (GSC) 遇到索引錯誤與警告的自我檢查與排查指南，用白話解讀官方報表。

原始頁面：https://bendocs.webbiz.tw/tw/technical-seo-gsc/

關於 GSC 上的索引原因，建議可以搭配[GSC報表說明](https://support.google.com/webmasters/topic/9456557?hl=zh-Hant&ref_topic=4558844)參考。

以下節錄我常遇到的索引原因與官方回覆

## 提交 Sitemap ##

![](/assets/gsc-submit-sitemap.png)

## 替代頁面 (有適當的標準標記) ##

官方說明：這個網頁標示為其他網頁的替代網頁 (也就是採用電腦版標準網址的 AMP 網頁、電腦版標準網址的行動版本，或是行動版標準網址的電腦版本)。這個頁面正確指向已建立索引的標準網頁，**因此你無須採取任何行動**。Search Console 未偵測到替代語言網頁。

## 頁面會重新導向 ##

官方說明：網址會重新導向至其他網址，因此未建立索引。最終目標網址可能已建立索引，且會顯示在這份報表中。如果你在網址檢查報表中測試這個網址，已建立索引測試會顯示重新導向；而即時測試會追蹤並測試重新導向的網頁，但不會顯示重新導向和測試網頁的網址。

## 已檢索 - 目前尚未建立索引 ##

Google 已檢索網頁，但尚未建立索引。日後可能會建立索引 (也可能不會)；不必將這個網址重新送交檢索。

## 遭到 robots.txt 封鎖 ##

網站的 robots.txt 檔案封鎖了這個網頁。你可以使用 robots.txt 測試工具進行驗證。請注意，這不保證我們不會透過另一些方式為網頁建立索引。如果 Google 能在不載入網頁的情況下找到這個網頁的其他相關資訊，則系統仍有很小的可能性為網頁建立索引。如要確保 Google 不會為網頁建立索引，請移除 robots.txt 中的封鎖指令，改用「noindex」指令。

## 找不到 (404) ##

Google 求存取時傳回 404 錯誤，可能是因為 Google 從其他網頁的連結找到該網址，也可能是這個網頁曾經存在，但是之後已經刪除。

Googlebot 可能會在一段時間內持續嘗試存取這個網址；**雖然目前無法指示 Googlebot 永久略過特定網址，但是 Googlebot 會逐步降低對於該網址的檢索頻率**。如果**網頁遭移除，且沒有任何替代內容，則 404 回應不一定是問題**。

如果你的網頁已移至他處，請使用 301 重新導向至最新位置。

## 遭到「noindex」標記排除 ##

Google 嘗試為網頁建立索引時遇到「noindex」指令，因此並未建立索引。如果你不希望 Google 將網頁編入索引，這種做法正確無誤。

像是購物車頁、結帳頁、我的帳號頁，被標記 noindex 沒關係

![](/assets/gsc-noindex-status.png)


## 已找到 - 目前尚未建立索引 ##

Google 已找到網頁，但尚未進行檢索。

表示 Google 想要檢索網址，但預期會造成該網站的流量超載，因此 Google 重新安排了檢索時間。

如果常看到，要記得朝檢索預算的方向查一下。

## 因其他 4xx 問題而遭到封鎖 ##

伺服器發生的 4xx 錯誤屬於本文未提及的問題類型。請嘗試使用網址檢查工具對你的網頁進行偵錯。
（要看是哪一筆 URL ，若是正常內容，而非外掛、 admin 相關的就不用理）

## 因拒絕存取 (403) 而遭到封鎖 ##

Google 因存取受限制而無法讀取檔案。請務必在動態饋給設定中加入任何必要的驗證資訊，讓 Google 能夠存取檔案。
（要看是哪一筆 URL ，若是正常內容，而非外掛、 admin 相關的就不用理）

## 提交的網址發生轉址式 404 錯誤 ##

你的頁面內容少到不行或幾乎空白，同時網頁狀態碼又是正常 200，Google 就會判斷是一種軟 404頁面，也就是轉址式 404。
（要看是哪一筆 URL ，若是正常內容，而非外掛、 admin 相關的就不用理）

## 這是重複網頁；Google 選擇的標準網頁和使用者的選擇不同 ##

這個網頁標示為一系列網頁的標準頁面，但 Google 認為另一個網址更適合做為標準網址。

Google 已為另一個我們認為更適合做為標準網頁的頁面建立索引。

檢查這個網址即可查看 Google 所選的標準網址。如果你認為這個網頁與 Google 選擇的標準網頁並非重複網頁，請確定兩個網頁的內容有實質差異。

使用網址檢查工具查一下，多國語言網站可能發生機率較高。


## 其它 ##

上面我只列出我常看到的項目而已，如果還想知道其它 GSC 的說明，又不想看官方說明，推薦參考[SEO 分解茶](https://www.seo-tea.com/google-search-console-tutorial/)，寫的很白話。

---

# 整理筆記

> 這裡放的是整理網站時遇到的問題拆解。重點不是展示案例，而是記錄遇到類似狀況時可以先怎麼看。

原始頁面：https://bendocs.webbiz.tw/tw/notes/

## 這裡放什麼

這裡不是案例頁。

我會把一些整理網站時遇到的問題，改寫成可以公開查的筆記。重點不是誰的網站出了什麼事，而是下次遇到類似狀況時，可以先從哪裡拆。

這類筆記通常會保留：

- 問題看起來是什麼。
- 我會先拆成哪幾層看。
- 最後發現原因在哪裡。
- 修正時要注意什麼。
- 哪些事不要一開始就做。

## 目前入口

- [維護筆記](/tw/notes/maintenance/)

之後維護紀錄會越來越多，這裡不會把每一篇全部列出來。比較適合先分成幾個入口，再從各入口看實際筆記。

## 常見標籤

問題症狀：

- `H1 不見`
- `標題層級`
- `版面跑掉`
- `按鈕點不到`
- `404`
- `FAQ 顯示異常`
- `表單失效`
- `速度變慢`
- `流量下降`

技術來源：

- `WordPress`
- `Elementor`
- `Astra`
- `GenerateBlocks`
- `Classic Editor`
- `WPML`
- `多語系`
- `翻譯權限`
- `Cloudflare`
- `快取`
- `附加 CSS`
- `結構化資料`

處理提醒：

- `先備份`
- `不要先停用全部外掛`
- `不要直接重做整頁`
- `適合自己先檢查`
- `建議找人一起看`

---

# 維護筆記

> 這裡整理的是日常維護 WordPress 網站時遇到的狀況。重點不是記錄誰的網站，而是保留問題拆解和下次可以怎麼判斷。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/

## 這裡放什麼

這裡放的是平常維護網站時遇到的狀況整理。

不是服務介紹，也不是把處理過程全部攤開。比較像把問題重新整理成一份之後可以查、可以給 AI 讀，也可以讓自己回頭看的工作筆記。

原始紀錄可以先留在私人工作筆記裡。公開到這裡時，只保留問題拆解、原因、修正方式和下次可以怎麼判斷，不放可識別資訊。

這裡會持續新增。

之後每次有適合公開整理的維護紀錄，我會先把原始內容重新整理，再改成這裡的格式。不是每一筆都會公開，但適合留下判斷方法的，會慢慢補進來。

每一篇會盡量保留幾件事：

- 狀況看起來是什麼。
- 我會先拆成哪幾層看。
- 最後發現問題在哪。
- 修正方式是什麼。
- 下次遇到類似狀況時，先整理哪些資訊。

## 問題狀態總覽

這裡用「問題狀態」整理。日期還會保留，但不當作主要入口。

同一篇筆記可能有兩三個狀態。下面不是硬分類，而是讓 AI 和人回頭查時比較容易找到起點。

### 資產不清楚

目前維護筆記裡還沒有獨立案例。可以先看：

- [網站資產自我檢查清單](/tw/website-asset-inventory/)
- [自己維護網站還是委外？小公司工程師篩選指南](/tw/website-maintenance-choice/)

### 網站打不開

- [Gutenberg 區塊無效、主機快取 404 與主題版面限縮排查](/tw/notes/maintenance/2026-05-04-gutenberg-invalid-blocks-and-gp-boxed-layout-issue/) `Varnish` `404`
- [選單消失，最後發現是 Autoptimize 快取檔案 404](/tw/notes/maintenance/2026-04-09-autoptimize-cache-menu-missing/) `Autoptimize` `JS 404`

### 後台進不去

目前維護筆記裡還沒有獨立案例。遇到這類狀況，可以先看 [常見狀況怎麼看](/tw/wordpress-situation-map/#後台進不去)。

### 後台不能管理

- [WPML 翻譯權限不足](/tw/notes/maintenance/2026-03-27-wpml-translation-permission/) `WPML` `權限`
- [Turnstile iframe 蓋住 WordPress admin bar](/tw/notes/maintenance/2026-05-05-turnstile-admin-bar-blocked/) `Turnstile` `後台`
- [Gutenberg 區塊無效、主機快取 404 與主題版面限縮排查](/tw/notes/maintenance/2026-05-04-gutenberg-invalid-blocks-and-gp-boxed-layout-issue/) `Gutenberg` `REST API`

### 更新異常

- [Gutenberg 區塊無效、主機快取 404 與主題版面限縮排查](/tw/notes/maintenance/2026-05-04-gutenberg-invalid-blocks-and-gp-boxed-layout-issue/) `Gutenberg` `快取`
- [Popup 短代碼直接露在前台](/tw/notes/maintenance/2026-04-23-popup-shortcode-migration/) `Popup` `外掛移除`

### 內容異常

- [H1 不見、H2 比 H3 還小，FAQ 結構化資料還跑到畫面上](/tw/notes/maintenance/2026-03-24-heading-schema-display-issue/) `H1` `FAQ`
- [Popup 短代碼直接露在前台](/tw/notes/maintenance/2026-04-23-popup-shortcode-migration/) `短代碼`
- [Footer 最新文章區塊漏出 raw HTML](/tw/notes/maintenance/2026-05-04-footer-raw-html-query-loop/) `動態內容`
- [雙語網站 Logo 連結跳轉語系錯誤](/tw/notes/maintenance/2026-03-25-logo-language-link-bug/) `多語系`

### 結構異常

- [H1 不見、H2 比 H3 還小，FAQ 結構化資料還跑到畫面上](/tw/notes/maintenance/2026-03-24-heading-schema-display-issue/) `標題層級` `JSON-LD`
- [Rank Math FAQ 區塊驗證失敗與區塊程式碼自動產生器](/tw/notes/maintenance/2026-03-30-rankmath-faq-block-validation-script/) `FAQPage` `Gutenberg`
- [FAQ 結構化資料修好了，但檢測還看到舊結果](/tw/notes/maintenance/2026-05-28-faq-schema-cache-stale/) `FAQPage` `快取`
- [側邊欄最新文章依分類篩選與排除](/tw/notes/maintenance/2026-03-27-sidebar-recent-posts-filter/) `分類` `側邊欄`

### 畫面異常

- [商品價格消失，最後發現 CSS scope 太大](/tw/notes/maintenance/2026-03-23-product-price-badge-css-scope/) `CSS scope`
- [側邊欄最新文章項目符號遺失與 CSS 優先權覆蓋](/tw/notes/maintenance/2026-03-27-sidebar-recent-posts-bullet-missing/) `CSS`
- [Rank Math FAQ 卡片化排版與跨容器對齊](/tw/notes/maintenance/2026-03-30-faq-css-card-styling-and-alignment/) `CSS` `對齊`
- [銷售漏斗頁首與主視覺間隙排查與版面設定優化](/tw/notes/maintenance/2026-04-06-funnel-header-hero-gap-issue/) `GeneratePress`
- [全站間距不一致，CSS 從 Additional CSS 拆出去](/tw/notes/maintenance/2026-04-06-site-spacing-css-snippets/) `CSS 管理`
- [CSS 媒體查詢未閉合導致後續樣式遭吞噬排查](/tw/notes/maintenance/2026-04-19-css-unclosed-media-query-swallowed-styles/) `CSS`
- [文章卡片閱讀更多按鈕對齊與絕對定位排版](/tw/notes/maintenance/2026-04-27-elementor-post-grid-readmore-absolute-position/) `Elementor`
- [TablePress 圖示沒有置中](/tw/notes/maintenance/2026-04-27-tablepress-icon-center/) `TablePress`
- [手機版 Badge 壓到商品圖](/tw/notes/maintenance/2026-05-27-yith-badge-mobile-overlap/) `RWD`

### 操作失效

- [英文版選單消失，最後發現 Header JS 多包 script](/tw/notes/maintenance/2026-03-31-language-menu-script-error/) `Header JS`
- [選單消失，最後發現是 Autoptimize 快取檔案 404](/tw/notes/maintenance/2026-04-09-autoptimize-cache-menu-missing/) `JS 404`
- [Logo 點第二次跑到 reCAPTCHA 管理頁](/tw/notes/maintenance/2026-05-01-logo-click-recaptcha-migrate/) `reCAPTCHA`
- [Turnstile iframe 蓋住 WordPress admin bar](/tw/notes/maintenance/2026-05-05-turnstile-admin-bar-blocked/) `Turnstile`

### 詢問異常

- [Logo 點第二次跑到 reCAPTCHA 管理頁](/tw/notes/maintenance/2026-05-01-logo-click-recaptcha-migrate/) `Popup` `reCAPTCHA`
- [Turnstile iframe 蓋住 WordPress admin bar](/tw/notes/maintenance/2026-05-05-turnstile-admin-bar-blocked/) `驗證碼`
- [關於頁面全寬打破邊框排版與聯絡表單信任文案優化](/tw/notes/maintenance/2026-04-06-about-page-breakout-layout-and-contact-trust-copy/) `Fluent Forms`

### 訂單或付款異常

目前維護筆記裡還沒有獨立案例。

### 通知異常

目前維護筆記裡還沒有獨立案例。可以先看 [聯絡表單發信的底層原因與誤會](/tw/email-delivery-basics/)。

### Google 異常

- [Cloudflare WAF 擋到 Googlebot](/tw/notes/maintenance/2026-03-27-cloudflare-waf-googlebot/) `Googlebot` `WAF`
- [H1 不見、H2 比 H3 還小，FAQ 結構化資料還跑到畫面上](/tw/notes/maintenance/2026-03-24-heading-schema-display-issue/) `結構化資料`
- [Rank Math FAQ 區塊驗證失敗與區塊程式碼自動產生器](/tw/notes/maintenance/2026-03-30-rankmath-faq-block-validation-script/) `FAQPage`
- [FAQ 結構化資料修好了，但檢測還看到舊結果](/tw/notes/maintenance/2026-05-28-faq-schema-cache-stale/) `GSC` `快取`

### 數據異常

目前維護筆記裡還沒有獨立案例。可以先看 [GSC 筆記](/tw/technical-seo-gsc/)。

### 速度或快取異常

- [選單消失，最後發現是 Autoptimize 快取檔案 404](/tw/notes/maintenance/2026-04-09-autoptimize-cache-menu-missing/) `Autoptimize`
- [Gutenberg 區塊無效、主機快取 404 與主題版面限縮排查](/tw/notes/maintenance/2026-05-04-gutenberg-invalid-blocks-and-gp-boxed-layout-issue/) `Varnish`
- [FAQ 結構化資料修好了，但檢測還看到舊結果](/tw/notes/maintenance/2026-05-28-faq-schema-cache-stale/) `快取`

### 安全與復原異常

- [Cloudflare WAF 擋到 Googlebot](/tw/notes/maintenance/2026-03-27-cloudflare-waf-googlebot/) `WAF`
- [先把狀況講清楚](/tw/website-problem-intake/)
- [日常維護核心項目](/tw/after-the-project/)

## 依日期查看

日期適合回頭查某一次整理紀錄，但不適合當主要入口。

### 2026-05

- 05/28 · [FAQ 結構化資料修好了，但檢測還看到舊結果](/tw/notes/maintenance/2026-05-28-faq-schema-cache-stale/) `Rank Math` `FAQPage` `快取`
- 05/27 · [手機版 Badge 壓到商品圖](/tw/notes/maintenance/2026-05-27-yith-badge-mobile-overlap/) `YITH Badge` `WooCommerce` `RWD`
- 05/05 · [Turnstile iframe 蓋住 WordPress admin bar](/tw/notes/maintenance/2026-05-05-turnstile-admin-bar-blocked/) `表單` `驗證碼` `後台`
- 05/04 · [Gutenberg 區塊無效、主機快取 404 與主題版面限縮排查](/tw/notes/maintenance/2026-05-04-gutenberg-invalid-blocks-and-gp-boxed-layout-issue/) `Gutenberg` `Varnish` `快取` `GenerateBlocks` `REST API`
- 05/04 · [Footer 最新文章區塊漏出 raw HTML](/tw/notes/maintenance/2026-05-04-footer-raw-html-query-loop/) `版面` `動態內容` `GenerateBlocks`
- 05/01 · [Logo 點第二次跑到 reCAPTCHA 管理頁](/tw/notes/maintenance/2026-05-01-logo-click-recaptcha-migrate/) `reCAPTCHA` `Popup` `Logo`

### 2026-04

- 04/27 · [文章卡片閱讀更多按鈕對齊與絕對定位排版](/tw/notes/maintenance/2026-04-27-elementor-post-grid-readmore-absolute-position/) `Elementor` `UAEL` `絕對定位` `CSS`
- 04/27 · [TablePress 圖示沒有置中](/tw/notes/maintenance/2026-04-27-tablepress-icon-center/) `TablePress` `CSS` `表格`
- 04/23 · [Popup 短代碼直接露在前台](/tw/notes/maintenance/2026-04-23-popup-shortcode-migration/) `Popup` `短代碼` `Elementor`
- 04/19 · [CSS 媒體查詢未閉合導致後續樣式遭吞噬排查](/tw/notes/maintenance/2026-04-19-css-unclosed-media-query-swallowed-styles/) `CSS` `媒體查詢` `自訂CSS` `排查`
- 04/09 · [選單消失，最後發現是 Autoptimize 快取檔案 404](/tw/notes/maintenance/2026-04-09-autoptimize-cache-menu-missing/) `快取` `JS` `選單`
- 04/06 · [關於頁面全寬打破邊框排版與聯絡表單信任文案優化](/tw/notes/maintenance/2026-04-06-about-page-breakout-layout-and-contact-trust-copy/) `GenerateBlocks` `CSS Breakout` `Fluent Forms`
- 04/06 · [銷售漏斗頁首與主視覺間隙排查與版面設定優化](/tw/notes/maintenance/2026-04-06-funnel-header-hero-gap-issue/) `GeneratePress` `WPFunnels` `Content Padding`
- 04/06 · [全站間距不一致，CSS 從 Additional CSS 拆出去](/tw/notes/maintenance/2026-04-06-site-spacing-css-snippets/) `CSS 管理` `間距` `Code Snippets`

### 2026-03

- 03/31 · [英文版選單消失，最後發現 Header JS 多包 script](/tw/notes/maintenance/2026-03-31-language-menu-script-error/) `WPML` `Header JS` `選單`
- 03/30 · [Rank Math FAQ 區塊驗證失敗與區塊程式碼自動產生器](/tw/notes/maintenance/2026-03-30-rankmath-faq-block-validation-script/) `Rank Math` `Gutenberg` `FAQPage` `Node.js`
- 03/30 · [WPML 多語系下佈景主題自訂版面翻譯失效之替代方案](/tw/notes/maintenance/2026-03-30-wpml-astra-custom-layout-translation-issue/) `WPML` `Astra` `多語系` `Shortcode`
- 03/30 · [Rank Math FAQ 卡片化排版與跨容器對齊](/tw/notes/maintenance/2026-03-30-faq-css-card-styling-and-alignment/) `Rank Math` `FAQPage` `CSS` `Elementor` `對齊`
- 03/27 · [側邊欄最新文章項目符號遺失與 CSS 優先權覆蓋](/tw/notes/maintenance/2026-03-27-sidebar-recent-posts-bullet-missing/) `CSS` `側邊欄` `list-style`
- 03/27 · [側邊欄最新文章依分類篩選與排除](/tw/notes/maintenance/2026-03-27-sidebar-recent-posts-filter/) `側邊欄` `widget_posts_args` `WordPress` `PHP`
- 03/27 · [Cloudflare WAF 擋到 Googlebot](/tw/notes/maintenance/2026-03-27-cloudflare-waf-googlebot/) `Cloudflare` `WAF` `Googlebot`
- 03/27 · [WPML 翻譯權限不足](/tw/notes/maintenance/2026-03-27-wpml-translation-permission/) `WPML` `多語系` `權限`
- 03/25 · [雙語網站 Logo 連結跳轉語系錯誤](/tw/notes/maintenance/2026-03-25-logo-language-link-bug/) `多語系` `Logo` `WPML` `Astra` `JavaScript`
- 03/24 · [H1 不見、H2 比 H3 還小，FAQ 結構化資料還跑到畫面上](/tw/notes/maintenance/2026-03-24-heading-schema-display-issue/) `CSS` `結構化資料` `Elementor`
- 03/23 · [商品價格消失，最後發現 CSS scope 太大](/tw/notes/maintenance/2026-03-23-product-price-badge-css-scope/) `WooCommerce` `Elementor` `CSS scope`

---

# 商品價格消失，最後發現 CSS scope 太大

> 商品頁選擇規格後價格沒有出現，最後發現不是 WooCommerce 壞掉，而是共用 Elementor 模板裡的元素被全站 CSS 隱藏。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-03-23-product-price-badge-css-scope/

整理日期：2026-03-23

## 狀況

有幾個商品頁在選擇規格後，價格區塊沒有正常顯示。

同一批調整裡，課程列表和單一商品頁的 YITH Badge 也有壓到圖片的狀況。

這種問題很容易被看成 WooCommerce 或變體商品設定錯誤。但如果多個商品頁同時發生，通常要先懷疑共用模板或全站 CSS。

## 先拆成幾層看

我會先拆成幾層：

- 價格資料是否真的沒有輸出。
- 價格有輸出，但被 CSS 隱藏。
- 被隱藏的是單一頁面，還是所有套用同一個模板的頁面。
- CSS 是寫在佈景主題、Additional CSS、WPCodeBox，還是頁面編輯器裡。
- Badge 是定位錯，還是圖片區塊沒有預留空間。

先不要急著重設商品規格。只要 HTML 裡其實有價格，方向就不是商品資料。

## 最後發現

價格消失的原因是自訂 CSS 直接用 Elementor 的元素 ID 隱藏價格區塊。

原本目標只是隱藏某一個特殊商品頁的價格，但那兩個 Elementor 元素 ID 其實來自共用產品頁模板。

也就是說，只要使用同一個模板，全部商品頁都會被影響。

Badge 壓圖則是另一個問題。YITH Badge 是絕對定位，原本想透過改 WooCommerce 內部圖片元素的 `overflow` 或 `display` 來處理，但這種做法容易干擾 WooCommerce 原本的版面和變體顯示。

## 修正方式

價格區塊的 CSS 要加上頁面範圍。

概念像這樣：

```css
.postid-XXXXX .elementor-element-AAAA,
.postid-XXXXX .elementor-element-BBBB {
  display: none !important;
}
```

不要只寫：

```css
.elementor-element-AAAA,
.elementor-element-BBBB {
  display: none !important;
}
```

Badge 的處理則改成在外層容器預留空間，不動 WooCommerce 內層圖片元素。

比較穩的方向是：

```css
.container-image-and-badge {
  padding-top: 25px;
}

.container-image-and-badge .yith-wcbm-badge {
  position: absolute !important;
  top: 0 !important;
  left: 0 !important;
  z-index: 10;
}
```

重點不是這個數值一定正確，而是不要為了解決 badge 壓圖，去改 WooCommerce 內部結構。

## 不建議先做的事

不要一看到價格不見，就先重建商品或重裝 WooCommerce。

也不要直接用 Elementor 元素 ID 寫全站隱藏。Elementor 模板裡的元素 ID 不一定只屬於單一頁面。

如果真的要針對某一頁，至少用 `body` 上的頁面 class 限定範圍。

## 下次遇到可以先整理什麼

- 哪些商品頁受影響。
- 選規格後 HTML 裡是否有價格。
- 價格元素是不是被 `display: none` 或 `visibility: hidden` 隱藏。
- 目前套用哪個 Elementor / WooCommerce 模板。
- 自訂 CSS 寫在哪裡。
- Badge 的定位參考容器是哪一層。

這類問題通常不是單一外掛壞掉，而是模板共用和 CSS 範圍沒有切乾淨。

## 標籤

- `WooCommerce`
- `Elementor`
- `WPCodeBox`
- `YITH Badge`
- `CSS scope`
- `商品頁`

---

# H1 不見、H2 比 H3 還小，FAQ 結構化資料還跑到畫面上

> 一個 WordPress 文章頁同時出現標題層級、佈景 CSS 和 FAQ JSON-LD 的問題。這篇記錄我會怎麼拆開看。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-03-24-heading-schema-display-issue/

整理日期：2026-03-24

## 狀況

有一個 WordPress 文章頁，看起來同時出現三個問題。

第一個是標題大小不對。H2 很小，H3 反而比較大，看起來像標題層級顛倒。

第二個是 H1 不見。HTML 裡其實有 H1，但前台沒有顯示。

第三個是 FAQ 結構化資料直接出現在頁面上。原本應該給 Google 讀的 JSON-LD，變成一般文字出現在文章內容裡。

這種狀況不要先急著重做整頁。它通常不是單一問題，而是幾個不同層級的設定疊在一起。

## 先拆成幾層看

我會先分成三層看：

- 標題大小是不是被額外 CSS 蓋掉。
- H1 是不是被佈景或頁面編輯器隱藏。
- FAQ JSON-LD 是不是被當成一般文字貼進文章。

這三個問題看起來都跟「標題」有關，但實際上來源不同。混在一起修，很容易越改越亂。

## 最後發現

H2 和 H3 的問題，是附加 CSS 裡手動寫了 H2 字級。

佈景主題後台原本有設定 H2 和 H3 的大小，但附加 CSS 的權重比較高，所以 H2 被壓得很小。H3 沒被那段 CSS 影響，反而維持正常大小，結果看起來就變成 H3 比 H2 還大。

H1 不顯示，是另一個問題。

某個 Elementor 模板開了隱藏標題設定。照理說，那個設定不應該影響全站文章頁，但它把控制標題顯示的 CSS 變數寫到全域。佈景主題剛好讀到這個變數，所以文章頁的 H1 被一起藏掉。

FAQ 結構化資料顯示在畫面上，原因更單純：JSON-LD 被當成純文字貼進文章內容，而不是放在正確的 `script type="application/ld+json"` 裡。

## 修正方式

H2 / H3 的部分，先把附加 CSS 裡手動覆蓋標題大小的那段註解掉，讓佈景主題原本的字級設定生效。

H1 的部分，除了檢查 Elementor 模板的隱藏標題設定，也要確認前台實際吃到哪一段 CSS。如果設定關掉後還被快取或全域變數影響，可以再用更明確的 CSS 把文章頁 H1 顯示回來。

FAQ 的部分，不要把 JSON-LD 當文章文字貼。要放在自訂 HTML 區塊裡，並用正確的 `script` 標籤包起來。

如果網站還在用 Classic Editor，要在文字模式貼入。貼完不要切回視覺模式再存，否則內容可能被編輯器改掉。

## 這次順手檢查的地方

附加 CSS 也要一起看。

這次除了標題大小，還看到幾個容易連鎖影響的問題：

- media query 裡有括號打錯。
- 有一段註解沒有正常結束。
- 有重複的 CSS 選擇器可以合併。

附加 CSS 壞掉時，不一定只影響當下那一行。少一個括號、註解沒關好，都可能讓後面的 CSS 一起失效。

## 不建議先做的事

不要一開始就重做整頁。

也不要看到 H1 不見，就直接去文章裡補一個假的 H1。HTML 裡如果已經有 H1，只是被 CSS 隱藏，應該先找出誰把它藏起來。

FAQ 結構化資料也不要直接複製網路上的 JSON 貼進視覺編輯器。那樣很容易變成頁面文字，而不是結構化資料。

## 下次遇到可以先整理什麼

- 問題頁面的網址。
- 最近有沒有改 Elementor 模板。
- 最近有沒有改附加 CSS。
- H1 是 HTML 裡沒有，還是有但被隱藏。
- H2 / H3 的實際字級。
- FAQ JSON-LD 是放在哪裡。
- 有沒有快取外掛或 CDN。

先把這些整理起來，會比直接猜外掛問題快很多。

---

# 雙語網站 Logo 連結跳轉語系錯誤

> 雙語網站非首頁的 Logo 連結跳轉到英文首頁，且部分頁面的語言切換器消失，通常是因為寫死 HTML 網址與選單配置錯誤。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-03-25-logo-language-link-bug/

整理日期：2026-03-25

## 狀況

在一個雙語（中文與英文）的網站中，遇到兩個導覽列問題：

1. **Logo 連結錯誤**：中文版的其他子網頁，點擊左上角 Logo 會跳轉到英文版首頁（`/en/`），但中文首頁點擊 Logo 是正常的。
2. **語言切換器消失**：部分頁面的導航列右側，原本應該出現的語系切換按鈕（繁體中文 / English）消失不見。

---

## 先拆成幾層看

- 頁首 Logo 的網址是動態產生的，還是手動在自訂 HTML 區塊中寫死的。
- 語言切換器外掛（WPML）的顯示條件，是綁定到特定選單（Menu），還是全站導航列。
- 佈景主題的文字/HTML 區塊是否有限制 JavaScript 執行。

---

## 最後發現

頁首 Logo 是透過佈景主題（如 Astra）自訂頁首中的「文字/HTML 區塊」手動製作的。其 HTML 代碼中的 `href` 被寫死了英文首頁連結（`https://example.com/en/`），導致不論在哪個語系點擊，都會強制跳轉至英文版。

而語言切換器部分，WPML 外掛的切換按鈕被綁定在一個特定的新聞分類選單位置，而不是主選單（Primary Menu）位置，因此只要該頁面沒有載入該特定選單，切換器就不會顯示。

---

## 修正方式

### 1. Logo 連結動態改寫
因為佈景主題的 HTML 區塊會自動過濾 `<script>` 標籤，無法直接在區塊內寫 JS。因此我們採取兩步驟處理：
* **第一步**：將自訂 HTML 區塊中的連結 `href` 修改為中文首頁（`https://example.com/`）。
* **第二步**：在佈景主題自訂設定的 Header 區塊（不被過濾程式碼的地方）加入一段 JavaScript。當偵測到目前網址路徑包含 `/en` 時，自動將 Logo 連結動態改為英文版首頁。

**自訂 HTML 區塊修改：**
```html
<div class="head-logo">
    <a href="https://example.com/"><img src="/wp-content/uploads/logo.png" width="220"></a>
</div>
```

**Header 區塊加入 JavaScript：**
```html
<script>
document.addEventListener('DOMContentLoaded', function() {
    var logoLink = document.querySelector('.head-logo a');
    if (logoLink && window.location.pathname.startsWith('/en')) {
        logoLink.href = 'https://example.com/en/';
    }
});
</script>
```

### 2. 語言切換器設定
進入 **WPML > 語言** 的設定後台，將語言切換器新增到「主選單（Primary Menu）」位置，確保全站只要有主導覽列的頁面都能正確顯示。

---

## 不建議先做的事

- 不要為了修 Logo 連結去安裝額外的網址重導向外掛，這會增加主機負荷且可能導致重新導向迴圈。
- 不要嘗試直接在不支援 JS 的 HTML 區塊中強行寫入 Script 程式碼，會被系統自動過濾掉而失效。

---

## 下次遇到可以先整理什麼

- 發生錯誤的頁面網址與對應的語系。
- 頁首 Logo 是主題內建功能，還是透過自訂 HTML 區塊手寫的。
- 語言切換外掛所綁定的選單位置名稱。

---

## 標籤

- `多語系`
- `Logo`
- `WPML`
- `Astra`
- `JavaScript`

---

# Cloudflare WAF 擋到 Googlebot

> Cloudflare 自訂 WAF 規則把搜尋引擎的 ASN 放進黑名單，導致 Googlebot 被 Managed Challenge 擋住，頁面可能無法正常被抓取。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-03-27-cloudflare-waf-googlebot/

整理日期：2026-03-27

## 狀況

有兩個頁面被 Googlebot 抓取時，沒有正常回應內容，而是被 Cloudflare 丟到 Managed Challenge。

Googlebot 不會像真人一樣解 challenge。對搜尋引擎來說，這種狀況就等於頁面可能抓不到。

這種問題不一定會每次都發生。Search Console 可能前面看起來正常，後面某幾次抓取又被擋住，所以它會比一般 404 或 500 更難判斷。

## 先拆成幾層看

我會先拆成幾層：

- 是網站本身回錯，還是 CDN / WAF 擋住。
- 被擋的是一般使用者，還是搜尋引擎。
- Cloudflare 規則裡有沒有用 ASN、UA、路徑或 bot 判斷。
- 規則有沒有把 Googlebot / Bingbot 這類搜尋引擎排除。

如果只從 WordPress 後台看，通常看不出問題。這類狀況要去 Cloudflare 的安全事件紀錄看。

## 最後發現

Cloudflare 自訂 WAF 裡有一條比較積極的爬蟲規則。

那條規則用 ASN 黑名單擋掉一批來源，但裡面也包含 Google 和 Microsoft / Bing 會用到的 ASN。

規則雖然有排除 `cf.client.bot`，但這不能當成 100% 保險。

Googlebot 現在使用 evergreen User-Agent，看起來會很像一般 Chrome。Cloudflare 不一定每次都能正確標成 `cf.client.bot = true`，所以還是可能命中規則。

## 修正方式

把搜尋引擎相關 ASN 從 Cloudflare WAF 的 ASN 黑名單移掉。

這次主要移掉：

- Google 相關 ASN
- Microsoft / Bing 相關 ASN

規則改完後，Cloudflare 會即時生效，不需要等 WordPress 或快取更新。

## 不建議先做的事

不要看到 Search Console 有抓取問題，就先回 WordPress 裡改文章內容。

也不要只看前台能不能開。真人可以看到頁面，不代表 Googlebot 沒被 WAF 擋住。

更不要把所有可疑流量都用 ASN 一刀切。這種擋法很快，但也很容易誤傷搜尋引擎、外部監測服務或合法工具。

## 下次遇到可以先整理什麼

- Search Console 顯示的錯誤時間。
- Cloudflare 安全事件裡對應的時間。
- 被擋的 URL。
- 被擋的 IP、ASN、User-Agent。
- 命中的 WAF 規則名稱。
- 回應是 block、challenge，還是 managed challenge。

這類問題要把 Search Console 和 Cloudflare 事件對起來看，單看其中一邊很容易誤判。

## 標籤

- `Cloudflare`
- `WAF`
- `Googlebot`
- `GSC`
- `索引`
- `搜尋引擎抓取`

---

# 側邊欄最新文章項目符號遺失與 CSS 優先權覆蓋

> 解決 Astra 等佈景主題因 CSS Reset 樣式過強，導致側邊欄最新文章小工具的清單項目符號消失、文字不易辨識的問題。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-03-27-sidebar-recent-posts-bullet-missing/

整理日期：2026-03-27

## 狀況

在網站上新增「最新文章」小工具到側邊欄後，清單的項目符號（圓點）完全沒有顯示，導致多篇文章標題緊貼在一起，行距過密，訪客極難區分不同的文章標題。

---

## 先拆成幾層看

* 檢查側邊欄的 HTML 結構，確認是否仍使用標準的 `<ul>` 與 `<li>` 標籤。
* 使用瀏覽器開發者工具（DevTools）檢查 computed styles，找出是哪一個 CSS 規則將 `list-style` 或 `list-style-type` 設為 `none`。
* 檢查這些 reset 樣式是來自 WordPress 核心、佈景主題（如 Astra/GeneratePress），還是特定外掛。

---

## 最後發現

許多現代佈景主題（例如 Astra）為了保證版面一致性，會在全站的樣式重設（Reset）或小工具樣式中，強制宣告 `.widget ul { list-style: none; padding-left: 0; }`。

由於該重設規則的權限較高，即使在 HTML 結構中是標準的列表，前台依然不會顯示項目符號。要將其加回，必須使用比主題更具體的選擇器，並搭配 `!important` 提高權限層級。

---

## 修正方式

在「外觀 > 自訂 > 附加的 CSS」中加入以下 CSS 樣式規則，覆蓋主題的 CSS 重設：

```css
/* 側邊欄「最新文章」小工具 — 加回項目符號與縮排 */
.widget_recent_entries ul {
    list-style: disc !important;
    padding-left: 1.25em !important;
    margin-left: 0;
}

.widget_recent_entries ul li {
    list-style: disc !important;
    margin-bottom: 0.5em;
}
```

---

## 不建議先做的事

* 不要為了顯示項目符號而去修改小工具的原始 PHP 結構，或是試圖用 JavaScript 在網頁載入後動態插入點號，這會讓維護工作變得非常繁雜。
* 避免直接在全站的 `ul` 標籤上套用全域修改，這會破壞選單、頁首或頁尾等其他不該出現圓點的導覽區塊。

---

## 下次遇到可以先整理什麼

* 出現問題的側邊欄小工具之 CSS Class 名稱（例如 `.widget_recent_entries`）。
* 主題預設針對側邊欄小工具的列表縮排值（`padding-left` 或 `margin-left`）。
* 是否有使用快取外掛或 CDN（如 Cloudflare / Varnish），修改 CSS 後必須清除快取才能驗證結果。

---

## 標籤

- `CSS`
- `側邊欄`
- `Astra`
- `樣式重設`
- `list-style`

---

# 側邊欄最新文章依分類篩選與排除

> 說明如何透過 WordPress 內建的 widget_posts_args 篩選器，在文章單頁與分類彙整頁只顯示同分類的最新文章，並排除目前閱讀的文章。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-03-27-sidebar-recent-posts-filter/

整理日期：2026-03-27

## 狀況

在維護多個企業品牌網站時，業主提出以下需求：
1. **文章單頁**：側邊欄的「最新文章」小工具，只顯示與當前文章相同分類的文章，而不是全站最新文章，並且要排除目前正在閱讀的這篇文章。
2. **分類彙整頁**：在分類頁面時，側邊欄的最新文章也應該只篩選該分類下的文章。
3. **避免衝突**：若網站裝有 WooCommerce，篩選邏輯不可影響到商品單頁的相關版面。

---

## 先拆成幾層看

* 側邊欄的最新文章是用 WordPress 內建的「最新文章（Recent Posts）」小工具，還是第三方區塊/外掛渲染的。
* 能否用最輕量、不新增外掛的 PHP Filter 方式，直接攔截並修改小工具的查詢參數（Query Args）。
* 網站是否有使用其他自訂文章類型（Custom Post Type），例如 WooCommerce 商品（`product`），需確保判斷式足夠精準。

---

## 最後發現

WordPress 內建的 `WP_Widget_Recent_Posts` 類別在執行 `WP_Query` 之前，會套用 `widget_posts_args` 篩選器。我們可以透過此 Hook 攔截參數。

在實作判斷時：
* 若只用 `is_single()`，會同時匹配到 `post` 文章以及 WooCommerce 的 `product` 商品頁。
* 改用 `is_singular('post')` 可以精準定位為「一般部落格文章單頁」，避免對商品頁造成非預期的查詢干擾。

---

## 修正方式

在子佈景主題的 `functions.php`（或透過 Code Snippets 外掛）加入以下 PHP 程式碼：

```php
/**
 * 側邊欄「最新文章」小工具 — 文章頁顯示同分類，分類頁只顯示該分類
 */
add_filter( 'widget_posts_args', function( $args ) {
    // 精準判斷是否為一般文章單頁，避免干擾商品或其他 Post Type 頁面
    if ( is_singular( 'post' ) ) {
        $cats = wp_get_post_categories( get_the_ID() );
        if ( ! empty( $cats ) ) {
            $args['category__in']  = $cats;
            $args['post__not_in']  = array( get_the_ID() ); // 排除當前正在閱讀的文章
        }
    }
    // 若在分類彙整頁，則自動篩選目前分類
    elseif ( is_category() ) {
        $args['cat'] = get_queried_object_id();
    }
    return $args;
} );
```

---

## 不建議先做的事

* 不要為了這個簡單的過濾需求去安裝複雜的側邊欄管理外掛（如 Widget Logic 等），這會增加資料庫查詢與外掛維護負擔。
* 不要直接去修改 WordPress 核心檔案，因為下次系統更新時修改會全部被覆蓋。

---

## 下次遇到可以先整理什麼

* 發生需求的文章類型與分類架構（是否有複數分類、大分類與小分類的階層關係）。
* 確認側邊欄使用的是 WordPress 內建小工具，還是佈景主題（例如 Astra, GeneratePress）自訂的動態區塊。
* 檢查網站是否含有其他 Custom Post Types，確保程式碼條件篩選的安全性。

---

## 標籤

- `側邊欄`
- `widget_posts_args`
- `WordPress`
- `PHP`
- `篩選`

---

# WPML 翻譯權限不足

> 使用者在 WordPress 後台編輯英文文章時，點擊繁體中文翻譯按鈕，出現沒有權限從英語翻譯成繁體中文的錯誤。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-03-27-wpml-translation-permission/

整理日期：2026-03-27

## 狀況

有一個多語系 WordPress 網站，使用者在後台編輯英文文章。

點擊「繁體中文」翻譯按鈕時，出現錯誤訊息：

```txt
You don't have the rights to translate from 英語 to 繁體中文
```

從畫面上看，會很直覺以為是帳號權限不夠，或是使用者不是管理員。

但 WPML 的翻譯權限不只看 WordPress 角色，也會看它自己在 Translation Management 裡設定的語言對。

## 先拆成幾層看

我會先分成幾個方向看：

- 這個帳號在 WordPress 裡是不是有足夠權限。
- WPML 裡這個帳號是不是被設定成譯員。
- 這個譯員可以翻哪些語言對。
- 錯誤訊息是出現在特定語言方向，還是所有翻譯都不能做。

這種狀況不要只看帳號是不是管理員。

即使帳號是管理員，WPML 還是可能因為語言對沒有設定完整，而不讓它做某個方向的翻譯。

## 最後發現

最後問題出在 WPML 的譯員語言對設定。

在 `WPML -> Translation Management -> Manage Translators & Services` 裡，該帳號只設定了：

```txt
繁體中文 -> 英語
```

但這次使用者是在英文文章上，要建立或編輯繁體中文翻譯，所以需要的是：

```txt
英語 -> 繁體中文
```

WPML 的翻譯權限是單向的。

有 `繁體中文 -> 英語`，不代表也可以反過來做 `英語 -> 繁體中文`。

## 修正方式

到 WPML 的翻譯管理裡，找到譯員設定。

位置大致是：

```txt
WPML -> Translation Management -> Manage Translators & Services
```

在譯員列表中，找到對應帳號，點擊編輯圖示。

把 `英語 -> 繁體中文` 這組語言對補上去。

補完後，該帳號就可以從英文文章進入繁體中文翻譯流程。

## 相關畫面

這篇筆記適合保留處理過的截圖。

建議至少放兩張：

- 錯誤訊息畫面：保留 `You don't have the rights to translate from 英語 to 繁體中文`，但遮掉可識別資訊。
- WPML 譯員設定畫面：保留語言對設定位置，讓人看得出來哪裡只有 `繁體中文 -> 英語`，哪裡需要補上 `英語 -> 繁體中文`。

圖片旁邊要補文字說明，不要只放圖。

圖片說明可以寫成：

> 這張圖是在 WPML 的譯員設定中確認語言對。問題不是 WordPress 帳號角色，而是這個譯員只被允許從繁體中文翻成英語，沒有被允許從英語翻回繁體中文。

原始截圖不要直接公開。要先裁切或遮蔽可識別資訊和不相關的網站資訊。

## 不建議先做的事

不要一開始就重建帳號。

也不要只去調 WordPress 角色，因為問題可能不在 WordPress 的使用者角色，而是在 WPML 自己的譯員設定。

如果網站有多個語言方向，也不要只設定一組語言對就以為全部都能翻。WPML 會把不同方向分開看。

## 下次遇到可以先整理什麼

- 使用者點的是哪一個語言的翻譯按鈕。
- 原文語言是什麼。
- 目標翻譯語言是什麼。
- 使用者帳號在 WordPress 裡的角色。
- 使用者在 WPML 裡是不是譯員。
- WPML 裡目前設定了哪些語言對。
- 錯誤訊息完整內容。

## 標籤

- `WordPress`
- `WPML`
- `多語系`
- `翻譯權限`
- `後台操作`
- `外掛設定`

---

# Rank Math FAQ 卡片化排版與跨容器對齊

> 將 Rank Math FAQ 區塊改造成現代卡片式排版，並解決因不同 DOM 容器（Elementor 頁首與主題內容區）導致版面無法對齊的排版問題。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-03-30-faq-css-card-styling-and-alignment/

整理日期：2026-03-30

## 狀況

1. **問答樣式單調**：使用 Rank Math FAQ 區塊產生的問答頁面，預設只是簡單的流水文字排列，沒有視覺區隔與陰影，在長列表下顯得極其擁擠且難以閱讀。
2. **跨容器對齊失效**：將 FAQ 改為卡片樣式後，發現 FAQ 卡片與上方由佈景主題 Hook 注入的分類選單（使用 Elementor 容器製作）左側無法對齊。使用固定像素值（如 `margin-left`）在不同螢幕尺寸下皆會跑版。

---

## 先拆成幾層看

* **結構層**：檢視 Rank Math FAQ 區塊在前端渲染產生的 HTML 結構與 Class 命名。
* **樣式層**：如何用純 CSS 進行卡片化包裝（包含陰影、圓角、懸停效果與邊框提示），確保全站通用且無須依賴額外的 JS。
* **容器層**：分析「分類選單」與「FAQ 內容」的 DOM 層級關係。兩者是否處於同一個父容器中，其最大寬度（`max-width`）與置中邏輯是否一致。

---

## 最後發現

對齊失效的原因在於兩者位於**完全不同的 DOM 容器**中：
* 上方的分類選單是由自訂區塊 Hook 在內容區外面，使用 Elementor 的容器邏輯（限制 `max-width: 1140px; margin: 0 auto; padding: 0 10px`）。
* 下方的 FAQ 區塊是在文章內容區（`entry-content`）內，使用佈景主題預設的滿版容器。

當兩個容器的基本寬度與邊距設定不同時，試圖在子元素上用固定的 `margin` 或 `padding` 微調是無效的。最可靠的對齊方式是**直接複製目標容器的寬度與間距限制邏輯**。

---

## 修正方式

在「外觀 > 自訂 > 附加的 CSS」中加入以下 CSS 樣式，同時處理卡片化排版與容器對齊：

```css
/* === Rank Math FAQ 卡片化與對齊排版 === */

/* 1. 讓區塊外層容器複製 Elementor 容器的寬度與對齊邏輯 */
.rank-math-block {
  max-width: 1140px;
  margin: 40px auto 0;
  padding: 0 10px 40px;
}

/* 2. 限制實際問答列表的寬度，維持閱讀舒適性 */
.rank-math-list {
  display: flex;
  flex-direction: column;
  gap: 16px;
  max-width: 800px;
}

/* 3. 卡片化問答項目 */
.rank-math-list-item {
  background: #fff;
  border: 1px solid #e5e7eb;
  border-radius: 10px;
  overflow: hidden;
  transition: box-shadow 0.2s ease;
}

.rank-math-list-item:hover {
  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
}

/* 4. 問題標題區塊（含左側品牌主色邊框） */
h3.rank-math-question {
  font-size: 17px !important;
  font-weight: 600 !important;
  line-height: 1.5 !important;
  color: #1a1a1a !important;
  margin: 0 !important;
  padding: 20px 24px !important;
  border-left: 4px solid #009fe8; /* 可替換為品牌主色 */
  background: #f8fbff;
}

/* 5. 回答內容區塊 */
.rank-math-answer {
  padding: 16px 24px 20px !important;
  border-top: 1px solid #f0f0f0;
}

.rank-math-answer p {
  margin-bottom: 12px !important;
  line-height: 1.75 !important;
  color: #4b4f58;
}

.rank-math-answer p:last-child {
  margin-bottom: 0 !important;
}

.rank-math-answer a {
  color: #009fe8;
  font-weight: 500;
}
```

---

## 不建議先做的事

* 避免使用固定像素（`px`）的絕對位移來強行對齊，這在平板與行動裝置等不同解析度下一定會再次跑版。
* 不要試圖在頁首區塊內包裝整個 FAQ 內容以求同一個容器，這會破壞 WordPress 內容管理的獨立性。

---

## 下次遇到可以先整理什麼

* 對齊有落差的兩個區塊，在 HTML 結構中各自的父層 Container 是哪一個 Class。
* 在 DevTools 的 Computed 面板中，比對這兩個容器的 `max-width`、`margin-left/right` 以及 `padding-left/right` 數值。
* 只要直接複製並覆寫該容器的邊距設定，就能在 RAG 響應式網頁上完美對齊。

---

## 標籤

- `Rank Math`
- `FAQPage`
- `CSS`
- `Elementor`
- `對齊`
- `卡片版面`

---

# Rank Math FAQ 區塊驗證失敗與區塊程式碼自動產生器

> 解析為何手寫或複製前端 HTML 會導致 Rank Math FAQ 區塊出現「無效內容」警告，並介紹如何透過自動化腳本正確產生符合 Gutenberg 驗證機制的區塊程式碼。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-03-30-rankmath-faq-block-validation-script/

整理日期：2026-03-30

## 狀況

當我們需要在 WordPress 頁面中以「程式碼編輯器」模式直接置入或大量產生 Rank Math FAQ 區塊（Gutenberg Block）時，編輯器內經常會跳出「此區塊包含未預期或無效的內容」的紅色錯誤警告，即便前台顯示似乎正常，但這會導致後續無法在後台編輯該區塊。

---

## 先拆成幾層看

* 檢查 Gutenberg 區塊在儲存時的結構設計，以及它是如何驗證儲存內容（Stored Content）與編輯器預期（Expected Output）的一致性。
* 比對「前端瀏覽器渲染出來的 HTML 程式碼」與「資料庫內儲存的 Gutenberg Block 原始 HTML 程式碼」是否有差異。
* 找出 Rank Math FAQ Block 的 `save()` 函式所輸出的精準 HTML 結構與 JSON 屬性格式。

---

## 最後發現

Gutenberg 編輯器在載入區塊時，會比對 HTML 註解（例如 `<!-- wp:rank-math/faq-block ... -->`）中的 JSON 屬性與其內部的 HTML 實體。

Rank Math FAQ 區塊存在一個關鍵的雙重結構：
1. **編輯器儲存端（`save()`）**：輸出的 HTML 非常簡潔，每個問答項目僅標示 `.rank-math-faq-item`，無包裝層，且元素沒有任何 `id`。
2. **前台渲染端（PHP Server-side Render）**：在網頁前端，PHP 會將其包裝成 `.rank-math-block`、`.rank-math-list`，並將項目類別改為 `.rank-math-list-item`，甚至加上動態產生且尾部帶有空格的 `id="faq-question-..."`。

如果直接複製前端網頁的 HTML 貼回後台編輯器，Gutenberg 就會因為與 `save()` 預期結構不符而判定為「無效區塊」。

---

## 修正方式

要批次產生無錯誤的 Rank Math FAQ 區塊，不能手寫或複製前台 HTML，必須使用專用的工具腳本，同時產生 JSON Attributes 以及符合 `save()` 格式的 HTML 代碼。

以下為 Node.js 自動產生腳本的實作方式：

### 1. 產生器腳本（`generate-faq.mjs`）

```javascript
#!/usr/bin/env node
import { readFileSync } from 'fs';

// 從標準輸入（stdin）讀取 JSON 格式的問答資料
const input = JSON.parse(readFileSync('/dev/stdin', 'utf8'));

const questions = input.map((pair, i) => ({
  id: `faq-question-${Date.now() + i}`,
  title: pair.question,
  content: pair.answer,
  visible: true
}));

const itemsHtml = questions
  .map(
    (q) =>
      `<div class="rank-math-faq-item">` +
      `<h3 class="rank-math-question">${q.title}</h3>` +
      `<div class="rank-math-answer">${q.content}</div>` +
      `</div>`
  )
  .join('');

const html = `<div class="wp-block-rank-math-faq-block">${itemsHtml}</div>`;
const attrs = JSON.stringify({ questions });

// 輸出符合 Gutenberg 標準的區塊代碼
process.stdout.write(
  `<!-- wp:rank-math/faq-block ${attrs} -->\n${html}\n<!-- /wp:rank-math/faq-block -->\n`
);
```

### 2. 使用工作流程
1. 將需要產生的 FAQ 問答整理為 JSON 格式（`faq-source.json`）：
   ```json
   [
     {
       "question": "常見問題一的標題？",
       "answer": "常見問題一的解答內容。"
     }
   ]
   ```
2. 在終端機執行腳本並複製結果：
   ```bash
   node generate-faq.mjs < faq-source.json | pbcopy
   ```
3. 在 WordPress 區塊編輯器切換到「程式碼編輯器（Code Editor）」，直接貼上複製的程式碼，即可完美通過驗證且無警告。

---

## 不建議先做的事

* 絕對不要在編輯器警告「區塊無效」時，直接點擊「轉換為 HTML」，這會將整個區塊轉成裸 HTML 區塊，導致失去 Rank Math 的結構化資料（JSON-LD Schema）輸出功能，對 SEO 會造成負面影響。

---

## 下次遇到可以先整理什麼

* 點擊編輯器無效區塊上的「嘗試復原（Attempt Block Recovery）」，在主控台（Console）中觀察「期待的 HTML 結構」與「實際儲存的 HTML 結構」之間的差異。
* 任何 Gutenberg 自訂區塊（特別是包含 JSON attributes 的區塊），都應優先以 `save()` 的規範來產出 HTML，而非比照前端渲染結果。

---

## 標籤

- `Rank Math`
- `Gutenberg`
- `FAQPage`
- `區塊驗證`
- `Node.js`
- `SEO`

---

# WPML 多語系下佈景主題自訂版面翻譯失效之替代方案

> 當 WPML、Astra Custom Layout 與 Elementor 三者結合導致英文版自訂版面無法正常翻譯或編輯時，如何使用短代碼與 CSS 語系選擇器快速修復排版。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-03-30-wpml-astra-custom-layout-translation-issue/

整理日期：2026-03-30

## 狀況

在雙語網站中，中文版的「麵包屑（Breadcrumb）」與「子分類頁籤（Tabs）」是由自訂版面功能（如 Astra Custom Layouts）透過 Hook 機制與 Elementor 模板，統一在內容區外面注入。

然而，當切換到英文版子網頁時，該 Hook 注入的區塊完全消失，導致英文版頁面缺少頁籤導覽與麵包屑。嘗試使用 Elementor 編輯英文版的自訂版面翻譯時，會因為相容性衝突而出現系統錯誤，無法正常存檔。

---

## 先拆成幾層看

* 檢查 WPML 的「轉譯管理（Translation Management）」中，該自訂版面 Post Type（如 `astra-advanced-hook`）是否有正確開啟翻譯。
* 評估排查 WPML + Layout Hook + Page Builder 三者衝突的核心成本，是否值得為此花費數天 debug。
* 是否有更務實、不依賴版面 Hook 的替代方案，能直接在英文頁面內容中呈現相同的結構。

---

## 最後發現

WPML、佈景自訂版面（Astra Custom Layout）與頁面編輯器（Elementor）三者在底層的 Hook 優先順序有相容性瓶頸。在翻譯版本中，Elementor 無法正常初始化 Hook 區塊的資料。

最簡單且穩健的替代方案是：**避開 Hook 機制，直接在英文頁面的區塊編輯器（Gutenberg）內置入對應的 Shortcode，並利用 CSS 針對語系進行排版微調。**

---

## 修正方式

### 1. 英文版頁面結構調整
在英文版 FAQ 或子頁面的區塊編輯器中，切換至「程式碼編輯器」，直接寫入以下結構（不經過 Hook，直接由 Gutenberg 渲染）：

```html
<!-- wp:shortcode -->
[rank_math_breadcrumb]
<!-- /wp:shortcode -->

<!-- wp:shortcode -->
[custom_tabs_shortcode parent_id="XXXX" parent_title="All"]
<!-- /wp:shortcode -->

<!-- wp:rank-math/faq-block -->
...FAQ 區塊內容...
<!-- /wp:rank-math/faq-block -->
```

### 2. 針對英文版語系加入 CSS 對齊樣式
因為這些元件現在被置於 `entry-content` 內部（不像中文版在外部），需要使用 CSS 的 `:lang(en)` 虛擬類別選擇器，將英文版的寬度與邊距調整至與中文版一致：

```css
/* === 英文版頁面麵包屑與頁籤對齊修正 === */

:lang(en) .entry-content > .rank-math-breadcrumb {
  max-width: 1120px;
  margin: 40px auto 0;
  padding: 0 20px;
}

:lang(en) .entry-content > .app_list {
  max-width: 1120px;
  margin: 16px auto 0;
  padding: 0 20px;
}
```

---

## 不建議先做的事

* 不要強行在英文版頁面上用 Elementor 重新建立整套 Layout，這會導致中文與英文版面的程式碼冗餘度提高，且容易因為版面外掛更新而再次壞掉。
* 不要為了修復此問題去停用或重新安裝 WPML 的核心組件，相容性衝突通常在外掛底層，重新安裝無法解決。

---

## 下次遇到可以先整理什麼

* 發生衝突的翻譯頁面語系與網址。
* 麵包屑與自訂選單元件是否具有對應的 WordPress Shortcode（短代碼）。
* 檢查主題在該頁面渲染的 `<body>` 標籤是否帶有語系相關的 Class（如 `:lang(en)` 或 `.translatepress-en`、`.lang-en`），便於 CSS 精準定位。

---

## 標籤

- `WPML`
- `Astra`
- `多語系`
- `Shortcode`
- `CSS`
- `Elementor`

---

# 英文版選單消失，最後發現 Header JS 多包 script

> 雙語站其中一個語系的選單消失，最後發現是 Header 自訂程式碼被重複包 script，造成前端 JS 解析錯誤。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-03-31-language-menu-script-error/

整理日期：2026-03-31

## 狀況

英文版首頁的導航選單整個消失，中文版正常。

清除快取後還是一樣。這種狀況很容易讓人先往 WPML、選單設定或快取外掛去查。

但只要同一個網站的不同語系表現不同，就要把語系條件、Header 輸出和自訂程式碼一起看。

## 先拆成幾層看

我會先拆成幾層：

- 選單 HTML 是否有輸出。
- 選單是沒輸出，還是輸出了但被 CSS 隱藏。
- body class 是否卡在手機版 breakpoint 狀態。
- 前端 console 有沒有 JS 錯誤。
- 最近有沒有針對特定語系加過 Header JS。
- Autoptimize 或其他最佳化外掛有沒有把導航 JS 打包在一起。

選單消失不一定是選單設定壞掉。很多時候是前端 JS 在更前面就炸掉，後面的導航邏輯沒有正常跑完。

## 最後發現

Header 自訂程式碼欄位裡，放了一段修正 Logo 連結的 JS。

問題是那個欄位本身會自動包一層 `script`，但填進去的內容又自己帶了 `<script>...</script>`。

結果輸出變成類似：

```html
<script><script>document.addEventListener(...)</script></script>
```

瀏覽器解析時遇到內層 `<script>`，就出現 JS 錯誤。

後續被最佳化外掛打包的導航相關 JS 沒有正常執行，導致 body class 沒有切回桌機狀態。再加上原本 CSS 有隱藏某個 header 區塊，最後桌面上兩組選單都看不到。

中文版正常，是因為那段 Logo JS 只在英文路徑執行，或不同語系輸出的 Header 條件不一樣。

## 修正方式

把 Header 欄位裡的內容改成純 JS，不要自己再包 `<script>`。

修正前的方向像這樣：

```html
<script>
document.addEventListener('DOMContentLoaded', function () {
  // ...
});
</script>
```

修正後應該只保留：

```js
document.addEventListener('DOMContentLoaded', function () {
  // ...
});
```

欄位會自己輸出正確的單層 `script`。

改完後，再清除最佳化外掛和前端快取。

## 不建議先做的事

不要只看中文版正常，就認為整站沒問題。

也不要一開始就重建選單。這類問題如果 console 已經有 JS 錯誤，先修前端錯誤比重建選單更重要。

另外，最佳化外掛不是根本原因，但它會放大問題。一個 inline script 壞掉，可能讓後面一串打包後的功能看起來都壞掉。

## 下次遇到可以先整理什麼

- 問題出現在哪個語系。
- 無痕視窗是否重現。
- console 第一個 JS 錯誤是什麼。
- Header / Footer 自訂程式碼最近改過什麼。
- 欄位是否需要自己包 `<script>`。
- 清除快取後是否還存在。
- body class 是否停在錯誤 breakpoint。

雙語站排查時，兩個語系都要測。單一語系正常，不代表共用 Header 沒問題。

## 標籤

- `WPML`
- `Astra`
- `Header JS`
- `Autoptimize`
- `選單`
- `多語系`

---

# 關於頁面全寬打破邊框排版與聯絡表單信任文案優化

> 解決個人官網在局部寬度版面下，如何利用 CSS Breakout 技巧與主題設定讓區塊背景全寬延伸，並優化聯絡表單引導文案以提高點閱信任。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-04-06-about-page-breakout-layout-and-contact-trust-copy/

整理日期：2026-04-06

## 狀況

1. **關於頁面背景被限縮**：重做「關於我」頁面時，使用了 GenerateBlocks V2 區塊排版，設計了不同區塊背景顏色交替（例如淺灰、純白、深藍漸層）。然而，因為全站 CSS 限制了主要內容區最大寬度（`.page .site-main { max-width: 42rem }`），導致背景色無法向左右延伸至螢幕邊緣，看起來像是一格一格的被框住的盒子。
2. **聯絡表單過於單調**：聯絡頁面原本只有一個裸露的表單，沒有任何標題或導言，顯得冷冰冰，可能降低訪客填寫的意願。

---

## 先拆成幾層看

* **佈局限制**：檢視全站 CSS 設定中是否有對主要內容容器（如 `.site-main` 或 `.entry-content`）設定了最大寬度限制。
* **全寬延伸（Breakout）技巧**：如何在不修改全站 CSS 的前提下，讓特定頁面的主要區塊能夠突破父容器的寬度限制，實現全寬（Full Width）滿版效果。
* **文案結構**：如何透過溫和、口語化且實務感重的導言，建立品牌與讀者之間的信任，提高表單諮詢率。

---

## 最後發現

全站的文字閱讀流寬度被限制在 `42rem`（約 672px），這對純文字閱讀非常舒適，但對於帶有背景圖或背景色交替的雜誌風／Landing Page 頁面，這種限制會導致背景色無法填滿螢幕。

要解決這個限制，除了解除該頁面的 `max-width` 限制外，還能透過 CSS `calc()` 進行「容器突破（Breakout）」。而聯絡表單則需要補上具體的「回覆時間承諾」和「歡迎訊息」，消除訪客送出表單後的焦慮感。

---

## 修正方式

### 1. 關於頁面全寬與 Breakout 排版

* **第一步**：將該頁面在編輯器中的佈景主題 Layout 設定改為 **Full Width**。
* **第二步**：使用 CSS Snippet 針對該頁面 ID 覆寫主要內容區的最大寬度限制：
  ```css
  /* 移除特定頁面 site-main 的最大寬度限制 */
  .page-id-3235 .site-main {
      max-width: none !important;
      margin: 0 !important;
  }
  ```
* **第三步**：在 GenerateBlocks 的容器（Container）上套用 CSS Breakout 屬性，使其寬度強行拉伸至 100% 視窗寬度（`100vw`），並自動向左位移補償：
  ```css
  /* 突破父容器限制實現全寬背景 */
  width: 100vw;
  margin-left: calc(-50vw + 50%);
  box-sizing: border-box;
  ```

### 2. 聯絡頁面引導文案優化

在原本的聯絡表單（如 Fluent Forms 短代碼）上方，新增以下結構的文字區塊，置中排版：

* **H2 標題**：「有問題？直接說。」
* **導言**：「不管是網站出了狀況、想聊合作、還是單純有個問題想問，都歡迎寫過來。我通常 1-2 個工作天內會回。」

這段文字明確表明了寫信的範疇與預期的回覆時程，給予訪客清晰的安全感。

---

## 不建議先做的事

* 不要為了做一個全寬頁面，就去改動全站的 `.site-main` 寬度設定，這會導致全站所有文章頁面的文字行寬變得太寬，破壞部落格的閱讀體驗。
* 撰寫聯絡導言時，不要使用「我們將竭誠為您服務」或「我們將盡快與您聯絡」等空泛的 AI 常規套話，應給予具體的工作天時間（如 1-2 個工作天）。

---

## 下次遇到可以先整理什麼

* 頁面在 WordPress 中的 Page ID，以便在 CSS 中寫入專屬的 Scope 規則（如 `.page-id-XXXX`）。
* 目標區塊內縮 padding 與字級大小（利用 `clamp()` 進行響應式調整）。
* 聯絡表單的簡短說明，應包含：誰會收到、大概多久會回覆、可以問哪些問題。

---

## 標籤

- `GenerateBlocks`
- `CSS Breakout`
- `Fluent Forms`
- `聯絡表單`
- `文案`
- `版面`

---

# 銷售漏斗頁首與主視覺間隙排查與版面設定優化

> 解決 WordPress 銷售漏斗頁面中 Header 與 Hero 區塊出現非預期縫隙的問題，避開負邊距（negative margin）的 CSS Hack，改以佈景主題分頁排版設定處理。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-04-06-funnel-header-hero-gap-issue/

整理日期：2026-04-06

## 狀況

在維護一個使用 WPFunnels 外掛建立的產品銷售漏斗落地頁（Landing Page）時，發現網頁頁首（Header）與主視覺區塊（Hero Section）之間出現了一條莫名的空白間隙。

---

## 先拆成幾層看

* **CSS 樣式層**：檢查是否有全域或特定的 CSS Snippet 影響了該銷售頁的外層容器，或者是邊距（margin/padding）設定不一致。
* **主題設定層**：佈景主題（如 GeneratePress）針對一般頁面或自訂文章類型（Post Type，如 `wpfunnel_steps`）的預設內容容器內縮（Content Padding）設定。
* **區塊層**：Hero 區塊內部是否為了補償間距，使用了負邊距（Negative Margin）等排版補丁。

---

## 最後發現

經過瀏覽器開發者工具（DevTools）逐層檢視：
1. 原本該頁面的 Hero 區塊內建了 `margin-top: -128px` 的 CSS 補丁。這是建置頁面時，為了抵消 GeneratePress 主題預設「全站內容上方內縮（Content Padding-top）」所做的手動補償。
2. 後續因佈景主題更新或調整了全域的 Content Padding 數值，導致預設內縮與負邊距的數值不再精準匹配，從而產生了數個像素的間隙。
3. 曾試圖在全域 CSS 中強制將該頁面的 padding/margin 歸零，但此舉過於激進，反而破壞了原本正常固定的 Header 結構。

---

## 修正方式

捨棄脆弱的負邊距補丁，改以 WordPress 佈景主題內建的單頁覆寫功能進行標準化調整：

1. **清除 CSS 補丁**：進入頁面編輯器，選取 Hero 區塊，將原本手動設定的 `margin-top: -128px` 負邊距清除，還原為 `0`。
2. **單頁覆寫主題設定**：在該銷售頁的編輯畫面右側，找到佈景主題的版面設定區塊（以 GeneratePress 為例，為 **Layout** 面板）：
   * 將 **Content Padding** 的上方（Top）數值設為 `0`。此設定會覆蓋全站預設的上方內縮，且僅在該頁面生效。
3. **區塊微調**：直接在 Gutenberg 區塊編輯器中，為 Hero 區塊設定上方內距為 `3rem`（或依視覺微調），確保與其他頁面的視覺間距一致。

此做法無須撰寫任何 custom CSS 程式碼，也不會破壞全站樣式。

---

## 不建議先做的事

* 避免直接在全域 CSS Snippet 中強行使用 `!important` 歸零 `body.single-wpfunnel_steps` 的所有 padding 與 margin。這雖然能消除縫隙，但會連帶讓 Header 的背景溢出或導致選單文字被 Hero 區塊壓住。
* 不要使用額外的外掛來強制隱藏頁首，這對需要保留基本導覽的漏斗頁面不切實際。

---

## 下次遇到可以先整理什麼

* 出現間隙頁面的 Body Class（例如一般頁面是 `.page`，特殊外掛頁面可能是 `.single-wpfunnel_steps`）。
* 在 DevTools 點選 Hero 區塊，看其樣式表（Styles Panel）中是否有負數的 `margin-top`，確認是否存在前人留下的排版補丁。
* 確認所使用的佈景主題是否支援「單頁版面設定（Page Layout Settings）」功能，優先以主題內建的關閉 headline、調整 padding 功能處理。

---

## 標籤

- `GeneratePress`
- `WPFunnels`
- `Content Padding`
- `CSS Hack`
- `銷售頁`
- `排查`

---

# 全站間距不一致，CSS 從 Additional CSS 拆出去

> 各頁 header 到內容的距離不一樣，最後把基礎間距交給佈景主題設定，頁面專屬 CSS 改用條件載入。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-04-06-site-spacing-css-snippets/

整理日期：2026-04-06

## 狀況

同一個網站裡，不同頁面的內容頂端間距不一致。

首頁、文章頁、商品頁、彙整頁和訂閱頁，各自看起來都還可以，但放在一起看就不整齊。

同時，Additional CSS 已經累積到很肥。很多頁面專屬樣式每一頁都載入，之後要找一段 CSS 是從哪裡來，也越來越難。

## 先拆成幾層看

我會先拆成幾層：

- 佈景主題本身有沒有全站 content padding。
- 第一個區塊自己有沒有 padding-top。
- Query Loop、商品列表、文章模板是不是又各自加了一層。
- Additional CSS 裡是否混了全站樣式和頁面專屬樣式。
- 哪些 CSS 應該全站載入，哪些只該在特定頁載入。

這種問題不能只看 CSS 原始碼。要用 DevTools 看 computed spacing，因為實際距離通常是好幾層 padding 疊出來的。

## 最後發現

間距不一致的原因，是佈景主題給了一層基礎 padding，各頁第一個區塊又各自加了不同 padding。

久了之後，每一頁都用自己的方式補空間。

CSS 管理也有同樣問題。大量頁面專屬 CSS 全部塞在 Additional CSS 裡，短期方便，長期會變成不好維護的混合檔。

## 修正方式

把全站內容間距交回佈景主題設定，讓它成為主要來源。

其他頁面第一層區塊如果只是為了補頂端距離，就把 padding 拿掉或調回 0。

CSS 管理則拆成幾個條件載入的 Code Snippets：

- 全站共用 CSS。
- 文章內頁 CSS。
- 彙整頁 CSS。
- 商品頁 CSS。
- 帳號頁 CSS。
- 訂閱頁 CSS。
- About 頁 CSS。

概念像這樣：

```php
add_action('wp_head', function () {
    if (!is_single()) return;
    ?>
    <style id="css-single-post">
      /* 只給文章內頁的 CSS */
    </style>
    <?php
});
```

這樣每一段 CSS 的責任比較清楚，也不會所有頁面都載入不需要的樣式。

## 不建議先做的事

不要看到哪一頁太擠，就直接再加一段 margin 或 padding。

這樣短期會變好，但幾頁加起來很快會互相打架。

也不要讓 Additional CSS 長期變成所有東西的垃圾桶。超過一定量之後，維護成本會比拆開還高。

## 下次遇到可以先整理什麼

- 各頁 header 到第一段內容的實際距離。
- 距離是哪些 padding / margin 疊出來的。
- 哪些樣式是全站共用。
- 哪些樣式只屬於單一頁面或單一模板。
- CSS 目前放在 Additional CSS、Code Snippets、區塊設定，還是佈景主題設定。

間距要先決定「主控權」在哪裡。沒有主控權，每頁都會變成特例。

## 標籤

- `GeneratePress`
- `Code Snippets`
- `Additional CSS`
- `間距`
- `CSS 管理`
- `版面整理`

---

# 選單消失，最後發現是 Autoptimize 快取檔案 404

> WordPress 前台選單在無痕視窗消失，原因不是選單被刪掉，而是 Autoptimize 打包後的 JS 快取檔案不存在，導致佈景主題導航邏輯沒有執行。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-04-09-autoptimize-cache-menu-missing/

整理日期：2026-04-09

## 狀況

有一個 WordPress 網站，在一般瀏覽器看起來正常，但用無痕視窗打開時，整個導航選單消失。

頁首還在，Logo、電話、Email 和搜尋按鈕都看得到，但主選單不見了。

這種情況很容易讓人先懷疑是選單設定、佈景主題或多語系問題。但這次真正的起點不是選單本身。

## 先拆成幾層看

我會先拆成幾層：

- 選單 HTML 是否還在頁面裡。
- CSS 是不是把選單藏起來。
- 佈景主題切換桌機 / 手機版的 JS 有沒有正常跑。
- 是否只有無痕或新訪客會遇到。
- 快取外掛、伺服器快取、CDN 快取是否不同步。

如果一般瀏覽器正常、無痕不正常，通常要先往快取或前端資源載入問題查。

## 最後發現

Autoptimize 打包後的 JS 檔案回 404。

那個 JS bundle 裡面包含佈景主題的導航邏輯。JS 沒載入時，佈景主題原本用來判斷桌機 / 手機選單的 class 沒有被移除，結果 CSS 繼續把選單區塊藏起來。

一般瀏覽器之所以正常，是因為瀏覽器還留著舊的可用 JS 快取。

無痕視窗沒有舊快取，所以直接載入到不存在的新檔案，選單就消失。

## 修正方式

這次不是單純清快取而已。

因為同一個網站已經第二次壞在 Autoptimize 打包 / 快取檔案，所以最後決定移除 Autoptimize。

原因是網站本來已經有：

- CDN 層快取。
- 伺服器層頁面快取。
- 主機端快取機制。

Autoptimize 在這個堆疊裡只做了很有限的 JS 處理，卻增加了一個故障點。

處理方式是：

1. 停用並刪除 Autoptimize。
2. 清伺服器快取。
3. 清 CDN 快取。
4. 用無痕視窗和前端 console 驗證沒有 JS 404。
5. 確認選單在新訪客狀態下正常顯示。

## 不建議先做的事

不要一開始就重建選單。

也不要只在自己平常用的瀏覽器檢查。這種快取問題很常出現「我看正常、別人看壞掉」。

如果同一個效能外掛第二次造成前台核心功能故障，就不要只把它當成偶發事件。要回頭看整個快取堆疊是不是太複雜。

## 下次遇到可以先整理什麼

- 一般視窗和無痕視窗是否都會壞。
- console 有沒有 JS 404。
- Network 裡是否有快取檔案不存在。
- 選單 HTML 是否仍在頁面裡。
- body class 是否異常停在手機版狀態。
- 網站目前有幾層快取：外掛、主機、Varnish、CDN。

這種問題不要只看 WordPress 後台。前端實際載入了哪些 JS / CSS，比後台設定更重要。

## 標籤

- `Autoptimize`
- `快取`
- `選單消失`
- `Astra`
- `JS 404`
- `CDN`

---

# CSS 媒體查詢未閉合導致後續樣式遭吞噬排查

> 解決因自訂 CSS 中媒體查詢（@media）括號未正確閉合，導致新加入的 CSS 規則被瀏覽器誤判定為行動版專用、而在電腦版失效的經典排版問題。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-04-19-css-unclosed-media-query-swallowed-styles/

整理日期：2026-04-19

## 狀況

在「外觀 > 自訂 > 附加的 CSS」中貼入了用來修正側邊欄小工具項目符號的 CSS 程式碼。但在前端測試時，發現該樣式**僅在手機版（窄螢幕）下生效，在電腦版（寬螢幕）下完全沒有作用**。經查，該 CSS 規則並無包裹在任何媒體查詢（Media Query）中。

---

## 先拆成幾層看

* **瀏覽器層**：使用 DevTools 檢查該側邊欄元素在電腦版上的 Computed Styles，確認是否有該 CSS 宣告。如果完全沒有，代表樣式根本沒被瀏覽器解析，或被其他規則排除。
* **原始碼檢視**：直接抓取網頁產生的 `<style id="wp-custom-css">` 內聯樣式表，數一下大括號 `{` 與 `}` 的數量是否平衡。
* **語法結構**：確認附加 CSS 檔案中，前面的樣式宣告是否有語法錯誤（例如未閉合的括號）。

---

## 最後發現

問題源於附加 CSS 檔案中，前人留下的程式碼包含了**三個未正確閉合的媒體查詢（`@media (max-width: 544px) {`）**。

由於缺乏閉合大括號 `}`，瀏覽器在解析 CSS 時，會將後續所有的 CSS 規則（包含我們新貼入的側邊欄樣式）全部「吞」進去，判定為最內層 `@media (max-width: 544px)` 的一部分。因此，這些樣式只有在視窗寬度小於等於 544px 時才會生效，電腦版則完全被忽略。

---

## 修正方式

必須整理附加 CSS 中所有混亂的媒體查詢，將其改為平行的獨立開關結構，並將全域通用的樣式移出媒體查詢之外（放在最外層）：

### 修改前（混亂且嵌套的結構）

```css
/*-- 產品內頁描述樣式 --*/
div#tab-description h1 { font-size: 16.5px; }
@media(max-width:544px){
  div#tab-description h1 { font-size: 15.5px!important; }
  div#tab-description h2 { font-size: 16.5px; }
  @media(max-width:544px){
    div#tab-description h2 { font-size: 15px!important; }
    /*-- 文章內頁樣式 --*/
    @media(max-width:544px){
      .entry-content h1 { font-size: 15px!important; }
      .entry-content h2 { font-size: 16px; }
      @media(max-width:544px){
        .entry-content h2 { font-size: 15px!important; }
        /* 側邊欄樣式被意外包在 4 層 media query 裡面 */
        .widget_recent_entries ul { list-style: disc !important; }
      }
    }
  }
}
```

### 修改後（扁平且正確閉合的結構）

```css
/* 1. 全域樣式（無媒體查詢包裝，全視窗尺寸生效） */
div#tab-description h1 { font-size: 16.5px; }
div#tab-description h2 { font-size: 16.5px; }
.entry-content h2 { font-size: 16px; }

/* 側邊欄「最新文章」小工具 — 全域加回項目符號 */
.widget_recent_entries ul {
    list-style: disc !important;
    padding-left: 1.25em !important;
    margin-left: 0;
}
.widget_recent_entries ul li {
    list-style: disc !important;
    margin-bottom: 0.5em;
}

/* 2. 行動版專用樣式（獨立且正確閉合） */
@media(max-width:544px){
    div#tab-description h1 { font-size: 15.5px!important; }
    div#tab-description h2 { font-size: 15px!important; }
    .entry-content h1 { font-size: 15px!important; }
    .entry-content h2 { font-size: 15px!important; }
}
```

---

## 不建議先做的事

* 不要因為電腦版沒生效，就盲目在新增的 CSS 規則中加上 `@media (min-width: 545px) { ... }`。這只會讓語法更混亂，且治標不治本，底層括號未閉合的問題依舊存在。
* 不要將大量 CSS 寫在單一長行中，這會極度增加排查括號配對的難度。

---

## 下次遇到可以先整理什麼

* 發生樣式失效時，可以先將新加入的 CSS 程式碼搬移到「附加的 CSS」**最頂端（第一行）**。如果搬到最頂端後電腦版立刻生效，代表後面有其他未閉合的 `@media` 或 `{` 在干擾。
* 在本地端編輯器（如 VS Code）中打開整段 CSS，語法檢查器會自動標示括號配對錯誤的行數。

---

## 標籤

- `CSS`
- `媒體查詢`
- `自訂CSS`
- `排查`
- `Gutenberg`

---

# Popup 短代碼直接露在前台

> 前台出現 popup 外掛短代碼，最後發現舊外掛已移除，但內容裡的短代碼還留著，需要把舊 popup 對應到新外掛。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-04-23-popup-shortcode-migration/

整理日期：2026-04-23

## 狀況

多個頁面前台直接露出 popup 短代碼。

有些位置肉眼看得到，有些藏在白字或隱藏 widget 裡，前台看起來不明顯，但 HTML 裡仍然存在。

這種狀況會讓頁面看起來很像亂碼，也很容易被搜尋引擎或 AI 摘要讀到不該出現的技術字串。

## 先拆成幾層看

我會先拆成幾層：

- 短代碼是哪個外掛留下的。
- 外掛還在不在。
- 舊 popup 的內容還能不能從資料庫或備份找回來。
- 短代碼存在於 `content.raw`，還是 Elementor 的 `_elementor_data`。
- 有沒有智慧引號、跳脫引號或不同短代碼格式。
- 哪些殘留是真的前台可見，哪些只是孤兒模板或全裝置隱藏 widget。

只用前台肉眼看不夠。Elementor 頁面要同時查內容欄位和 Elementor data。

## 最後發現

舊 popup 外掛已經不在，但頁面內容裡的短代碼沒有清掉。

因為沒有外掛解析，WordPress 就把短代碼當純文字輸出。

更麻煩的是，舊 popup 的 post type 名稱不一定等於外掛名稱。直覺用外掛 slug 去查，可能什麼都查不到。

另外，同一段短代碼可能有不同引號形式：

- 一般直引號。
- HTML entity 形式的智慧引號。
- Elementor JSON 裡的 escaped 引號。

所以替換時不能只抓最單純的 `id="123"`。

## 修正方式

這類遷移我會用比較保守的流程：

1. 先掃描全站短代碼分佈。
2. 從備份或資料庫找回舊 popup 的標題、內容和按鈕文字。
3. 在新 popup 外掛裡重建對應內容。
4. 建立舊 ID 到新 ID 的 mapping。
5. 批次替換 `content.raw` 和 Elementor data。
6. 替換前保留快照，方便回復。
7. 替換後重新掃描確認剩下哪些殘留。

替換後的方向不是保留舊短代碼，而是改成新 popup 外掛能辨識的連結或觸發元素。

例如概念上會變成：

```html
<a class="sg-popup-id-NEWID popup-link" href="#">按鈕文字</a>
```

實際 class 要看當下使用的新 popup 外掛。

## 不建議先做的事

不要只在可見頁面手動刪。

Elementor library、隱藏 widget、舊模板裡可能還有殘留。手動刪幾個肉眼看得到的位置，之後還是會漏。

也不要直接全站 regex 亂替換。舊 popup 的內容、按鈕文字和新 popup ID 如果沒有先整理好，很容易把原本可用的互動全部變成死連結。

## 下次遇到可以先整理什麼

- 前台看到的短代碼格式。
- 舊外掛名稱和可能的 post type。
- 備份裡是否還有舊 popup 內容。
- 短代碼出現在哪些 post type。
- 是內容欄位、Elementor data，還是兩邊都有。
- 哪些殘留前台可見，哪些是孤兒模板。
- 新 popup 外掛的觸發 class 或短代碼格式。

Popup 遷移不是只換外掛。真正麻煩的是舊內容和新觸發方式要對得起來。

## 標籤

- `Popup`
- `短代碼`
- `Elementor`
- `REST API`
- `資料庫備份`
- `內容遷移`

---

# 文章卡片閱讀更多按鈕對齊與絕對定位排版

> 解決因文章摘要長度不一導致「閱讀更多」按鈕在卡片中高低起伏的問題，利用 CSS 絕對定位（absolute）將按鈕固定釘在卡片右下角。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-04-27-elementor-post-grid-readmore-absolute-position/

整理日期：2026-04-27

## 狀況

首頁的「精選文章」區塊中，每個文章卡片底部的「閱讀更多」按鈕出現排版瑕疵：
1. **按鈕高低不一**：因為每篇文章的摘要（Excerpt）文字長度不同，導致按鈕的垂直位置在各卡片中參差不齊、浮動不定。
2. **樣式突兀**：按鈕顯示為滿版的白色矩形框，文字置中且佔滿整張卡片寬度，與整體設計不搭。業主希望改為純文字、無背景色，且統一固定在卡片的右下角。

---

## 先拆成幾層看

* **外掛與結構**：確認該文章格點（Post Grid）是由哪一個 Elementor 擴充外掛（如 UAEL）渲染的，並檢視其輸出的 Class 名稱。
* **排版模型**：若使用 Flex 或 Block 排版，摘要長度的差異必然會推擠下方的按鈕。是否能透過卡片容器設定 `relative`，並將按鈕設為 `absolute` 定位，使其徹底脫離一般文件流（Normal Flow）。
* **樣式覆寫**：如何在不影響全站其他按鈕的前提下，針對該特定網格元件進行精準的局部 CSS 覆寫。

---

## 最後發現

該精選文章區塊是使用 Ultimate Addons for Elementor (UAEL) 的 Posts widget 製作：
* 該外掛預設將按鈕設為 Full Width，且背景色綁定了全域全站顏色（Global Color），因而產生滿版白條。
* 傳統上使用 `margin-top: auto` 或 Flexbox 來推擠按鈕，在此特定外掛的巢狀 DOM 結構下很容易失效或被外掛內建的 CSS specificity 覆蓋。
* 最直接且相容性最高的解法，是將卡片背景容器設為相對定位（`relative`），並將按鈕以絕對定位（`absolute`）釘在右下角，同時在內容區下方預留適當的內縮（`padding-bottom`）以防文字重疊。

---

## 修正方式

在 Elementor 的該 Posts widget 編輯面板中，切換至 **進階 > 自訂 CSS**（此處的 `selector` 會自動 Scope 限制在該 widget 中，不影響全站）：

### 修正後的 CSS 代碼

```css
/* 1. 將卡片背景包裝容器設為相對定位，做為絕對定位的錨點 */
selector .uael-post__bg-wrap {
    position: relative;
}

/* 2. 內容區塊下方預留足夠的高度空間，避免摘要文字壓到右下角按鈕 */
selector .uael-post__content-wrap {
    padding-bottom: 48px !important;
}

/* 3. 將閱讀更多按鈕強制釘在卡片右下角，並清除背景框與寬度限制 */
selector .uael-post__read-more.elementor-button {
    position: absolute !important;
    bottom: 16px !important;
    right: 16px !important;
    background-color: transparent !important;
    width: auto !important;
    margin: 0 !important;
    padding: 0 !important;
    display: inline-block !important;
}
```

---

## 不建議先做的事

* 不要試圖用 `text-align: right` 去對齊按鈕文字，因為按鈕本身若被設定為寬度 100%（Full Width），對齊按鈕內部的 span 文字無法改變按鈕本身的白色矩形背景。
* 避免為了對齊按鈕而強制截斷所有文章的摘要字數為相同長度，這會限制編輯在撰寫文章導言時的彈性。

---

## 下次遇到可以先整理什麼

* 該網格元件中，卡片最外層的包裹容器 Class（例如 `.uael-post__bg-wrap`）與按鈕本體的 Class。
* 利用 DevTools 檢查該按鈕是否有設定全域顏色綁定，或是在 Elementor 編輯器中點擊按鈕顏色旁的「地球」圖示將其切換為「自訂（鉛筆）」以清除預設色彩。
* 設計卡片式排版時，只要有「按鈕需固定在底部」的需求，**「容器相對定位 + 按鈕絕對定位 + 內容區下方補 padding」**是最穩健的萬用公式。

---

## 標籤

- `Elementor`
- `UAEL`
- `絕對定位`
- `卡片排版`
- `CSS`
- `按鈕`

---

# TablePress 圖示沒有置中

> 版本比較表裡的打勾打叉圖示靠左，最後發現 text-align 對 block 圖片沒用，要直接處理圖片本身。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-04-27-tablepress-icon-center/

整理日期：2026-04-27

## 狀況

TablePress 表格裡的打勾、打叉圖示沒有置中。

表格是版本比較型內容，左邊是功能名稱，右邊幾欄是不同版本是否支援。圖示如果偏左，整個表格看起來就很不整齊。

這種問題看起來很小，但對比較表很傷閱讀。

## 先拆成幾層看

我會先拆成幾層：

- 是整個 cell 沒置中，還是圖片本身沒置中。
- 圖片是 inline、inline-block，還是 block。
- 圖片有沒有 WordPress 自動加的 `aligncenter`。
- TablePress 有沒有表格專屬 class 可以限定範圍。
- 第一欄長文字是否應該維持靠左。

不能只想著「全部 `text-align: center` 就好」。比較表第一欄如果也置中，長文字會很難讀。

## 最後發現

TablePress 的 `td` 預設是靠左。

一開始對 `td` 加 `text-align: center`，可以處理文字，但圖片仍然沒有穩定置中。

原因是圖示圖片帶有 WordPress 的置中 class，實際上常會是 `display: block`。`text-align` 對 block 元素不生效。

所以關鍵不是只處理父層 cell，而是要直接處理圖片。

## 修正方式

在 TablePress 的自訂 CSS 裡，針對特定表格 ID 加 scoped CSS。

概念像這樣：

```css
.tablepress-id-X td {
  text-align: center;
  vertical-align: middle;
}

.tablepress-id-X td:first-child {
  text-align: left;
}

.tablepress-id-X td img {
  display: block;
  margin-left: auto;
  margin-right: auto;
  float: none;
}
```

這樣做有幾個好處：

- 只影響指定表格。
- 第一欄功能文字保留靠左。
- 圖片不依賴 `aligncenter`。
- 就算佈景主題對圖片有其他設定，也比較不容易跑掉。

## 不建議先做的事

不要把全站所有 TablePress 表格都一起改。

也不要只用 `td:has(img)` 就以為解決了。`has()` 可以讓選擇器更精準，但如果根本問題是圖片是 block 元素，還是要對圖片本身處理。

## 下次遇到可以先整理什麼

- TablePress 表格 ID。
- 哪些欄位要置中，哪些欄位要靠左。
- 圖片目前的 `display` 和 `float`。
- 圖片是否有 `aligncenter`。
- CSS 應該放在 TablePress 自訂 CSS，還是全站 CSS。
- 改完後是否需要清快取。

小表格問題也要 scope。表格越多，越不能用全站選擇器硬改。

## 標籤

- `TablePress`
- `CSS`
- `表格`
- `圖片置中`
- `GeneratePress`
- `快取`

---

# Logo 點第二次跑到 reCAPTCHA 管理頁

> Logo hover 時出現奇怪的 reCAPTCHA 管理網址，最後發現是全站 popup 裡的表單初始化了 reCAPTCHA iframe。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-05-01-logo-click-recaptcha-migrate/

整理日期：2026-05-01

## 狀況

首頁左上角 Logo 出現很怪的點擊行為。

滑過 Logo 時，瀏覽器狀態列顯示的不是首頁網址，而是 Google reCAPTCHA 的管理頁。

第一次點 Logo 可能正常，第二次點就跑到 reCAPTCHA 相關頁面。

同時還發現 Logo 圖片看起來很大，但實際可點擊範圍只有中間一小條。

## 先拆成幾層看

我會先拆成幾層：

- Logo 的 `<a>` href 是否真的被改掉。
- 是整張圖都異常，還是只有某些座標異常。
- Logo 上方是否有透明 iframe 或 popup 元素。
- 頁面有沒有全站載入的 popup。
- popup 裡是否放了表單、reCAPTCHA、Turnstile 或其他第三方 iframe。
- Logo 的 `<a>` 實際 hit area 是否跟圖片大小一致。

這類問題如果只看原始 HTML，常常找不到。因為有些內容是在第三方 iframe 裡，server HTML 和一般 DOM dump 不一定看得到。

## 最後發現

首頁載入了一個全站 popup。

popup 裡放了表單，表單使用 reCAPTCHA v2。即使 popup 看起來沒有開，表單仍然初始化，reCAPTCHA iframe 也會被插入頁面。

Google 在 reCAPTCHA widget 裡放了遷移提醒連結。這個連結在 cross-origin iframe 裡，所以直接 grep 主頁 HTML 找不到。

再加上 popup 的 click handler 和 Logo 點擊範圍異常，最後讓部分 Logo 點擊被導到 reCAPTCHA 相關連結。

Logo 點擊範圍小，則是另一個 CSS 問題。`custom-logo-link` 是 inline 元素，line-height 讓 `<a>` 高度比圖片小，圖片視覺上溢出，但實際可點擊區域沒有跟著變大。

## 修正方式

主問題的方向是把表單驗證從 reCAPTCHA v2 換成 Cloudflare Turnstile。

如果網站本來就走 Cloudflare，Turnstile 通常比較乾淨，也比較不會出現這種 Google widget 內部連結干擾。

Logo 點擊範圍則用 CSS 修：

```css
.custom-logo-link {
  display: inline-block;
  line-height: 0;
}

.custom-logo-link .custom-logo {
  display: block;
}
```

這樣 `<a>` 的高度會跟 Logo 圖片一致，整張 Logo 都能點。

## 不建議先做的事

不要只改 Logo href。

如果 href 本身沒錯，但 click 被 iframe 或 popup handler 干擾，改 href 不會解決根本問題。

也不要只用 curl 或原始碼搜尋。遇到第三方 iframe，要用瀏覽器 devtools 或 headless browser 去看 frame。

## 下次遇到可以先整理什麼

- Logo hover 時狀態列顯示哪個網址。
- 點擊哪個座標會異常。
- Logo `<a>` 實際尺寸和圖片尺寸。
- 首頁是否載入全站 popup。
- popup 內是否有表單和驗證碼。
- 驗證碼是 reCAPTCHA、Turnstile 還是 hCaptcha。
- 問題是否只在特定瀏覽器出現。

只要是「滑過某個正常連結，卻看到奇怪網址」，我會先查上方覆蓋元素和 iframe，而不是先改那個連結本身。

## 標籤

- `reCAPTCHA`
- `Cloudflare Turnstile`
- `Popup`
- `Gravity Forms`
- `Logo`
- `iframe`

---

# Footer 最新文章區塊漏出 raw HTML

> 全站 Footer 的最新文章區塊沒有正常顯示文章標題，反而漏出原始 HTML 和空白段落。最後發現是 GenerateBlocks 動態查詢區塊版本和寫法不相容。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-05-04-footer-raw-html-query-loop/

整理日期：2026-05-04

## 狀況

有一個網站的全站 Footer 裡，「最新文章」區塊沒有正常顯示文章標題。

它不是完全空白，而是漏出一段看起來像壞掉的 HTML，下面還有多個空白段落。

因為 Footer 是全站共用，這種問題不是單一頁壞掉，而是每個有載入 Footer 的頁面都會一起受影響。

## 先拆成幾層看

我會先拆成幾層：

- Footer 是哪一個全站模板或元素在輸出。
- 問題是儲存內容壞掉，還是前台 render 時壞掉。
- 動態查詢區塊有沒有真的抓到文章。
- 目前網站上有沒有另一個正常運作的查詢迴圈可以參考。
- 快取是不是還在送舊版 Footer。

這種問題不能只看前台畫面，要回到產生 Footer 的區塊結構看。

## 最後發現

Footer 裡使用的是新版 GenerateBlocks query / looper / text 結構。

在當時的外掛版本組合裡，這個寫法沒有正常注入 `post-title`。結果前台不是顯示文章標題，而是留下空白段落和一段不完整的 HTML。

同一個網站上，另一個正常運作的文章列表使用的是比較舊但穩定的 query-loop / grid / container / headline 結構。

所以這次不是「最新文章沒有資料」，而是動態內容的區塊寫法在這個版本上不可靠。

## 修正方式

把 Footer 裡的新版 looper 結構換成網站上已經驗證可用的 query-loop 結構。

重點有幾個：

- 用獨立查詢，不繼承目前頁面的 main query。
- 只抓最新幾篇文章。
- 保留原本用來排除特定內容類型的篩選條件。
- 用 headline 動態資料輸出文章標題和連結。

改完後，還要清掉主要頁面的伺服器快取。因為 Footer 是全站共用，快取沒清時，前台可能還會看到舊的壞版 Footer。

## 不建議先做的事

不要只用 CSS 把那段 raw HTML 藏起來。

那只是把壞掉的輸出遮掉，並沒有修好 Footer 的資料來源。

也不要重寫時忘了原本的內容篩選條件。有些網站會把電子報、會員內容或特定分類排除在最新文章外，這種篩選不是樣式問題，是內容邏輯。

## 下次遇到可以先整理什麼

- Footer 是哪個模板、Element 或區塊在輸出。
- 問題是全站都出現，還是只有某些頁面。
- 使用的是哪一種 Query Loop / Looper 寫法。
- GenerateBlocks / GenerateBlocks Pro 的版本。
- 有沒有其他正常運作的文章列表可以參考。
- 是否有排除特定分類、標籤或會員內容的邏輯。
- 改完後需要清哪些快取。

全站共用區塊壞掉時，要先把影響範圍想清楚。Footer 的小問題，實際上會影響很多頁。

## 標籤

- `GenerateBlocks`
- `Footer`
- `Query Loop`
- `raw HTML`
- `動態內容`
- `快取`

---

# Gutenberg 區塊無效、主機快取 404 與主題版面限縮排查

> 解決在使用 REST API 發布 WordPress 頁面時，遇到的 Varnish 快取殘留 404、佈景主題版面壓縮限制，以及自訂連結區塊因 inline styles 導致編輯器警告無效的綜合問題。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-05-04-gutenberg-invalid-blocks-and-gp-boxed-layout-issue/

整理日期：2026-05-04

## 狀況

在建置特定產品的 Landing Page、隱私權政策與服務條款頁面時，遇到了以下三個相互關聯的問題：
1. **發布後網頁顯示 404**：透過 WP REST API 成功建立並發布頁面，後台編輯也正常，但在瀏覽器直接輸入網址訪問時卻一直顯示 404 找不到網頁。
2. **版面被嚴重壓縮與標題重複**：頁面內容左右出現大量留白，整體被包在一個狹窄的卡片容器中，且頁面最上方出現了重複的主題預設大標題。
3. **區塊無效警告**：在後台打開頁面時，編輯器內的多個按鈕與連結區塊跳出「此區塊包含未預期或無效的內容」紅色警告。

---

## 先拆成幾層看

* **主機與快取層**：404 狀態是由 WordPress 核心拋出，還是被伺服器快取機制（如 Varnish, Cloudflare）快取了發布之前的狀態。
* **主題設定與 Meta 欄位層**：佈景主題（如 GeneratePress）的全域寬度限制如何套用至新頁面。為何 REST API 無法直接寫入主題的版面覆寫欄位（如關閉頁面標題、設定全寬等）。
* **Gutenberg 驗證機制層**：自訂區塊（如 GenerateBlocks）在資料庫儲存的 HTML 標籤，與區塊 JavaScript 的 `save()` 預期輸出為何不一致。

---

## 最後發現

1. **快取殘留 404**：在新頁面尚未發布前，該網址曾被訪問過而產生了 404 頁面，此 404 狀態被伺服器端的 Varnish 快取記錄（快取時間長達數十小時）。因此頁面發布後，外部訪問依然讀取到舊的 404 快取。
2. **主題 REST API 限制**：佈景主題的版面設定（例如隱藏標題、全寬版面）是儲存在自訂的 Post Meta 中（如 `_generate-disable-elements` 等），這些 Meta 欄位因為沒有在 WP REST API 中註冊，因此無法直接透過 API 請求來更新。
3. **區塊驗證錯誤的原因**：
   * **區塊類型錯誤**：對於純文字的 `<a>` 連結按鈕，誤用了預期包裹子區塊的 `generateblocks/element` 區塊，導致 `save()` 輸出與編輯器預期不符。
   * **Inline Style 衝突**：在區塊標記中直接寫入複雜的 JSON inline styles 會干擾特定區塊的驗證。
   * **核心區塊屬性多餘**：WordPress 核心的清單（List）或圖片（Image）區塊中若手動寫入 inline `style="..."` 屬性，會因為核心 `save()` 預設不輸出此屬性而判定為無效。

---

## 修正方式

### 1. 清除 Varnish 404 快取
利用終端機發送 `PURGE` 請求清除該網址在主機端的 Varnish 快取：
```bash
curl -X PURGE "https://example.com/seo-page"
```

### 2. 使用一次性 Snippet 寫入主題版面 Meta 並搭配 CSS 覆寫
* **執行 PHP 程式碼寫入 Post Meta**：
  ```php
  $ids = array(211116, 211117, 211118); // 頁面 ID
  foreach ($ids as $id) {
      update_post_meta($id, '_generate-sidebar-layout-meta', 'no-sidebar');
      update_post_meta($id, '_generate-disable-headline', '1');
      update_post_meta($id, '_generate-full-width-content', 'true');
  }
  ```
* **CSS 覆寫全域 site-main 寬度限制**：
  ```css
  /* 讓特定 LP 頁面打破全站 42rem 的寬度限制 */
  .page-id-211116 .site-main,
  .page-id-211116 .inside-article {
      max-width: none !important;
      margin: 0 !important;
      padding: 0 !important;
      background: transparent !important;
      box-shadow: none !important;
  }
  ```

### 3. 重構 Gutenberg 區塊避開無效警告
* **改用 Text 區塊**：將純文字連結按鈕由 `generateblocks/element` 改為 `generateblocks/text`，並指定 `tagName: "a"`。
* **分離樣式至 CSS**：將按鈕的 inline styles 全部拿掉，改在區塊的 `className` 屬性中宣告自訂的 Class（如 `my-custom-btn`），並在附加 CSS 中控制其視覺。
* **標準標記結構**：
  ```html
  <!-- wp:generateblocks/text {"uniqueId":"cf82e071","tagName":"a","htmlAttributes":{"className":"my-custom-btn","href":"#install"}} -->
  <a class="gb-text gb-text-cf82e071 my-custom-btn" href="#install">立即下載</a>
  <!-- /wp:generateblocks/text -->
  ```
  *(注意：class 必須寫滿 `gb-text gb-text-{id} {custom-class}` 三重格式以符合 GenerateBlocks 的驗證預期)*

---

## 不建議先做的事

* 看到編輯器警告時，不要直接在後台點擊「嘗試復原」，因為如果原始 HTML 中的 inline styles 還在，即使暫時復原，下次儲存或編輯時依然會壞掉。
* 不要輕易為了版面設定去全域關閉 Varnish 快取，這會嚴重影響全站的響應速度與主機負載。

---

## 下次遇到可以先整理什麼

* 發生 404 網頁的 Response Headers（在 DevTools 的 Network 面板查看 `x-cache` 或 `x-cache-age`），確認是否由伺服器快取引起。
* 點擊編輯器無效區塊上的「轉換為 HTML」，比對「原本的 HTML」與「編輯器預期輸出（綠底 diff 顯示）」的字元差異。
* 儘量避免在 Gutenberg 區塊中直接塞入非標準的 inline styles，應善用 Class 選擇器搭配外掛的 CSS 管理器進行視覺樣式控制。

---

## 標籤

- `Gutenberg`
- `Varnish`
- `快取`
- `GenerateBlocks`
- `REST API`
- `排查`

---

# Turnstile iframe 蓋住 WordPress admin bar

> 登入後前台 admin bar 點不到，最後發現不是 admin bar 壞掉，而是隱藏 popup 裡的 Turnstile iframe 覆蓋到頁面上方。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-05-05-turnstile-admin-bar-blocked/

整理日期：2026-05-05

## 狀況

登入 WordPress 後，前台最上方的 admin bar 點不到。

admin bar 看得到，連結也存在，但滑鼠點下去沒有反應。從前台要回後台變得很不順。

這種問題很容易被誤判成 CSS、z-index 或上次改過 Logo 點擊範圍造成的副作用。

## 先拆成幾層看

我會先拆成幾層：

- admin bar 的連結是否真的存在。
- 是 href 錯，還是 click 被別的元素吃掉。
- 問題只在登入後出現，還是匿名訪客也會遇到。
- 頁面上方是否有透明 iframe、popup、驗證碼或第三方 widget。
- 最近有沒有改 reCAPTCHA、Turnstile、Gravity Forms 或 popup 設定。

只看 HTML 結構不一定夠。這種點不到的問題，要看滑鼠座標最上層到底是哪個元素。

## 最後發現

頁面裡有一個 popup 設定成全站載入。

那個 popup 裡放了一個表單，表單使用 Cloudflare Turnstile。雖然 popup 看起來是隱藏的，但 Turnstile 仍然在頁面載入時插入 iframe。

Turnstile iframe 的實際位置跑到頁面左上角附近，剛好蓋住 WordPress admin bar。

所以 admin bar 不是壞掉，而是 click 被 Turnstile iframe 吃掉。

這類問題用 `document.elementFromPoint(x, y)` 很快可以確認。把座標放在 admin bar 上，回傳的不是 admin bar，而是第三方 iframe 相關元素，就知道方向了。

## 修正方式

這次沒有改 WordPress 程式碼。

處理方式是到 Cloudflare Turnstile 後台，把對應 site key 的 widget mode 從可見模式改成 invisible。

改成 invisible 後，不會再渲染可見的 300px 左右 iframe，也就不會蓋住 admin bar。

不過改之前要確認這個 site key 有沒有被其他表單或其他網站共用。共用的話，影響範圍就不只這一個表單。

## 不建議先做的事

不要一開始就亂調 admin bar 的 z-index。

如果是第三方 iframe 蓋住，硬把 admin bar 疊上去不一定是乾淨解法，還可能讓其他互動壞掉。

也不要只測匿名訪客。admin bar 只有登入後才看得到，這種問題如果沒有登入測，就很容易漏掉。

## 下次遇到可以先整理什麼

- 問題是否只在登入狀態出現。
- 點不到的位置座標。
- `document.elementFromPoint(x, y)` 回傳哪個元素。
- 頁面是否有 popup、表單、reCAPTCHA、Turnstile 或 hCaptcha。
- popup 是否全站載入。
- 驗證碼 widget 是 visible、managed，還是 invisible。
- site key 是否被其他表單共用。

只要是「看得到但點不到」的問題，我會先查最上層元素，而不是先猜 CSS。

## 標籤

- `Cloudflare Turnstile`
- `Gravity Forms`
- `Popup`
- `admin bar`
- `iframe`
- `點不到`

---

# 手機版 Badge 壓到商品圖

> 手機版商品列表的 YITH Badge 壓住封面圖，最後改成桌機和手機分開給圖片上方空間，避免全站一起拉開。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-05-27-yith-badge-mobile-overlap/

整理日期：2026-05-27

## 狀況

手機版商品列表裡，YITH Badge 壓到商品封面圖。

桌機版看起來還可以，但用比較窄的手機尺寸看，badge 會吃到圖片上方重要區域。

這是之前處理過的 Badge 壓圖問題的後續補充。原本已經有預留一點上方空間，但手機版仍然不夠。

## 先拆成幾層看

我會先拆成幾層：

- Badge 是不是絕對定位。
- 定位參考容器是哪一層。
- 桌機和手機是否需要不同上方空間。
- CSS 是否限定在特定頁面或特定商品列表。
- 有沒有動到 WooCommerce 內部圖片元素。
- Elementor widget 重建後 class 是否可能改變。

這種問題不適合全站一刀切。列表頁、單一商品頁、桌機版、手機版的空間需求都可能不同。

## 最後發現

YITH Badge 固定在容器左上角。

原本列表頁只預留很小的 `padding-top`，桌機看起來還行，但手機版 badge 高度和內部文字位置讓它仍然壓到圖片。

如果把所有裝置都改成較大的 padding，手機會改善，但桌機版 badge 和圖片距離又會變太開。

所以問題不是單一數值，而是桌機和手機要分開處理。

## 修正方式

保留桌機較小的 padding，手機版用較大的 padding。

概念像這樣：

```css
body.page-id-XXXXX .product-list-widget .container-image-and-badge {
  padding-top: 8px !important;
  overflow: visible !important;
}

body.page-id-XXXXX .product-list-widget .yith-wcbm-badge {
  position: absolute !important;
  top: 0 !important;
  left: 0 !important;
  z-index: 10;
}

@media (max-width: 767px) {
  body.page-id-XXXXX .product-list-widget .container-image-and-badge {
    padding-top: 36px !important;
  }
}
```

單一商品頁也可以另外處理，但不要直接用全站 `.container-image-and-badge` 大範圍套用。

## 不建議先做的事

不要為了手機版，直接把全站商品圖上方都加大 padding。

桌機版會變得很鬆，其他商品列表也可能被影響。

也不要去改 WooCommerce 內部圖片 wrapper 的 `overflow` 或 `display`。這類內層結構被外掛和主題共用，副作用常常比原問題麻煩。

## 下次遇到可以先整理什麼

- 發生在哪個列表頁或商品頁。
- 只在手機版發生，還是桌機也有。
- Badge 實際高度。
- 定位參考容器是哪一層。
- 目前 CSS 是否有 page scope。
- Elementor widget class 是否穩定。
- 調整後桌機是否距離過大。

Badge 這類絕對定位元素，重點不是把它推走，而是替它在正確容器裡預留空間。

## 標籤

- `YITH Badge`
- `WooCommerce`
- `Elementor`
- `RWD`
- `CSS`
- `商品列表`

---

# FAQ 結構化資料修好了，但檢測還看到舊結果

> FAQPage 的 mainEntity 已經修好，但裸網址仍吃到舊快取，導致 Google 檢測畫面還看到空的結構化資料。

原始頁面：https://bendocs.webbiz.tw/tw/notes/maintenance/2026-05-28-faq-schema-cache-stale/

整理日期：2026-05-28

## 狀況

FAQ 結構化資料修完後，再看 Google 的結構化資料檢測，畫面仍然顯示 FAQPage 有問題。

問題看起來是 `mainEntity` 欄位未填。也就是說，頁面被判斷成 FAQPage，但裡面沒有問題和答案。

這種狀況很容易讓人以為文章裡的 FAQ 還是壞的，或是 SEO 外掛沒有正確輸出 JSON-LD。

但這次不只是一個問題。

## 先拆成幾層看

我會先拆成幾層：

- 文章裡的 FAQ 區塊還在不在。
- SEO 外掛能不能產生正確的 JSON-LD。
- 用 cache-bypass 網址看，schema 是新的還是舊的。
- 裸網址看，schema 是新的還是舊的。
- HTTP headers 裡有沒有快取年齡、快取標籤或長時間快取設定。
- Google 檢測畫面看到的是即時結果，還是上一次抓到的舊結果。

這裡最容易誤判的是：cache-bypass 網址正常，不代表裸網址正常。

Google 通常抓的是裸網址。如果裸網址還在回舊 HTML，Google 看到的還是舊 schema。

## 最後發現

文章內容本身還有 FAQ 區塊。

重新整理 FAQ 區塊後，SEO 外掛已經可以輸出正確的 FAQPage JSON-LD。用 cache-bypass 網址看，`mainEntity` 也有正常出現 5 筆問題。

但裸網址還是回舊 HTML。

HTTP headers 顯示這頁被 Varnish 類型的快取留住，而且快取時間很長。也就是說，WordPress 裡的內容已經更新，但訪客和 Google 抓裸網址時，仍可能看到舊版本。

所以後半段問題不是 FAQ 沒修好，而是快取沒有被清掉。

## 修正方式

這次處理順序是：

1. 先備份文章內容。
2. 重新整理 FAQ 區塊，讓 SEO 外掛重建 FAQPage schema。
3. 用 cache-bypass 網址確認 `mainEntity` 已經有 5 筆。
4. 再用裸網址確認，發現裸網址仍是舊快取。
5. 清掉頁面快取。
6. 重新驗裸網址，確認 `x-cache-age` 歸零，`mainEntity` 也變成 5 筆。

最後確認後，裸網址輸出的 FAQPage 已經正常。

Google 檢測工具或 Search Console 的舊畫面不一定會立刻更新。這時候要用「即時測試」或重新驗證，不要只看原本那張舊結果。

## 不建議先做的事

不要看到 `mainEntity` 是空的，就一直改文章裡的 FAQ 文字。

如果 cache-bypass 網址已經正常，裸網址卻不正常，方向就要轉到快取，而不是繼續改內容。

也不要只看前台頁面能不能打開。頁面能開，不代表 JSON-LD 是新的。

更不要只用有 query string 的網址當最後驗證。那只能證明 WordPress 端的新內容可用，不能證明 Google 抓裸網址時也會看到同一份 HTML。

## 下次遇到可以先整理什麼

- Google 檢測或 Search Console 顯示的錯誤時間。
- 裸網址的 schema 結果。
- cache-bypass 網址的 schema 結果。
- `dateModified` 是新時間還是舊時間。
- `mainEntity` 是空的，還是有問題清單。
- HTTP headers 裡的 `x-cache-age`、`x-cache-tags`、`cache-control`。
- 站上使用的是哪一層快取：外掛、主機、Varnish、CDN，還是 Cloudflare。
- 文章更新後，快取有沒有自動清掉。

這類問題要同時看內容層和快取層。

只看 SEO 外掛，會以為 FAQ 還沒修好。只看 Google 檢測，也可能只是看到舊快取。

## 標籤

- `Rank Math`
- `FAQPage`
- `JSON-LD`
- `mainEntity`
- `Varnish`
- `快取`
- `GSC`
- `結構化資料`

---

# 最新更新

> 這裡放最近新增或整理過的筆記入口，讓讀者先看到這份筆記還在持續更新。

原始頁面：https://bendocs.webbiz.tw/tw/updates/

## 這裡放什麼

這頁放最近新增或整理過的內容。

我不想讓讀者一進來只看到一份靜態文件。這份筆記之後會持續從兩邊補內容：一邊是平常維護網站留下的紀錄，一邊是網站變化筆記。

## 最近新增

- [Gutenberg 區塊無效、主機快取 404 與主題版面限縮排查](/tw/notes/maintenance/2026-05-04-gutenberg-invalid-blocks-and-gp-boxed-layout-issue/)
- [文章卡片閱讀更多按鈕對齊與絕對定位排版](/tw/notes/maintenance/2026-04-27-elementor-post-grid-readmore-absolute-position/)
- [CSS 媒體查詢未閉合導致後續樣式遭吞噬排查](/tw/notes/maintenance/2026-04-19-css-unclosed-media-query-swallowed-styles/)
- [關於頁面全寬打破邊框排版與聯絡表單信任文案優化](/tw/notes/maintenance/2026-04-06-about-page-breakout-layout-and-contact-trust-copy/)
- [銷售漏斗頁首與主視覺間隙排查與版面設定優化](/tw/notes/maintenance/2026-04-06-funnel-header-hero-gap-issue/)
- [Rank Math FAQ 區塊驗證失敗與區塊程式碼自動產生器](/tw/notes/maintenance/2026-03-30-rankmath-faq-block-validation-script/)
- [WPML 多語系下佈景主題自訂版面翻譯失效之替代方案](/tw/notes/maintenance/2026-03-30-wpml-astra-custom-layout-translation-issue/)
- [Rank Math FAQ 卡片化排版與跨容器對齊](/tw/notes/maintenance/2026-03-30-faq-css-card-styling-and-alignment/)
- [側邊欄最新文章項目符號遺失與 CSS 優先權覆蓋](/tw/notes/maintenance/2026-03-27-sidebar-recent-posts-bullet-missing/)
- [側邊欄最新文章依分類篩選與排除](/tw/notes/maintenance/2026-03-27-sidebar-recent-posts-filter/)
- [雙語網站 Logo 連結跳轉語系錯誤](/tw/notes/maintenance/2026-03-25-logo-language-link-bug/)
- [FAQ 結構化資料修好了，但檢測還看到舊結果](/tw/notes/maintenance/2026-05-28-faq-schema-cache-stale/)
- [問題狀態怎麼判斷](/tw/work-method/)
- [手機版 Badge 壓到商品圖](/tw/notes/maintenance/2026-05-27-yith-badge-mobile-overlap/)
- [Logo 點第二次跑到 reCAPTCHA 管理頁](/tw/notes/maintenance/2026-05-01-logo-click-recaptcha-migrate/)
- [TablePress 圖示沒有置中](/tw/notes/maintenance/2026-04-27-tablepress-icon-center/)
- [Popup 短代碼直接露在前台](/tw/notes/maintenance/2026-04-23-popup-shortcode-migration/)
- [全站間距不一致，CSS 從 Additional CSS 拆出去](/tw/notes/maintenance/2026-04-06-site-spacing-css-snippets/)
- [英文版選單消失，最後發現 Header JS 多包 script](/tw/notes/maintenance/2026-03-31-language-menu-script-error/)
- [商品價格消失，最後發現 CSS scope 太大](/tw/notes/maintenance/2026-03-23-product-price-badge-css-scope/)
- [Turnstile iframe 蓋住 WordPress admin bar](/tw/notes/maintenance/2026-05-05-turnstile-admin-bar-blocked/)
- [Footer 最新文章區塊漏出 raw HTML](/tw/notes/maintenance/2026-05-04-footer-raw-html-query-loop/)
- [選單消失，最後發現是 Autoptimize 快取檔案 404](/tw/notes/maintenance/2026-04-09-autoptimize-cache-menu-missing/)
- [Cloudflare WAF 擋到 Googlebot](/tw/notes/maintenance/2026-03-27-cloudflare-waf-googlebot/)
- [Google Search 的 AI agent 和 AI Mode 更新](/tw/weekly/2026-05-27-google-ai-search/)
- [追蹤來源](/tw/weekly/sources/)
- [持續更新流程](/tw/update-workflow/)

## 最近整理

- [維護筆記](/tw/notes/maintenance/)
- [H1 不見、H2 比 H3 還小，FAQ 結構化資料還跑到畫面上](/tw/notes/maintenance/2026-03-24-heading-schema-display-issue/)
- [WPML 翻譯權限不足](/tw/notes/maintenance/2026-03-27-wpml-translation-permission/)

## 之後怎麼看

短期內可以先看這頁。

如果內容變多，最新更新只留最近幾篇。比較舊的網站變化筆記會進月份封存，維護筆記則會依問題狀態和日期整理。

---

# 持續更新流程

> 這份筆記之後會分成兩條資料來源：平常維護網站留下的紀錄，以及外部 RSS 或官方更新。前者整理成維護筆記，後者整理成網站變化筆記。

原始頁面：https://bendocs.webbiz.tw/tw/update-workflow/

## 兩條來源

這份筆記之後不應該只靠臨時想到才更新。

它會用比較固定的方式持續補內容：一邊是平常維護網站留下的紀錄，一邊是 RSS 或官方更新頁裡值得注意的變化。

比較合理的做法，是把來源分成兩條。

第一條是我的維護紀錄。

這些原始內容會先放在私人工作筆記裡。裡面可以保留比較完整的處理過程、網站狀況、截圖、錯誤訊息和細節。

但公開到這裡時，不應該整包搬出來。要先整理成可以查、可以給 AI 讀、也不會暴露客戶或網站細節的版本。

第二條是外部更新。

例如 WordPress、Google 搜尋、GSC、速度、安全、AI 工具、主機或 CDN 相關的更新。這些會先從 RSS、官方更新頁或手動補充的來源裡整理，再寫成網站變化筆記。

## 維護紀錄怎麼整理

維護紀錄的流程應該像這樣：

1. 原始紀錄先留在私人工作筆記。
2. 先判斷問題狀態，例如網站打不開、後台不能管理、畫面異常、通知異常、Google 異常、速度或快取異常、安全與復原異常。
3. 整理成公開版草稿。
4. 移除可識別資訊和不適合公開的細節。
5. 保留問題拆解、原因、修正方式、下次可以先整理什麼。
6. 發到維護筆記。

公開版不需要證明我處理過誰的網站。

它要留下的是判斷方法。

這一條會是最重要的更新來源。因為它不是憑空寫文章，而是從真的維護紀錄整理出來。

## 外部更新怎麼整理

外部更新可以先固定整理來源。

流程可以是：

1. 定期整理 RSS 或官方更新頁。
2. 先看可能影響哪些問題狀態。
3. 翻成繁體中文摘要。
4. 刪掉跟小公司網站無關的內容。
5. 加上我的判斷。
6. 整理成網站變化筆記。

這一區不適合全文翻譯。

如果只是翻譯原文，價值不高，也容易變成資料堆。真正有用的是判斷：這件事要不要管、什麼時候管、對既有網站可能有什麼影響。

## bendocs 扮演什麼角色

私人工作筆記比較像資料庫。

bendocs 比較像公開後的整理層。

我希望它最後變成三種東西的集合：

- 固定觀念：小公司網路店面架構。
- 持續紀錄：維護筆記。
- 外部變化：網站變化筆記。

這樣之後即使內容越來越多，也不會變成一堆雜亂文章。

---

# 網站變化筆記

> 這裡整理 WordPress、搜尋、速度、安全、AI 和網站經營相關的外部變化。重點不是追新聞，而是判斷它跟小公司網站有沒有關係。

原始頁面：https://bendocs.webbiz.tw/tw/weekly/

## 這裡放什麼

這區不是新聞列表。

我不太期待讀者每天追 WordPress、Google、SEO、資安、主機、AI 工具的更新。

比較實際的做法，是固定看幾個重要來源。看到可能影響小公司網站的變化，再整理成可以讀的筆記。

不一定每一週都要硬寫一篇。

如果那週沒有值得留下的東西，就不要為了更新而更新。這裡比較適合留下幾種內容：

- WordPress、外掛、佈景主題或安全更新。
- Google Search / GSC / SEO 相關變化。
- PageSpeed、Core Web Vitals、Chrome 或速度相關變化。
- Cloudflare、DNS、CDN、主機或寄信相關變化。
- AI 搜尋、AI 內容整理、網站被理解方式的變化。

每篇都要回答一件事：

> 這件事對小公司網站來說，要不要現在管？

## 預計怎麼更新

我會把這區當成一個固定整理流程：

1. 定期整理外部來源。
2. 先看會影響哪些網站狀態。
3. 刪掉跟小公司網站關係不大的內容。
4. 摘要成繁體中文。
5. 加上我的判斷。
6. 整理成網站變化筆記。

比較重要的是第 5 步。

如果只是把英文文章翻成中文，AI 已經可以做。這裡真正值得留下的是：這件事跟小公司網站有沒有關係、要不要現在管、以及會不會影響既有網站。

這套流程可以搭配 [持續更新流程](/tw/update-workflow/) 一起看。

預計追蹤的來源會放在 [追蹤來源](/tw/weekly/sources/)。

## 每篇會怎麼寫

每篇盡量保留固定格式：

- 來源日期和整理日期。
- 這次外部更新說了什麼。
- 它可能影響哪些問題狀態。
- 對小公司網站可能有什麼影響。
- 現在要不要處理。
- 可以先做什麼。
- 跟哪幾篇維護筆記或網路店面內容有關。

這樣之後內容變多，也不會變成一堆散亂摘要。

它會接回 [問題狀態怎麼判斷](/tw/work-method/)：先看外部變化可能影響哪種網站狀態，再決定小公司要不要處理。

## 目前整理

### 2026 年 5 月

- 05/27 · [Google Search 的 AI agent 和 AI Mode 更新](/tw/weekly/2026-05-27-google-ai-search/) `Google 異常` `內容異常` `結構異常` `AI 搜尋`

## 先看哪些方向

外部更新不另外開一套分類。

如果某個更新會影響網站，就回到同一套問題狀態看。例如 Google Search 更新，通常會先看 Google 異常、內容異常、結構異常；主機或 Cloudflare 更新，可能先看網站打不開、速度或快取異常、安全與復原異常。

這樣維護筆記和網站變化筆記才會接在一起，不會變成兩套整理方式。

## 不直接搬運

外部來源適合先整理成草稿。

但我不想讓這區變成一堆沒判斷的翻譯內容。公開前至少要看一次，把不重要、重複、跟小公司網站無關的東西刪掉。

這樣它才會是筆記，不是一堆資料堆。

---

# Google Search 的 AI agent 和 AI Mode 更新

> Google 在 I/O 2026 公布 AI Mode、Search agents 和 agentic coding 等 Search 更新。這篇先整理它跟小公司網站可能有什麼關係。

原始頁面：https://bendocs.webbiz.tw/tw/weekly/2026-05-27-google-ai-search/

整理日期：2026-05-27

來源日期：2026-05-19

來源：[Google Search’s I/O 2026 updates: AI agents and more](https://blog.google/products-and-platforms/products/search/search-io-2026/)

可能影響的問題狀態：`Google 異常`、`內容異常`、`結構異常`

## 先說結論

這篇不是要追 Google 每個新功能。

比較值得注意的是：Google Search 越來越像一個可以對話、追蹤、比較和代辦的 AI 入口。對小公司網站來說，這代表網站內容不能只想「塞關鍵字」，而是要讓 AI 看得懂你到底提供什麼、適合誰、什麼狀況該找你。

## 這次 Google 說了什麼

Google 在 I/O 2026 提到幾個 Search 更新：

- AI Mode 會用更新的 Gemini Flash 模型。
- Search box 會變得更適合輸入長問題，也能接文字、圖片、檔案、影片或 Chrome 分頁。
- 使用者可以從 AI Overview 繼續追問，進到更像對話的搜尋流程。
- Search agents 會幫使用者持續追蹤某些資訊變化。
- Search 會出現更多可以直接完成任務的 agentic 功能，例如查找、比較、預約或建立自訂工具。

這些功能不一定會馬上全面影響台灣網站。

但方向很明顯：搜尋不只是在找網頁，而是在整理問題、比較選項、追蹤變化，甚至幫使用者完成下一步。

## 跟小公司網站有什麼關係

以前很多網站內容是寫給搜尋結果頁看的。

現在更像要同時寫給三種對象看：

- 真正的人。
- 傳統搜尋引擎。
- 會幫使用者整理答案的 AI。

這不代表每篇文章都要寫得很長。

比較實際的是把幾件事講清楚：

- 你服務的是哪一種人或哪一種公司。
- 什麼情況適合找你。
- 什麼情況其實不適合。
- 常見問題有哪些。
- 需要準備哪些資訊。
- 你的經驗和判斷方式是什麼。

如果網站只有很空泛的服務介紹，AI 很難知道你跟別人差在哪裡。

## 這篇比較影響哪些狀態

這篇比較接近三個問題狀態。

第一個是 Google 異常。

因為它不是單純的內容寫法問題，而是搜尋入口本身正在變。未來使用者可能不只輸入關鍵字，而是直接問一段很長的問題，或讓 AI 幫他比較、追蹤、整理選項。

第二個是內容異常。

如果網站內容本身很模糊，AI 也很難幫你講清楚。服務頁、FAQ、維護筆記、實際問題整理，都會影響網站能不能被理解。

第三個是結構異常。

不是每個網站都要加一堆 schema，但重要頁面的標題、段落、內部連結和 FAQ 結構至少要清楚。內容如果沒有結構，AI 和搜尋引擎都比較難整理。

## 現在要不要處理

不用因為這篇就急著重做網站。

但如果網站本來就有這些問題，就可以排進整理清單：

- 服務頁只寫很抽象的形容詞，沒有清楚情境。
- FAQ 很少，或只是硬塞關鍵字。
- 沒有整理實際處理過的問題。
- 文章只有教學步驟，沒有判斷方式。
- 網站內容看不出適合哪一種客戶。

這些問題本來就會影響讀者理解。只是 AI 搜尋變強之後，這種模糊會更明顯。

## 可以先做什麼

先不要追著每個 AI 搜尋功能跑。

比較穩的做法是回頭整理網站基本內容：

- 服務頁補上具體情境。
- FAQ 改成真問題，不是硬湊問答。
- 維護紀錄、處理筆記、常見狀況可以整理成公開版。
- 每篇內容盡量講清楚「什麼情況適用、什麼情況不適用」。
- 重要頁面要有清楚標題、段落、內部連結和可讀結構。

這些不是為了討好 AI。

它本來就是讓網站比較容易被理解的基本功。

## 標籤

- `Google Search`
- `AI 搜尋`
- `GEO`
- `內容整理`
- `小公司網路店面`

---

# 追蹤來源

> 這裡記錄網站變化筆記會固定看的外部來源。重點不是追新聞，而是整理跟小公司網站有關的變化。

原始頁面：https://bendocs.webbiz.tw/tw/weekly/sources/

## 這裡放什麼

這頁不是新聞列表。

這裡記錄「網站變化筆記」會固定看的來源。

之後會從 RSS、官方更新頁或手動補充的資料裡，整理出比較值得留下的變化。

公開前還是要看過一次。

如果只是翻譯和搬運，這區很快就會變成資料堆。比較有價值的是篩選：哪些變化真的可能影響小公司網站。

## 先追哪些類型

初步可以追幾類：

- WordPress 官方更新。
- WordPress 外掛、佈景主題、安全漏洞。
- Google Search Central / GSC / SEO 相關更新。
- PageSpeed / Core Web Vitals / Chrome 相關更新。
- 主機、DNS、CDN、Cloudflare 相關更新。
- AI 搜尋、AI 內容整理、網站內容被理解方式的變化。

## 之後怎麼用

來源整理後，先不要直接公開。

比較好的流程是：

1. 先整理來源清單。
2. 去重複。
3. 看可能影響哪些問題狀態。
4. 摘要成繁體中文。
5. 判斷跟小公司網站有沒有關係。
6. 整理成網站變化筆記。

這樣讀者不用自己追所有消息，也不會被一堆跟自己無關的更新淹沒。

---

# 外掛與主題推薦

> 適合小公司網路店面的 WordPress 必備與常用外掛、佈景主題推薦清單，以輕量、穩定與實務判斷為主。

原始頁面：https://bendocs.webbiz.tw/tw/essential-plugins/

在 WordPress 的世界裡，大家常犯的錯誤是「看網路教學推薦什麼外掛就裝什麼」，最後網站塞了 40-50 個外掛，導致網站速度極慢、外掛衝突一堆、資安風險很高。

對待外掛與主題的鐵律是：**「Less is More（少即是多）」**。每多裝一個外掛，就是多增加一份維護成本與安全風險。

我自己有一份推薦清單，如下：

---

## 1. 核心必裝外掛（維持網路店面運作）

這類外掛負責網站的安全、備份、發信與追蹤，是每個商業網站都應該具備的底層防線：

* **Simple History** (操作日誌)
  * *用途*：記錄後台使用者的操作軌跡。網站出問題時，能立刻排查是不是有人改了設定或刪了東西。
  * *連結*：[Simple History](https://wordpress.org/plugins/simple-history/)
* **UpdraftPlus** (自動備份)
  * *用途*：設定自動備份排程，並將備份檔儲存在您的 Google Drive，確保網站損毀時能一鍵還原。
  * *連結*：[UpdraftPlus Backup](https://tw.wordpress.org/plugins/updraftplus/)
* **Post SMTP Mailer/Email Log** (解決漏信)
  * *用途*：設定第三方發信服務（如 Mailgun），解決 WordPress 預設發信容易被當作垃圾信的問題，並能記錄發信日誌。
  * *連結*：[Post SMTP](https://tw.wordpress.org/plugins/post-smtp/)
* **WPCode / Tracking Code Manager** (追蹤碼容器)
  * *用途*：用來統一埋設 GA4、Meta Pixel、GTM 或 Google Ads 的追蹤代碼，避免直接修改佈景主題檔案。
  * *連結*：[WPCode](https://tw.wordpress.org/plugins/insert-headers-and-footers/)
* **Wordfence Security** (安全防護)
  * *用途*：防護惡意掃描、防火牆封鎖與程式碼掃描。免費版防護力即非常強大（缺點是較佔資料庫空間）。
  * *連結*：[Wordfence](https://tw.wordpress.org/plugins/wordfence/)
* **Akismet Spam Protection** (阻擋垃圾信)
  * *用途*：由 WordPress 官方母公司開發，專門阻擋聯絡表單與文章留言的垃圾內容。
  * *連結*：[Akismet](https://tw.wordpress.org/plugins/akismet/)
* **Redirection** (301 轉址)
  * *用途*：當你修改網址時，設定自動轉址，避免客戶看到 404 頁面，同時保護 SEO 權重。
  * *連結*：[Redirection](https://tw.wordpress.org/plugins/redirection/)
* **Rank Math SEO** (搜尋優化)
  * *用途*：管理全站的 SEO Meta 標題、Sitemap、麵包屑與結構化資料（Schema）。
  * *連結*：[Rank Math](https://tw.wordpress.org/plugins/seo-by-rank-math/)

---

## 2. 常用功能外掛（視需求選裝）

當網站需要特定的行銷、表單或複製功能時，建議使用以下穩定度高的外掛：

* **Yoast Duplicate Post** (複製頁面)
  * *用途*：一鍵複製現有的文章或頁面草稿，方便製作版面相同的內容。
  * *連結*：[Duplicate Post](https://tw.wordpress.org/plugins/duplicate-post/)
* **Stop Generating Unnecessary Thumbnails** (節省空間)
  * *用途*：阻止 WordPress 上傳圖片時自動產生幾十種用不到的縮圖尺寸，能節省高達 50% 的主機磁碟空間。
  * *連結*：[Stop Generating Thumbnails](https://tw.wordpress.org/plugins/image-sizes/)
* **Contact Form 7 (CF7)** (老牌表單)
  * *用途*：最穩定的表單外掛（但需懂一點點 HTML 代碼）。建議搭配 **CFDB7** 將表單內容存在後台資料庫，防範漏信；若表單需要條件邏輯，可再搭配 **Conditional Fields for CF7**。
  * *連結*：[Contact Form 7](https://tw.wordpress.org/plugins/contact-form-7/)

---

## 3. 內容與寫作常用外掛

如果你打算在網站上進行內容行銷、撰寫實務筆記：

* **Easy Table of Contents** (文章目錄)
  * *用途*：根據文章中的 H2 / H3 自動在頂部產生錨點目錄，方便讀者跳轉，且對 Google 搜尋結果呈現（Jump-to Links）極有幫助。
  * *連結* [Easy TOC](https://tw.wordpress.org/plugins/easy-table-of-contents/)
* **Simple Lightbox** (燈箱效果)
  * *用途*：讓文章內的圖片點擊後能放大呈現，適合展示檢查圖表或錯誤畫面。
  * *連結*：[Simple Lightbox](https://tw.wordpress.org/plugins/simple-lightbox/)
* **Copy Anything to Clipboard** (一鍵複製)
  * *用途*：在網站中提供一鍵複製程式碼或指令的按鈕，適合提供技術筆記。
  * *連結*：[Copy Anything](https://tw.wordpress.org/plugins/copy-the-code/)
* **PPWP (Password Protect Page)** (局部內容鎖)
  * *用途*：可以把文章中的特定段落用密碼鎖起來，讀者輸入密碼才能觀看，適合用來提供訂閱者福利或私密筆記。
  * *連結*：[Password Protect Page](https://tw.wordpress.org/plugins/password-protect-page/)

---

## 4. 推薦的佈景主題與頁面編輯器

佈景主題決定了網站的速度與外觀基礎，而編輯器則是排版的工具。

### 推薦的主題（Themes）：

1. **GeneratePress** (極輕量首選)
   * *特點*：主程式僅約 1MB，代碼極乾淨，是追求 PageSpeed 速度與穩定性的第一選擇。
   * *連結*：[GeneratePress](https://generatepress.com/)
2. **Astra** (範本資源多)
   * *特點*：提供豐富的 Starter Templates。如果需要快速套用現成設計，且遇到問題上網查，它是資源最多的主題。
   * *連結*：[Astra](https://wpastra.com/)

### 推薦的頁面編輯器（Page Builders）：

* **GenerateBlocks / Getwid**：如果您習慣使用 WordPress 的預設區塊編輯器（Gutenberg）寫文章，這兩套工具能為您擴充 30-40 種輕量的排版區塊，代碼非常乾淨，適合用來編輯長文。

---

# 參考資源與工具

> 彙整 WordPress 學習社群、數位行銷追蹤工具、網站測速、圖片壓縮以及外部優質教學資源推薦。

原始頁面：https://bendocs.webbiz.tw/tw/reference-resources/

想要自己維護或規劃 WordPress 網站，免不了要上網查資料或使用線上檢測工具。Ben 整理了自己在實務中經常使用、且對小公司網站經營有實質幫助的工具與外部資源。

建議可以將此頁加入書籤，方便隨時查閱。

---

## 1. 推薦教學資源與行銷顧問

* **優易教學網**
  * *說明*：Ben 初學 WordPress 至今最推薦的中文影音教學平台。創辦人 Jack Wu 的教學影片系統架構清晰、脈絡好懂，非常適合想自行深入學習的使用者。
  * *連結*：[優易教學網 Youtube](https://www.youtube.com/user/JackWuSEO) / [優易教學網官網](https://www.yogoeasy.com/)
* **數位行銷顧問推薦**
  * [Allen Han (韓亞倫)](https://hanyalun.com/about/)：對廣告追蹤與數據工具非常精準的資深行銷顧問。
  * [三星統計（謝章升）](https://www.tutortristar.com/)：提供數據分析、網路社群行銷的實務培訓課程。

---

## 2. 實用網站檢測與圖片優化工具

當你需要優化網站速度、壓縮圖片或排查網頁架構時，這些免費工具是最佳幫手：

* **PageSpeed Insights**：Google 官方提供的網頁效能與體驗檢測工具，直接決定你的 SEO 速度分數。
* **GTmetrix / Pingdom**：經典的第三方網頁載入速度測試服務，能產生詳細的瀑布圖（Waterfall），幫工程師抓出是哪一個檔案載入太久。
  * *連結*：[GTmetrix](https://gtmetrix.com/) / [Pingdom Tools](https://tools.pingdom.com/)
* **BuiltWith**：想知道別人的網站是用什麼主機、哪套佈景主題或哪些外掛架設的？輸入網址即可一秒解析。
  * *連結*：[BuiltWith](https://builtwith.com/)
* **Squoosh**：Google 官方推出的免費圖片壓縮服務，支援 WebP 格式轉換。上傳圖片到 WordPress 前，務必用它壓縮，能省下 70% 以上的檔案大小。
  * *連結*：[Squoosh](https://squoosh.app)
* **Aspect Ratio Calculator**：在設計 Banner 或首頁區塊時，用來精準計算圖片的寬高比例，避免圖片變形。
  * *連結*：[Aspect Ratio Calculator](https://calculateaspectratio.com/)

---

## 3. 必裝行銷數據與監控服務

* **Google Search Console (GSC)**：監控網站在 Google 搜尋引擎上的索引狀態與自然流量關鍵字，是做 SEO 唯一的真理來源。
* **Google Analytics 4 (GA4)**：追蹤訪客在網站上的瀏覽行為與來源渠道。
* **Meta 像素與 CAPI**：投放 FB/IG 廣告時必裝的追蹤碼。
* **UptimeRobot**：免費的網站斷線監控服務。一旦你的網站主機當機、打不開，它會在幾分鐘內發送 Email 通知你，讓你能立刻處理。
  * *連結*：[UptimeRobot](https://uptimerobot.com/)
* **Mailgun**：推薦的第三方 SMTP 寄件服務，能解決小公司網站表單漏信、訂單通知信掉進垃圾信箱的困擾。
  * *連結*：[Mailgun](https://www.mailgun.com/)

---

## 4. 台灣 Facebook 交流社群

遇到 WordPress 技術難題或想了解最新趨勢時，可以在這些社群中發問（發問前請記得先搜尋舊文章並禮貌描述問題）：

* [WordPress Taiwan 正體中文社群](https://www.facebook.com/groups/wordpresstw/)
* [WooCommerce 台灣電商社](https://www.facebook.com/groups/woocommercetaiwan/)
* [WordPress & SEO 資源分享交流討論](https://www.facebook.com/groups/wpseotw)
* [WordPress 網站架設指南](https://www.facebook.com/groups/wpmax.tw/)

---

# 封存索引

> 這裡放舊筆記的整理規則。封存不是丟掉，而是降低權重、保留查詢，避免舊資訊被誤當成現在建議。

原始頁面：https://bendocs.webbiz.tw/tw/archive/

## 先說結論

封存不是刪掉。

有些筆記會過期，但它裡面的判斷方法可能還有用。比較好的做法是保留查詢入口，同時標清楚它是舊資料、舊介面，還是已經被新的做法取代。

## 哪些內容會封存

通常會有幾種：

- 外掛介面已經改版，但問題拆解仍有參考價值。
- 舊的網站變化筆記，已經不是現在最需要看的資訊。
- 舊工具清單，可能還能參考，但不適合當成現在建議。
- 已經有新版筆記取代的內容。

## 維護筆記怎麼封存

維護筆記不會以月份當主幹。

讀者通常不會知道某個問題發生在哪個月。他比較可能知道自己遇到的是多語系、表單、CSS、快取、GSC、速度或安全問題。

所以維護筆記會先依問題類型整理：

- 多語系 / WPML
- 表單 / SMTP / 寄信
- 版面 / CSS / Elementor
- 快取 / 速度 / 主機
- GSC / SEO / 索引
- 安全 / 被入侵 / 可疑檔案

日期會留在網址和文章裡，用來辨識這篇是什麼時候整理的。

## 網站變化筆記怎麼封存

網站變化筆記可以用月份。

因為它比較像外部更新紀錄。之後如果有人想回頭看某個月 Google、WordPress、AI 搜尋或資安發生什麼事，用月份會比較自然。

目前先從 2026 年開始整理。

## AI 讀取要注意什麼

之後 AI 可讀 Markdown 不應該無腦塞進所有舊文。

主檔應該保留仍然適合拿來判斷問題的內容。封存內容可以另外匯出，避免 AI 把過期的操作方式當成現在建議。

---

# WordPress 南投小聚

> WordPress 南投小聚的基本資訊、社群原則與活動入口。

原始頁面：https://bendocs.webbiz.tw/tw/archive/nantou-meetups/

**WordPress 南投小聚** 是 Ben（許哲維）在南投發起的 WordPress 在地聚會。

這頁只留基本資訊。

如果要找小聚資料，會以 [WordPress Taiwan 正體中文社群](https://www.facebook.com/groups/wordpresstw) 的公告為主。

如果只是想找 WordPress 網站整理、維護、GSC、速度或表單相關筆記，可以直接回到 [小公司網路店面筆記](/tw/)。

## 社群原則

南投小聚遵守 WordPress 社群的基本原則：

1. **免費或僅收取低消**：聚會不以營利為目的。如果有場地低消，通常是自點自付。
2. **不推銷**：不在聚會中強行推銷主機、外掛、主題或接案服務。
3. **對新手友善**：不管你是剛開始用 WordPress，還是已經做網站一段時間，都可以參加。

## 聯絡

如果有 WordPress 小聚相關問題，可以透過 [聯絡表單](https://webbiz.tw/contact-form) 找 Ben。

---

# 更新紀錄

> 這裡記錄這份筆記本身的整理方向，不列每一次修字。

原始頁面：https://bendocs.webbiz.tw/tw/version-info/

## 這頁怎麼看

這裡記錄的是這份筆記本身的整理紀錄。

不是 WordPress 更新紀錄，也不是每一次修字都列。

我會記幾種事：

- 內容架構有調整。
- 新增一批維護筆記。
- 調整這份筆記的使用方式。
- AI 可讀 Markdown 重新整理。
- 舊內容移到封存，或改成比較適合現在看的版本。

## 2026-06-10

這次算是重新整理這份筆記的定位。

核心先定清楚：

> 幫小公司把網站整理成接得住生意的網路店面。

主要調整：

- 把首頁和「先從這裡」改成先用 AI 讀這份筆記。
- 把「網站出問題時」拆成：先把狀況講清楚、問題狀態怎麼判斷、常見狀況怎麼看。
- 把建置前內容改成「網站建置前先整理」，不要只寫成泛用架站教學。
- 把上線後內容整理成維護、表單、速度、SEO、GSC 這幾個常見入口。
- 維護筆記改用「問題狀態」當主要查找方式，日期只當輔助。
- 補上 AI 可讀 Markdown，讓使用者可以把網站狀況和整份筆記一起交給 AI 判斷。
- 南投小聚頁改成短版，只保留社群原則和資料入口。

## 之後會怎麼記

之後不會把每一次改字都放進來。

如果只是修文案、改錯字、更新連結，不一定記。

會記的是會影響讀者怎麼使用這份筆記的改動。

## 早期紀錄

- 2022-05-31：發佈第一版。
- 2022-08-10：在 SEO 技術相關起手式新增標題連結相關筆記。
- 2022-10-12：新增常用服務。
