From 3c57fb0ee6be969e4adde25e9f04eb16bd35616d Mon Sep 17 00:00:00 2001 From: wpdev Date: Fri, 25 Sep 2026 23:57:52 +0800 Subject: [PATCH] fix(2meet-data-optimizer-hivepress-addon): declare post_type scopes on HivePress post groups - hp_listing_core / hp_request_core / hp_vendor_core declare hp_listing / hp_request / hp_vendor, matching core (PR-033), so the AddOn keeps scoped routing once core stops registering them (PR-020b) - Test: with tmdo_post_scoped_routing on, every key of each group resolves to its own post type's group; legacy owner and hash pins unchanged - Verify: HP unit 145 / integration 49 OK - PR: PR-033b --- .../class-tmdo-hivepress-entity-groups.php | 14 ++++++---- tests/unit/HivePressEntityGroupsTest.php | 27 +++++++++++++------ 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/includes/class-tmdo-hivepress-entity-groups.php b/includes/class-tmdo-hivepress-entity-groups.php index 8e94bf5..f0e5e58 100644 --- a/includes/class-tmdo-hivepress-entity-groups.php +++ b/includes/class-tmdo-hivepress-entity-groups.php @@ -15,8 +15,9 @@ * persisted in wpdo_registry_meta (originally registered by core's * TMDO_Post_Fields / TMDO_Member_Fields). Any drift changes the schema hash * and triggers ALTER TABLE on flat tables that may hold aeav_only data. - * The three post groups also share keys (hp_status, hp_user, …) and the - * entity field index is last-registered-wins, so keep their order. + * The three post groups share keys (hp_status, hp_user, …): each declares + * its post type so a post's key resolves to its own type's group, while + * lookups without a post type keep last-registered-wins — keep their order. * * @package TMDO_HIVEPRESS */ @@ -133,7 +134,8 @@ final class TMDO_HivePress_Entity_Groups { 'type' => 'decimal', 'label' => 'Hourly rate', ), - ) + ), + array( 'post_types' => array( 'hp_listing' ) ) ); } /** @@ -176,7 +178,8 @@ final class TMDO_HivePress_Entity_Groups { 'type' => 'integer', 'label' => 'View counter', ), - ) + ), + array( 'post_types' => array( 'hp_request' ) ) ); } /** @@ -218,7 +221,8 @@ final class TMDO_HivePress_Entity_Groups { 'searchable' => true, 'label' => 'Average rating', ), - ) + ), + array( 'post_types' => array( 'hp_vendor' ) ) ); } /** diff --git a/tests/unit/HivePressEntityGroupsTest.php b/tests/unit/HivePressEntityGroupsTest.php index dc4be8a..1273406 100644 --- a/tests/unit/HivePressEntityGroupsTest.php +++ b/tests/unit/HivePressEntityGroupsTest.php @@ -21,14 +21,10 @@ class HivePressEntityGroupsTest extends TestCase { ); /** - * Keys shared by several post groups resolve to the LAST group registered - * (the post entity has a single field index, not one per post_type). - * - * ⚠️ This pins current behaviour, not desired behaviour: a listing's - * hp_rating is routed to the hp_vendor_core table, its hp_status to - * hp_request_core, etc. It is pinned so that moving the registration - * between plugins cannot change routing silently; fixing the routing is - * tracked separately in the backlog. + * Lookups that do not pass a post type (or run with scoped routing off, + * until a site's rows are reconciled) keep the legacy owner of keys shared + * by several post groups: the LAST group registered. Pinned so the + * registration order cannot change silently. */ private const SHARED_KEY_OWNERS = array( 'hp_status' => 'hp_request_core', @@ -48,6 +44,10 @@ class HivePressEntityGroupsTest extends TestCase { TMDO_HivePress_Entity_Groups::register_entity_fields(); } + protected function tearDown(): void { + unset( $GLOBALS['_wp_options'][ TMDO_Entity_Registry::SCOPED_ROUTING_OPTION ] ); + } + public function test_definitions_match_persisted_schema_hashes(): void { foreach ( self::PERSISTED_HASHES as $id => $hash ) { list( $type, $group ) = explode( '/', $id ); @@ -63,6 +63,17 @@ class HivePressEntityGroupsTest extends TestCase { } } + public function test_shared_keys_follow_the_post_type_when_scoped_routing_is_on(): void { + $GLOBALS['_wp_options'][ TMDO_Entity_Registry::SCOPED_ROUTING_OPTION ] = '1'; + + foreach ( array( 'hp_listing' => 'hp_listing_core', 'hp_request' => 'hp_request_core', 'hp_vendor' => 'hp_vendor_core' ) as $post_type => $group ) { + foreach ( TMDO_Entity_Registry::get_group_keys( 'post', $group ) as $key ) { + $this->assertSame( $group, TMDO_Entity_Registry::get_field( 'post', $key, $post_type )['group'], "{$post_type}:{$key}" ); + } + } + $this->assertNull( TMDO_Entity_Registry::get_field( 'post', 'hp_rating', 'post' ), 'HivePress keys stay native on other post types' ); + } + public function test_core_adapter_does_not_register_a_conflicting_group(): void { ( new TMDO_HivePress_Core_Adapter() )->on_register_entity_fields();