# Changelog All notable changes to this AddOn will be documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Versioning follows [Semantic Versioning](https://semver.org/). --- ## [Unreleased] --- ## [0.5.1] — 2026-10-02 — 重新打包 ### Changed - 重新打包(無功能變更):與 WP-MVB v8 樞紐站(dev39)一同驗收後發版;程式碼與前一版相同。 --- ## [0.5.0] — 2026-09-28 Released with 2meet-data-optimizer 1.4.0 (hardening 2.4). ### Changed - `hp_listing_core` declares `(hp_price, post_id)`, `(hp_rating, post_id)` and `(hp_hourly_rate, post_id)` indexes for the listing sorts HivePress offers: with core 1.4.0 reading the ID tie-break from the flat `post_id`, a sort walks the index and stops at the page instead of sorting every match (dev36, 1.3M listings: price sort 14 s native → 0.37 s routed, hourly rate 11.5 s → 0.35 s, rating 43 s → 0.51 s). Core 1.3.0 ignores indexes ending with `post_id`, so nothing changes there. The pinned schema hash is unchanged. (PR-119) - Transient entries in a persistent object cache live a day (`MAX_CACHE_TTL`, HivePress's own default) instead of a week; a timeout still outlives its value by a minute. At a week dev36 kept 4.7M entries (1 GB) in the shared Redis and pushed other sites' keys out. Entries already cached keep their week. (PR-120) --- ## [0.4.0] — 2026-09-27 Released with 2meet-data-optimizer 1.3.0 (hardening 2.3). ### Changed - `hp_listing_core` declares indexes on `hp_hourly_rate` and `hp_rating_count` (HivePress filters and sorts on both). They are declared through the group's `indexes`, not `searchable`, so the pinned schema hash is unchanged and the table is not rebuilt; core 1.3.0 adds them in place from WP-CLI / WP-Cron. dev36 (902k listings): two indexes in about 4.7 s; routed `rating_count IN` 2.1 s → 0.36 s, `rating_count !=` 2.1 s → 0.76 s, hourly rate + price sort 2.1 s → 0.65 s. (PR-090) - With a persistent object cache, transient entries now expire: a value after a week (`MAX_CACHE_TTL`; HivePress writes it before its timeout, and a miss only makes it rebuild), its timeout a minute after the later of that and its own time — HivePress reads a missing timeout as "never expires", so the timeout must go last. Entries of deleted posts no longer pile up. (PR-099, PR-115) ### Added - Opt-in flattening of a site's own listing attributes: the `tmdo_hp_listing_attribute_fields` filter (`'hp_warranty' => 'integer'`) registers them in an `hp_listing_attrs` group — a new table, each column indexed at creation — leaving `hp_listing_core` unchanged. Types: text, textarea, integer, decimal, boolean, date, datetime, timestamp, enum. The group is registered once themes load, so the filter may live in a theme; core 1.3.0 keeps it native until a drift fix has filled it. (PR-109, PR-115) ### Upgrading - Deploy with core 1.3.0: on an older core the AddOn declares no index at all (core 1.2.0 would run the ALTER inside a web request). (PR-090b) - Redis: entries written by 0.3.0 have no TTL (dev36 had 3.0 M). Give them one with non-blocking commands — never `wp cache flush-group`, which the Redis Object Cache drop-in runs as one server-side script and which blocked Redis on a large group. `NX` leaves entries written by 0.4.0 alone: ``` redis-cli --scan --pattern 'wp:tmdo_hp_transient:*' \ | awk '{printf "EXPIRE %s 604800 NX\r\n", $0}' | redis-cli --pipe redis-cli --scan --pattern 'wp:tmdo_hp_transient:_transient_timeout_*' \ | awk '{printf "EXPIRE %s 608400 GT\r\n", $0}' | redis-cli --pipe ``` The second pass makes timeouts outlive their values. dev36: 3,013,352 keys in 45 s and 1,867,569 timeouts in 32 s, 0 errors, Redis latency max 2 ms. The pattern follows the drop-in's key layout (`::`); check it with `redis-cli --scan --pattern '*tmdo_hp_transient*' | head` first. redis-cli 7 has no `--count` with `--scan`. --- ## [0.3.0] — 2026-09-27 Released with 2meet-data-optimizer 1.2.0 (hardening 2.2). ### Changed - With a persistent object cache (`wp_using_ext_object_cache()`), the transient filter keeps HivePress's per-post transient pairs in the `tmdo_hp_transient` cache group instead of `wp_options`, where they piled up (1.15 M pairs on dev36). The cache is then the only store: rows written before are neither read nor deleted (HivePress rebuilds those caches once), because a `get_option()` miss adds the name to WordPress's `notoptions` for good and a hit keeps the old row in the `options` cache group with no expiry. Without an object cache nothing changes. After upgrading, remove the rows left behind with core's `wp tmdo cleanup-hp-transients --options --confirm`. ### Fixed - The detected / bound status cells of the HivePress admin table go through `esc_html()` (2.1 audit); output unchanged. ### Docs - `docs/REGISTERED-KEYS.md`: the six registered keys HivePress never writes as meta, because its models alias them to core columns (listing `hp_vendor` → `post_parent`, `hp_status` → `post_status`; request `hp_status`, `hp_user`; vendor `hp_user`; review `hp_rating` → `comment_karma`). The schema stays; their flat columns are always NULL. - `docs/HIVEPRESS-COVERAGE.md`: dev36 inventory of the meta each HivePress post type holds, where the extensions keep their data and the query shapes the front end produces. Attribute auto-registration is not needed now: every meta key HivePress queries is registered. --- ## [0.2.0] — 2026-09-26 Released with 2meet-data-optimizer 1.1.0 (hardening 2.1, search-index mode). ### Changed - HivePress model query / search hooks (`optimize_query`, `optimize_search`) are no longer bound while core's post router is active (`TMDO_Post_Query_Router::is_router_active()`): core routes HivePress searches, including `_sort`, to the entity flat tables, and two routers would claim the same clauses. ### Added - `tests/integration/`:bootstrap(複用核心的 integration bootstrap,連真實 MariaDB)+ `phpunit-integration.xml` + CI job,移植 5 個測試檔 (`HivepressIntegrationTest`、`HivepressTermCommentFieldsTest`、 `HivepressTransientFilterTest`、`ListingMetaInterceptorTest`、 `TermCommentBackfillTest`),共 57 tests。 - `tests/unit/ListingStatsTest.php`(9 tests)。unit bootstrap 先 define `TMDO_TEST_SKIP_LISTING_STATS_STUB`,核心 bootstrap 便會跳過它的 `TMDO_Listing_Stats` stub,改載入本 AddOn 的真實實作。145 → 154 tests。 - Phase 3 implementation in progress. --- ## [0.1.0] — TBD ### Added (initial release, scaffold) - Plugin scaffold from `wp-data-optimizer v2.16.0` extraction plan. - Plugin Header + bootstrap stub + 7 MD + composer.json. - Requires Plugins: `2meet-data-optimizer`, `hivepress`.