Skip to content

Architecture

Rondo Club is a React-powered WordPress theme for sports club management.

Entry point: functions.php

The theme initializes on after_setup_theme and plugins_loaded, loading 65+ classes from includes/, organized by domain:

Core:

ClassResponsibility
PostTypesRegisters Person, Team, Commissie, Todo, Feedback, Discipline Case, Invoice CPTs
TaxonomiesRegisters relationship types and seizoen taxonomy
AutoTitleAuto-generates post titles
AccessControlRow-level user data filtering
UserRolesRegisters custom “Rondo User” role
ClubConfigClub-level configuration (Sportlink credentials, etc.)
CredentialEncryptionEncrypts sensitive stored credentials
RemindersDaily digest reminder system
CommentTypesNotes and Activities system
Mentions / MentionNotifications@mention parsing and notification delivery
VolunteerStatusComputes huidig-vrijwilliger from work history
InverseRelationshipsBidirectional relationship sync
UserProvisioningCreates WordPress accounts from person records
FunctieCapabilityMapMaps Sportlink functies to Rondo roles

REST API:

ClassResponsibility
RestApiMain /rondo/v1/ endpoints (dashboard, search, fees, settings)
RestPeoplePerson-specific REST enhancements (computed fields, filtering)
RestTeamsTeam-specific REST enhancements
RestInvoicesInvoice CRUD, PDF, email, payment, installment endpoints
RestCommissiesCommissie REST enhancements
RestTodosTodo REST enhancements
RestFeedbackFeedback REST endpoints
RestCustomFieldsUser-defined custom fields REST endpoints
RestGoogleSheetsGoogle Sheets export endpoints
RestImportExportDemo import/export endpoints

Finance & Payments:

ClassResponsibility
MembershipFeesFee calculation, categories, family discounts, snapshots
FeeCacheInvalidatorClears fee snapshots when relevant data changes
FinanceConfigFinance settings (email templates, payment terms, installment config)
InvoiceNumberingSequential invoice numbers with type-specific prefixes
InvoicePdfGeneratorPDF generation for invoices
InvoiceEmailSenderInvoice email delivery
BulkInvoiceCreatorBatch invoice creation from fee calculations
MollieClientMollie payment gateway client
MolliePaymentPayment creation and management
MollieWebhookPublic webhook for payment status updates
PublicPaymentPagePublic payment page (no auth required)
QrCodeGeneratorQR codes for payment links
InstallmentPaymentServiceInstallment plan management
InstallmentEmailSenderInstallment reminder emails
InstallmentSchedulerScheduled installment processing
RabobankOauth / RabobankPaymentRabobank payment integration

Integrations:

ClassResponsibility
CalendarMatcherMatches calendar events to people
GoogleOauth / GoogleSheetsConnectionGoogle API integration
VogEmailVOG request email sending
VcardExportvCard contact export

Demo System:

ClassResponsibility
DemoAnonymizerAnonymizes data for demo exports
DemoExport / DemoImportDemo data export/import
DemoProtectionPrevents destructive operations in demo mode

ACF field groups are stored as JSON in acf-json/ for version control.

Entry point: src/main.jsx

A React SPA with:

  • Routing: React Router 6 with ProtectedRoute wrapper
  • State: TanStack Query for server state, Zustand for client state
  • API client: Axios with WordPress nonce injection
  • Two API namespaces:
    • /wp/v2/ — Standard WordPress REST (people, teams, commissies)
    • /rondo/v1/ — Custom endpoints (dashboard, search, timeline)
Terminal window
npm run dev # Vite dev server (port 5173, HMR)
npm run build # Production build to dist/
npm run lint # ESLint (max-warnings: 0)

The theme auto-detects the Vite dev server when WP_DEBUG is enabled. In production, assets load from dist/ via manifest.json.