' ); add_menu_page( __( 'AgentGarrison Network', 'agentgarrison' ), __( 'AgentGarrison', 'agentgarrison' ), 'manage_network_options', 'agentgarrison-network', array( $this, 'render_network_page' ), $svg, 76 ); } // ------------------------------------------------------------------------- // Per-site data collection // ------------------------------------------------------------------------- private function get_site_data( $site_id ) { switch_to_blog( $site_id ); $score_cache = get_option( 'rayetun_ag_visibility_score_cache', array() ); $llms_settings = get_option( 'rayetun_ag_llms_settings', array() ); $llms_health = get_option( 'rayetun_ag_llms_health', array() ); global $wpdb; $visits_table = $wpdb->prefix . 'rayetun_ag_bot_visits'; $referrals_table = $wpdb->prefix . 'rayetun_ag_llm_referrals'; $tables_exist = $wpdb->get_var( // phpcs:ignore WordPress.DB.DirectDatabaseQuery $wpdb->prepare( 'SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = %s', $visits_table ) ); $visits_30d = 0; $refs_30d = 0; if ( $tables_exist ) { $since = gmdate( 'Y-m-d H:i:s', strtotime( '-30 days' ) ); $visits_30d = (int) $wpdb->get_var( // phpcs:ignore WordPress.DB.DirectDatabaseQuery $wpdb->prepare( 'SELECT COUNT(*) FROM %i WHERE visited_at > %s', $visits_table, $since ) ); $refs_30d = (int) $wpdb->get_var( // phpcs:ignore WordPress.DB.DirectDatabaseQuery $wpdb->prepare( 'SELECT COUNT(*) FROM %i WHERE visited_at > %s', $referrals_table, $since ) ); } $blog_details = get_blog_details( $site_id ); $data = array( 'site_id' => $site_id, 'site_name' => $blog_details->blogname, 'site_url' => $blog_details->siteurl, 'dashboard_url' => get_admin_url( $site_id, 'admin.php?page=agentgarrison' ), 'score' => absint( $score_cache['score'] ?? 0 ), 'grade' => $score_cache['grade'] ?? '—', 'llms_ok' => ! empty( $llms_health['ok'] ), 'llms_generated' => ! empty( $llms_settings['last_generated'] ), 'visits_30d' => $visits_30d, 'refs_30d' => $refs_30d, ); restore_current_blog(); return $data; } // ------------------------------------------------------------------------- // Network page render // ------------------------------------------------------------------------- public function render_network_page() { $sites = get_sites( array( 'number' => 200 ) ); $sites_data = array(); foreach ( $sites as $site ) { $sites_data[] = $this->get_site_data( $site->blog_id ); } // Sort by score descending. usort( $sites_data, function( $rayetun_ag_na, $rayetun_ag_nb ) { return $rayetun_ag_nb['score'] - $rayetun_ag_na['score']; } ); $network_avg = count( $sites_data ) > 0 ? (int) ( array_sum( array_column( $sites_data, 'score' ) ) / count( $sites_data ) ) : 0; $total_visits = array_sum( array_column( $sites_data, 'visits_30d' ) ); $total_refs = array_sum( array_column( $sites_data, 'refs_30d' ) ); ?>

= 70 ? '#2E7D32' : ( $rayetun_ag_ns['score'] >= 50 ? '#F0A500' : '#C62828' ); ?>
/ 100 () ✗
__( 'Forbidden', 'agentgarrison' ) ), 403 ); } $sites = get_sites( array( 'number' => 200 ) ); $data = array_map( function( $site ) { return $this->get_site_data( $site->blog_id ); }, $sites ); wp_send_json_success( $data ); } }