Files
2meet-data-optimizer/README.md
wpdev b63ab46f54
Tests / Integration Tests (push) Successful in 1m11s
Tests / Unit Tests (push) Failing after 11m56s
Anti-EAV Lint + Quality Gate / anti-eav-lint (push) Failing after 12m7s
Tests / PHPStan (push) Failing after 14m37s
Tests / PHPCS (push) Failing after 14m46s
Tests / PHP Lint (push) Failing after 14m57s
docs: 移植 readme.txt / CONTEXT.md / docs(backport A v3.4.6)
- readme.txt(WP 外掛目錄格式,隨 ZIP 發佈):Stable tag 對齊 1.0.0,
  changelog 補 1.0.0 條目
- CONTEXT.md(領域詞彙表):Status 區塊改寫為 v1.0.0 實況;
  HPCT_INTERCEPTORS 與 HivePress Adapter 兩節標註「已搬到 AddOn,核心無此常數」
- docs/:ENTITY_ADAPTER_COOKBOOK、2 篇 ADR、INTEGRATION_PATTERN_DECISION、
  anti-eav-lint.yml.template
  - cookbook 修掉兩個死連結(ANTI_EAV_PLAYBOOK 在來源外掛就不存在)
  - INTEGRATION_PATTERN_DECISION 加 v1.0.0 後記:結論已被 AddOn 拆分取代
  - template 改 wpdev/2meet-data-optimizer + ref v1.0.0 + wp tmdo lint
- README.md 文件索引補上以上 7 個檔案

前綴改寫刻意只動類別/函式/slug(WPDO_→TMDO_、wp-data-optimizer→2meet-...),
wpdo_ option/cron/hook/表名與 wpdo/v1 REST namespace 一律保留 —— 這是資料層
零遷移的前提。
2026-07-31 10:06:03 +08:00

138 lines
5.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 2meet Data Optimizer
> 通用 WordPress 反 EAV 引擎 — 零依賴,零 HivePress / WooCommerce / 2meet-* 綁定
`wp_postmeta` / `wp_usermeta` / `wp_termmeta` / `wp_commentmeta` 的高頻欄位自動分流到四象限扁平表(Hot / Warm / Cold / Archive),帶來 3-30× 的查詢加速。
從 [`wp-data-optimizer v2.16.0`](https://github.com/2meet/wp-data-optimizer) 提煉的純核心,整合層全部移到獨立 AddOn。
---
## 為什麼
WordPress 預設用 EAV (Entity-Attribute-Value) 模式儲存所有 meta:每筆 meta 都是 `wp_*meta` 表的一列。對少量欄位無傷,但站台一長大就出現:
- 單一 listing 可能對應數十條 postmeta → 列表頁查詢爆炸
- meta_query 複雜過濾必須 N 次 JOIN
- `autoload=yes` 的 wp_options 拖慢每頁載入
- `_transient_*` 滲入 wp_options 造成持續性脹
`2meet-data-optimizer` 為這些 meta 建立**扁平欄位表**(每 post_type 一張),由 Sync Bridge 雙寫,由 Query Router 改寫 `meta_query` 為直接 JOIN,達到接近原生欄位的效能。
---
## 四象限
| Zone | 表名 | 用途 | 加速場景 |
|---|---|---|---|
| **A Hot** | `wp_wpdo_hot_{type}` | 搜尋 / 篩選欄位 | meta_query 過濾、ORDER BY 排序 |
| **B Warm** | `wp_wpdo_warm` | TTL 計數 / 短期快取 | 瀏覽計數、暫時旗標 |
| **C Cold** | `wp_wpdo_cold_{type}` | 展示 / 描述欄位 | 詳情頁讀取 |
| **D Archive** | `wp_wpdo_archive` | 過期 gzip 歸檔 | 歷史資料保留 |
---
## 系統需求
- WordPress ≥ 6.0
- PHP ≥ 8.1
- MySQL ≥ 5.7 / MariaDB ≥ 10.3 (SQLite 亦支援)
---
## 安裝
1. 從 GitHub Release 下載 `2meet-data-optimizer-v0.1.0.zip`
2. 在 WordPress 後台 → 外掛 → 安裝外掛 → 上傳外掛
3. 啟用後執行 `wp tmdo doctor` 驗證
---
## 整合 AddOn(選用)
主外掛只覆蓋 WordPress 原生 4 entity meta。若使用 HivePress / WooCommerce / LatePoint / 2meet-* 系列等外掛並希望也享有反 EAV 加速,請額外安裝對應 AddOn:
| AddOn | 對應外掛 |
|---|---|
| `2meet-data-optimizer-hub-addon` | 2meet-hub-core |
| `2meet-data-optimizer-spoke-addon` | 2meet-spoke-sso |
| `2meet-data-optimizer-hivepress-addon` | hivepress + 12 HP 擴充 |
| `2meet-data-optimizer-woocommerce-addon` | woocommerce |
| `2meet-data-optimizer-latepoint-addon` | latepoint |
| `2meet-data-optimizer-infocards-addon` | 2meet-infocards |
| `2meet-data-optimizer-bookings-addon` | 2meet-bookings |
| `2meet-data-optimizer-quotation-addon` | 2meet-quotation |
| `2meet-data-optimizer-mobile-bridge-addon` | 2meet-mobile-bridge |
| `2meet-data-optimizer-collab-addon` | 2meet-collab |
| `2meet-data-optimizer-playlist-addon` | 2meet-playlist |
---
## WP-CLI 速查
```bash
wp tmdo status # 整體狀態
wp tmdo doctor # 健診(schema drift / 表對齊 / index
wp tmdo benchmark hot_post --samples=200
wp tmdo migrate hot_post # 執行 backfill
wp tmdo verify hot_post # 比對 postmeta 與 zone 表
wp tmdo cutover hot_post # 讀寫切到 zone 表
wp tmdo rollback hot_post # 退回 postmeta
wp tmdo cleanup --archive-expired
```
---
## 公開 API(給其他外掛)
```php
// 通用 4-entity 讀寫
TMDO_API::set_entity( 'user', $user_id, 'membership_level', 'gold' );
$level = TMDO_API::get_entity( 'user', $user_id, 'membership_level' );
// Schema 註冊
add_action( 'tmdo_register_entity_fields', function ( $registry_class ) {
$registry_class::register_group( 'user', 'my_group', [
[ 'key' => 'my_field', 'type' => 'text', 'searchable' => true ],
] );
} );
// 自訂表註冊(給其他外掛的表加入 doctor 監控)
add_action( 'tmdo_register_custom_tables', function ( $registry ) {
$registry->register( 'my-plugin', [
'table_name' => 'my_table',
'primary_key' => 'id',
'expected_columns' => [ ... ],
] );
} );
```
向後相容:`WPDO_API` / `WPDO_Schema_Registry` 等舊類別名透過 `class_alias()` 仍可使用(`v0.2.0` 起加 deprecation notice)。
---
## 授權
GPL-2.0-or-later
---
## 文件
- [readme.txt](readme.txt) — WordPress 外掛目錄格式說明(隨 ZIP 發佈)
- [CONTEXT.md](CONTEXT.md) — 領域詞彙表(Zone / Registry / Mode / FSM 的正式定義)
- [PLAN.md](PLAN.md) — 開發任務追蹤
- [CHANGELOG.md](CHANGELOG.md) — 版本歷史
- [DEPLOY.md](DEPLOY.md) — 部署流程
- [SECURITY.md](SECURITY.md) — 安全聯絡
- [DESIGN.md](DESIGN.md) — 架構決策
- [CLAUDE.md](CLAUDE.md) — AI 協作指引
給夥伴外掛作者(`docs/`,不進 ZIP):
- [ENTITY_ADAPTER_COOKBOOK.md](docs/ENTITY_ADAPTER_COOKBOOK.md) — 五層整合階梯與決策樹
- [adr-001-post-entity-source-of-truth.md](docs/adr-001-post-entity-source-of-truth.md) — post entity 的權威來源契約
- [adr-002-dual-write-naming-collision.md](docs/adr-002-dual-write-naming-collision.md) — `dual_write` 在兩套 FSM 的同名衝突
- [INTEGRATION_PATTERN_DECISION.md](docs/INTEGRATION_PATTERN_DECISION.md) — 整合模式取捨紀錄(含 v1.0.0 後記)
- [anti-eav-lint.yml.template](docs/anti-eav-lint.yml.template) — 夥伴外掛 CI gate 樣板