array( 'label' => __( 'Publisher / Media', 'ai-o-optimiser' ), 'description' => __( 'News, magazines, editorial publishers and media organisations.', 'ai-o-optimiser' ), 'icon' => 'dashicons-media-document' ),
'editorial_content' => array( 'label' => __( 'Editorial / Content', 'ai-o-optimiser' ), 'description' => __( 'Blogs, knowledge sites and content-led publications.', 'ai-o-optimiser' ), 'icon' => 'dashicons-edit' ),
'commerce_marketplace' => array( 'label' => __( 'Commerce / Marketplace', 'ai-o-optimiser' ), 'description' => __( 'Product catalogues, stores and multi-seller marketplaces.', 'ai-o-optimiser' ), 'icon' => 'dashicons-cart' ),
'directory_listings' => array( 'label' => __( 'Directory / Listings', 'ai-o-optimiser' ), 'description' => __( 'Sites built around many individual organisations, places, people or listings.', 'ai-o-optimiser' ), 'icon' => 'dashicons-list-view' ),
'service_business' => array( 'label' => __( 'Services / Expertise', 'ai-o-optimiser' ), 'description' => __( 'Businesses centred on services, solutions, consulting or expertise.', 'ai-o-optimiser' ), 'icon' => 'dashicons-portfolio' ),
'software_platform' => array( 'label' => __( 'Software / Platform', 'ai-o-optimiser' ), 'description' => __( 'SaaS, applications, digital products and online platforms.', 'ai-o-optimiser' ), 'icon' => 'dashicons-admin-generic' ),
'organisation_community' => array( 'label' => __( 'Organisation / Community', 'ai-o-optimiser' ), 'description' => __( 'Associations, nonprofits, membership bodies and community organisations.', 'ai-o-optimiser' ), 'icon' => 'dashicons-groups' ),
'local_place_business' => array( 'label' => __( 'Local / Place-led', 'ai-o-optimiser' ), 'description' => __( 'A business or organisation whose physical place or service area is central.', 'ai-o-optimiser' ), 'icon' => 'dashicons-location' ),
'mixed_general' => array( 'label' => __( 'Mixed / General', 'ai-o-optimiser' ), 'description' => __( 'A mixed-purpose site that does not fit one dominant operating model.', 'ai-o-optimiser' ), 'icon' => 'dashicons-admin-site-alt3' ),
);
}
/** Optional subject/domain layer. Domain selection informs guidance, not requirements. */
public static function domains() {
return array(
'general' => __( 'General / Mixed', 'ai-o-optimiser' ),
'technology_software' => __( 'Technology / Software', 'ai-o-optimiser' ),
'professional_services' => __( 'Professional Services', 'ai-o-optimiser' ),
'education' => __( 'Education / Training', 'ai-o-optimiser' ),
'healthcare' => __( 'Healthcare / Medical', 'ai-o-optimiser' ),
'fitness_wellness' => __( 'Fitness / Wellness', 'ai-o-optimiser' ),
'hospitality_travel' => __( 'Hospitality / Travel', 'ai-o-optimiser' ),
'food_dining' => __( 'Food / Dining', 'ai-o-optimiser' ),
'property_real_estate' => __( 'Property / Real Estate', 'ai-o-optimiser' ),
'jobs_recruitment' => __( 'Jobs / Recruitment', 'ai-o-optimiser' ),
'events_entertainment' => __( 'Events / Entertainment', 'ai-o-optimiser' ),
'retail_products' => __( 'Retail / Products', 'ai-o-optimiser' ),
'nonprofit_membership' => __( 'Nonprofit / Membership', 'ai-o-optimiser' ),
'local_places' => __( 'Places / Local Directory', 'ai-o-optimiser' ),
);
}
/** Render the site-model panel. */
public static function render() {
if ( ! current_user_can( self::capability() ) || ! self::is_profile_screen() ) {
return;
}
$page = self::current_page();
$current = AI_O_Optimiser_Site_Profile::current();
$confirmed = ! empty( $current['profile'] );
$suggested_profile = AI_O_Optimiser_Site_Profile::suggested_profile();
$suggested_model = self::model_from_legacy_profile( $suggested_profile );
$selected_model = ! empty( $current['site_model'] ) && isset( self::site_models()[ $current['site_model'] ] )
? (string) $current['site_model']
: self::model_from_legacy_profile( (string) ( $current['profile'] ?? $suggested_profile ) );
$suggested_domain = self::suggested_domain();
$selected_domain = ! empty( $current['primary_domain'] ) && isset( self::domains()[ $current['primary_domain'] ] )
? (string) $current['primary_domain']
: $suggested_domain;
$news_selected = ! empty( $current['news_post_types'] )
? AI_O_Optimiser_Site_Profile::validate_news_post_types( $current['news_post_types'] )
: AI_O_Optimiser_Site_Profile::suggested_news_post_types();
$models = self::site_models();
$domains = self::domains();
self::render_saved_notice();
?>
' . esc_html__( 'Site model saved.', 'ai-o-optimiser' ) . ' '; if ( ! empty( $_GET['ai_o_optimiser_profile_scope'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only screen state (page slug, tab, redirect result notices). Nothing is written here, so there is no form submission to carry a nonce. echo esc_html__( 'Schema Audit scope was updated to the selected publisher content types.', 'ai-o-optimiser' ) . ' '; } echo esc_html__( 'Run a fresh Schema Audit after changing model or mappings; cached evidence is not silently rewritten.', 'ai-o-optimiser' ) . '