' );
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 );
}
}