System Architecture
The Manage Rhino Group platform is a WordPress installation with five custom plugins that work together to provide a comprehensive management dashboard for all Rhino Group client sites.
Directory Structure
Z:\Herd\manage/
├── wp-config.php ← Database config, debug settings, osTicket DB constant
├── cron/ ← 18+ scheduled task scripts
├── tools/ ← Admin utility scripts (indexing checks, webhook tests)
├── wp-content/
│ ├── plugins/
│ │ ├── suma-management/ ← Core management plugin (v1.1.0)
│ │ ├── suma-gemini/ ← Gemini AI integration (v1.0.0)
│ │ ├── suma-harvest/ ← Harvest time tracking (v1.0.0)
│ │ ├── suma-order-volume-monitor/ ← Order monitoring (v1.2.2)
│ │ ├── suma-toolshed/ ← Tools framework (v1.0.0)
│ │ ├── mainwp/ ← MainWP Dashboard (v4.5.2)
│ │ ├── advanced-custom-fields-pro/
│ │ ├── wordfence/
│ │ ├── wp-mail-smtp/
│ │ ├── zapier/
│ │ └── [other utility plugins]
│ ├── themes/
│ │ └── twentyseventeen/ ← Default theme (UI is plugin-driven)
│ └── debug.log ← Error log (WP_DEBUG_LOG enabled)
└── [standard WordPress core files]
Plugin Ecosystem
How the Plugins Interact
┌─────────────────────────────────────────────────────────────┐
│ WordPress Core │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ MainWP Dashboard │────▶│ Suma Management │ │
│ │ (site sync data) │ │ (core platform) │ │
│ └──────────────────┘ └────────┬─────────┘ │
│ │ │
│ ┌─────────────────────────┼──────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌────────────────┐ ┌──────────────────┐ ┌───────────┐ │
│ │ Suma Harvest │ │ Suma Gemini │ │ Suma │ │
│ │ (time/budget) │ │ (AI analysis) │ │ Toolshed │ │
│ └────────────────┘ └──────────────────┘ └───────────┘ │
│ │
│ ┌──────────────────────────┐ │
│ │ Suma Order Volume │ │
│ │ Monitor (e-commerce) │ │
│ └──────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
Plugin Dependencies
| Plugin | Depends On | Provides To |
|---|---|---|
| Suma Management | MainWP (site data), ACF Pro (settings) | Site model used by Toolshed; hooks consumed by Pinecone |
| Suma Gemini | None (standalone REST API) | Ticket urgency endpoint consumed by osTicket |
| Suma Harvest | Suma Management (email templates) | Budget data for dashboards |
| Suma Order Volume Monitor | ACF Pro (settings) | Alert notifications |
| Suma Toolshed | Suma Management (site model, DB tables) | REST routes for BigCommerce/WooCommerce operations |
WordPress Configuration
Key Constants (wp-config.php)
| Constant | Value | Purpose |
|---|---|---|
DB_NAME | managerhinogroup | Primary database |
OSTICKETS_DBNAME | ostickets | Cross-database access to ticket system |
WP_DEBUG | true | Debug mode enabled |
WP_DEBUG_LOG | true | Logs to wp-content/debug.log |
WP_DEBUG_DISPLAY | false | Errors hidden from frontend |
Database Access
The site has access to two databases:
- managerhinogroup — Primary WordPress database with all custom tables
- ostickets — Read access to the osTicket database for cross-system queries
Request Flow
Admin Dashboard Request
Browser → manage.rhinogroup.com/wp-admin/admin.php?page=suma_sites
→ WordPress loads admin page
→ Suma Management registers menu pages
→ Sites class renders site list view
→ AJAX calls to admin-ajax.php for dynamic data
→ Response rendered with Bootstrap + custom CSS
REST API Request (External)
External System → POST /wp-json/suma/gemini/ticket-urgency
→ WordPress REST API routing
→ Suma Gemini validates request (API key, rate limit)
→ Gemini AI processes ticket data
→ JSON response returned
Cron Job Execution
Server cron (every 5 min) → php cron/site-updates.php
→ WordPress bootstrap loaded
→ Suma Management API instantiated
→ update_sites_cron() processes 15 sites from queue
→ Site_Update syncs each site with MainWP data
→ suma_site_updated hook fires → Pinecone auto-sync
Authentication & Access
| Access Type | Method |
|---|---|
| Admin Dashboard | WordPress login (manage_options capability) |
| REST API (Gemini) | API key header (suma-gemini-security-key) or WordPress nonce |
| REST API (Harvest) | Public endpoints (triggered by cron) |
| REST API (Toolshed) | Per-route permissions |
| AJAX Endpoints | WordPress nonce + manage_options capability |
| Cron Scripts | Server-level access (direct PHP execution) |
External Service Architecture
┌──────────────────────────────────────────────┐
│ manage.rhinogroup.com │
└──────────────┬───────────────────────────────┘
│
┌──────────┼──────────────────────────────┐
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
┌────────┐ ┌────────┐ ┌───────┐ ┌───────┐ ┌────────┐
│Pinecone│ │ Gemini │ │Harvest│ │ Asana │ │ Cloud │
│Vector │ │ AI │ │ API │ │ API │ │ flare │
│ DB │ │ │ │ │ │ │ │ SDK │
└────────┘ └────────┘ └───────┘ └───────┘ └────────┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
┌────────┐ ┌────────┐ ┌───────┐ ┌───────┐ ┌────────┐
│Uptime │ │WP │ │Google │ │MS │ │Envato │
│Robot │ │Engine │ │Sheets │ │Teams │ │ API │
│ API │ │ API │ │ API │ │Webhook│ │ │
└────────┘ └────────┘ └───────┘ └───────┘ └────────┘
Namespaces & Autoloading
| Plugin | Namespace | Autoloading |
|---|---|---|
| Suma Management | Suma | Manual require_once (30+ class files) |
| Suma Gemini | Suma\Gemini | Composer PSR-4 |
| Suma Harvest | Suma_Harvest | Manual require_once (13 class files) |
| Suma Order Volume Monitor | Suma\OrderVolumeMonitor | Manual require_once |
| Suma Toolshed | Suma\ToolShed | Manual require_once + dynamic route discovery |
Build & Assets
| Plugin | Build System | Frontend |
|---|---|---|
| Suma Management | None (raw CSS/JS) | Bootstrap 5, jQuery, custom CSS |
| Suma Gemini | Laravel Mix + Webpack | Tailwind CSS, admin.js |
| Suma Harvest | None | Bootstrap 5.3.2 (CDN) |
| Suma Order Volume Monitor | None | ACF admin UI |
| Suma Toolshed | None | WordPress admin |
Error Handling
- PHP errors →
wp-content/debug.log(WP_DEBUG_LOG) - API errors → Returned as WP_Error with HTTP status codes
- Gemini errors → Retry with exponential backoff + model fallback chain
- Harvest sync → 10-second sleep delays for rate limiting
- Order volume → File-based logging in
wp-content/uploads/suma-logs/ - Cron failures → Logged via WordPress error_log