fix(2meet-data-optimizer): route post entity keys by post_type

- Entity groups can declare post_types; get_field() resolves a post's key against its own type's groups first, then unscoped ones (legacy last-wins lookup kept for callers without a post type)
- Hook Bus and the post query router pass the post type, so a listing's hp_rating / hp_status / hp_verified map to hp_listing_core instead of the vendor/request tables; core HP groups declare their post types (schema hashes unchanged)
- Behind tmdo_post_scoped_routing: on for sites without post flat rows, off where rows may sit in the wrong table until PR-034 reconciles them (dry-run: dev20–22 off, dev23/24/30/31/40 on)
- Verify: EntityRegistryScopeTest (8), PostScopedRoutingTest (4); core unit 630 / integration 443, HP 144/49, WC 10/22 OK
- PR: PR-033
This commit is contained in:
2026-09-25 23:55:49 +08:00
parent 1653011f4f
commit 3f4fe52e1b
7 changed files with 340 additions and 14 deletions
+18 -5
View File
@@ -80,7 +80,7 @@ final class TMDO_Hook_Bus {
return $check;
}
$field_def = TMDO_Entity_Registry::get_field( $type, $meta_key );
$field_def = self::field_for( $type, (int) $object_id, $meta_key );
if ( ! $field_def ) {
return $check; // 非管理欄位,放行
}
@@ -133,7 +133,7 @@ final class TMDO_Hook_Bus {
return $check;
}
$field_def = TMDO_Entity_Registry::get_field( $type, $meta_key );
$field_def = self::field_for( $type, (int) $object_id, $meta_key );
if ( ! $field_def ) {
return $check;
}
@@ -374,7 +374,7 @@ final class TMDO_Hook_Bus {
return $check;
}
$field_def = TMDO_Entity_Registry::get_field( $type, $meta_key );
$field_def = self::field_for( $type, (int) $object_id, $meta_key );
if ( ! $field_def ) {
return $check;
}
@@ -471,7 +471,7 @@ final class TMDO_Hook_Bus {
return $check;
}
$field_def = TMDO_Entity_Registry::get_field( $type, $meta_key );
$field_def = self::field_for( $type, (int) $object_id, $meta_key );
if ( ! $field_def ) {
return $check;
}
@@ -622,6 +622,19 @@ final class TMDO_Hook_Bus {
return null;
}
/**
* 欄位定義查詢;post meta 依該 post 本身的 post_type 解析(見 TMDO_Entity_Registry::get_field())。
*
* 先做不帶 post_type 的查詢:大多數 key 不受管理,可省下 get_post_type()。
*/
private static function field_for( string $type, int $object_id, string $meta_key ): ?array {
$field_def = TMDO_Entity_Registry::get_field( $type, $meta_key );
if ( null === $field_def || 'post' !== $type ) {
return $field_def;
}
return TMDO_Entity_Registry::get_field( $type, $meta_key, (string) get_post_type( $object_id ) );
}
/**
* 直接讀取(繞過 WP filter 系統)
* 供 wpdo_get_meta() 便利函式使用,性能更好
@@ -646,7 +659,7 @@ final class TMDO_Hook_Bus {
return $result;
}
$field_def = TMDO_Entity_Registry::get_field( $type, $key );
$field_def = self::field_for( $type, $entity_id, $key );
if ( ! $field_def ) {
return null;
}