register_many( '2meet-infocards', array( // Vendor profile colour fields → Hot zone (varchar columns). array( 'post_type' => 'hp_vendor', 'meta_key' => 'tmeetic_profile_primary', 'zone' => 'hot', 'data_type' => "varchar(20) NOT NULL DEFAULT ''", 'column' => 'tmeetic_profile_primary', ), array( 'post_type' => 'hp_vendor', 'meta_key' => 'tmeetic_profile_accent', 'zone' => 'hot', 'data_type' => "varchar(20) NOT NULL DEFAULT ''", 'column' => 'tmeetic_profile_accent', ), array( 'post_type' => 'hp_vendor', 'meta_key' => 'tmeetic_profile_font', 'zone' => 'hot', 'data_type' => "varchar(50) NOT NULL DEFAULT ''", 'column' => 'tmeetic_profile_font', ), // Hero image is descriptive → Cold zone. array( 'post_type' => 'hp_vendor', 'meta_key' => 'tmeetic_profile_hero_image', 'zone' => 'cold', 'cache_group' => 'wpdo_cold_hp_vendor', 'cache_ttl' => HOUR_IN_SECONDS, ), // IG tokens — sensitive + display-only → Cold zone. array( 'post_type' => 'hp_vendor', 'meta_key' => 'tmeetic_ig_app_id', 'zone' => 'cold', 'cache_group' => 'wpdo_cold_hp_vendor', 'cache_ttl' => HOUR_IN_SECONDS, ), array( 'post_type' => 'hp_vendor', 'meta_key' => 'tmeetic_ig_app_secret_enc', 'zone' => 'cold', 'cache_group' => 'wpdo_cold_hp_vendor', 'cache_ttl' => HOUR_IN_SECONDS, ), array( 'post_type' => 'hp_vendor', 'meta_key' => 'tmeetic_ig_token_enc', 'zone' => 'cold', 'cache_group' => 'wpdo_cold_hp_vendor', 'cache_ttl' => HOUR_IN_SECONDS, ), array( 'post_type' => 'hp_vendor', 'meta_key' => 'tmeetic_ig_token_expires_at', 'zone' => 'cold', 'cache_group' => 'wpdo_cold_hp_vendor', 'cache_ttl' => HOUR_IN_SECONDS, ), array( 'post_type' => 'hp_vendor', 'meta_key' => 'tmeetic_ig_user_id', 'zone' => 'cold', 'cache_group' => 'wpdo_cold_hp_vendor', 'cache_ttl' => HOUR_IN_SECONDS, ), ) ); } /** * Register infocards custom tables so they appear in `wp wpdo doctor`, * `benchmark`, and `cleanup` tooling. * * @param TMDO_Custom_Table_Registry $registry Custom Table Registry singleton. * @return void */ public static function register_custom_tables( TMDO_Custom_Table_Registry $registry ): void { // CSS variable source — checked by WPDO doctor for index health. $registry->register( '2meet-infocards', array( 'table_name' => '2meet_vendor_profiles', 'primary_key' => 'vendor_id', 'post_type_link' => 'hp_vendor', 'doctor_callback' => array( __CLASS__, 'doctor_vendor_profiles' ), ) ); $registry->register( '2meet-infocards', array( 'table_name' => '2meet_cards', 'primary_key' => 'id', 'post_type_link' => 'hp_vendor', ) ); $registry->register( '2meet-infocards', array( 'table_name' => '2meet_theme_styles', 'primary_key' => 'id', 'post_type_link' => null, ) ); } /** * Doctor check: verifies row count + sample read latency on vendor_profiles. * * @return array{ok:bool, message:string} */ public static function doctor_vendor_profiles(): array { global $wpdb; try { $exists = (bool) $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->prefix . '2meet_vendor_profiles' ) ); if ( ! $exists ) { return array( 'ok' => false, 'message' => 'wp_2meet_vendor_profiles table missing', ); } $count = (int) $wpdb->get_var( "SELECT COUNT(*) FROM `{$wpdb->prefix}2meet_vendor_profiles`" ); return array( 'ok' => true, 'message' => "wp_2meet_vendor_profiles: {$count} rows", ); } catch ( \Throwable $e ) { return array( 'ok' => false, 'message' => 'doctor failed: ' . $e->getMessage(), ); } } /** * Cache key for a vendor profile blob (used by inject_profile_styles). * * @param int $vendor_id Vendor post ID. */ public static function vendor_profile_cache_key( int $vendor_id ): string { return 'wpdo_vendor_profile_' . $vendor_id; } }