fix: Schema Registry cold zone 註冊改為冪等(修復欄位重複累積)
Tests / PHP Lint (pull_request) Successful in 13s
Anti-EAV Lint + Quality Gate / anti-eav-lint (pull_request) Failing after 25s
Tests / Unit Tests (pull_request) Successful in 36s
Tests / PHPCS (pull_request) Successful in 30s
Tests / PHPStan (pull_request) Successful in 53s
Tests / Integration Tests (pull_request) Successful in 2m47s
Tests / PHP Lint (pull_request) Successful in 13s
Anti-EAV Lint + Quality Gate / anti-eav-lint (pull_request) Failing after 25s
Tests / Unit Tests (pull_request) Successful in 36s
Tests / PHPCS (pull_request) Successful in 30s
Tests / PHPStan (pull_request) Successful in 53s
Tests / Integration Tests (pull_request) Successful in 2m47s
三個 zone 索引的寫入方式並不一致: - hot -> hot_columns[post_type][column] 以 column 為 key,天生冪等 - warm -> warm_fields[meta_key] 以 meta_key 為 key,天生冪等 - cold -> cold_fields[post_type][] append,無去重 而 wpdo_register_fields 本來就會被觸發多次:核心自身於 plugins_loaded:4 觸發,主檔另有 late-bind safety net 於 :30 再觸發一次(讓在 :6 之後才 bootstrap 的 AddOn 趕上);加上主外掛與其 AddOn 可能同時註冊同一批欄位。 實測影響:某站台 cold_fields['hp_vendor'] 累積到 35 筆但只有 9 個相異值, 每個 key 重複 4 次。修正後為 9 筆、零重複。 修法:cold 分支加入 in_array() 去重,使 register() 對同一 (post_type, meta_key) 成為冪等操作,與 hot / warm 既有行為一致。 驗證:核心單元測試 587 tests / 1156 assertions 全綠; wp wpdo doctor 於兩個站台皆 0 FAIL。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
* Plugin Name: 2meet Data Optimizer
|
* Plugin Name: 2meet Data Optimizer
|
||||||
* Plugin URI: https://2meet.io/2meet-data-optimizer
|
* Plugin URI: https://2meet.io/2meet-data-optimizer
|
||||||
* Description: 通用 WordPress 反 EAV 引擎:將 postmeta / usermeta / termmeta / commentmeta 自動分流至四象限扁平表(Hot / Warm / Cold / Archive),大幅提升搜尋與篩選效能。從 wp-data-optimizer v2.16.0 提煉的純核心,整合層交給 11 個 AddOn。
|
* Description: 通用 WordPress 反 EAV 引擎:將 postmeta / usermeta / termmeta / commentmeta 自動分流至四象限扁平表(Hot / Warm / Cold / Archive),大幅提升搜尋與篩選效能。從 wp-data-optimizer v2.16.0 提煉的純核心,整合層交給 11 個 AddOn。
|
||||||
* Version: 1.0.0
|
* Version: 1.0.1
|
||||||
* Requires at least: 6.0
|
* Requires at least: 6.0
|
||||||
* Tested up to: 6.9.4
|
* Tested up to: 6.9.4
|
||||||
* Requires PHP: 8.1
|
* Requires PHP: 8.1
|
||||||
@@ -26,7 +26,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ── Constants ──────────────────────────────────────────────────────────────
|
// ── Constants ──────────────────────────────────────────────────────────────
|
||||||
define( 'TMDO_VERSION', '1.0.0' );
|
define( 'TMDO_VERSION', '1.0.1' );
|
||||||
define( 'TMDO_DB_VERSION', '2.1.0' );
|
define( 'TMDO_DB_VERSION', '2.1.0' );
|
||||||
define( 'TMDO_PATH', plugin_dir_path( __FILE__ ) );
|
define( 'TMDO_PATH', plugin_dir_path( __FILE__ ) );
|
||||||
define( 'TMDO_URL', plugin_dir_url( __FILE__ ) );
|
define( 'TMDO_URL', plugin_dir_url( __FILE__ ) );
|
||||||
|
|||||||
@@ -7,6 +7,38 @@ Versioning follows [Semantic Versioning](https://semver.org/).
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## [1.0.1] — 2026-08-08 — Schema Registry 冪等性修正(cold zone 欄位重複累積)
|
||||||
|
|
||||||
|
**性質**:核心 bug 修復。無 schema 變更,無 API 變更,無破壞性變更。
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **`TMDO_Schema_Registry::register()` 的 cold zone 分支會無限累積重複項**
|
||||||
|
(`includes/class-tmdo-schema-registry.php`)
|
||||||
|
|
||||||
|
三個 zone 索引的寫入方式並不一致:
|
||||||
|
- `hot` → `$this->hot_columns[$post_type][$column] = ...`(以 column 為 key,天生冪等)
|
||||||
|
- `warm` → `$this->warm_fields[$meta_key] = ...`(以 meta_key 為 key,天生冪等)
|
||||||
|
- `cold` → `$this->cold_fields[$post_type][] = ...`(**append,無去重**)
|
||||||
|
|
||||||
|
而 `wpdo_register_fields` 本來就會被觸發多次——核心自身在 `plugins_loaded:4` 觸發,
|
||||||
|
主檔另有 late-bind safety net 於 `plugins_loaded:30` 再次觸發,好讓在 `:6` 之後才
|
||||||
|
bootstrap 的 AddOn 也能趕上;再加上主外掛與其 AddOn 可能同時註冊同一批欄位。
|
||||||
|
|
||||||
|
**實測影響**:某站台 `cold_fields['hp_vendor']` 累積到 **35 筆但只有 9 個相異值**,
|
||||||
|
每個 key 重複 4 次。修正後為 9 筆、零重複。
|
||||||
|
|
||||||
|
修法:cold 分支加入 `in_array( ..., true )` 去重,使 `register()` 對同一
|
||||||
|
`(post_type, meta_key)` 成為冪等操作,與 hot / warm 的既有行為一致。
|
||||||
|
|
||||||
|
### 驗證
|
||||||
|
|
||||||
|
- 核心單元測試 **587 tests / 1156 assertions** 全綠
|
||||||
|
- `wp wpdo doctor` 於兩個站台皆 0 FAIL
|
||||||
|
- Version bump 1.0.0 → 1.0.1(2 點一致:header / `TMDO_VERSION`)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## [1.0.0] — 2026-07-31 — 取代 wp-data-optimizer v3.4.6
|
## [1.0.0] — 2026-07-31 — 取代 wp-data-optimizer v3.4.6
|
||||||
|
|
||||||
本版把 `wp-data-optimizer` v3.0.1–v3.4.6(92 個 commit)全數 backport 進來,
|
本版把 `wp-data-optimizer` v3.0.1–v3.4.6(92 個 commit)全數 backport 進來,
|
||||||
|
|||||||
@@ -145,7 +145,16 @@ class TMDO_Schema_Registry {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'cold':
|
case 'cold':
|
||||||
|
// 去重:hot 以 column 為 key、warm 以 meta_key 為 key,兩者天生冪等;
|
||||||
|
// 唯獨 cold 是 append,重複註冊會無限膨脹。而 `wpdo_register_fields`
|
||||||
|
// 本來就會被 fire 多次(core plugins_loaded:4 + late-bind safety net :30),
|
||||||
|
// 加上主外掛與 AddOn 可能同時註冊同一批欄位,實測曾出現同一 key 重複 4 次。
|
||||||
|
if ( ! isset( $this->cold_fields[ $config['post_type'] ] ) ) {
|
||||||
|
$this->cold_fields[ $config['post_type'] ] = array();
|
||||||
|
}
|
||||||
|
if ( ! in_array( $config['meta_key'], $this->cold_fields[ $config['post_type'] ], true ) ) {
|
||||||
$this->cold_fields[ $config['post_type'] ][] = $config['meta_key'];
|
$this->cold_fields[ $config['post_type'] ][] = $config['meta_key'];
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user