Description
Swim Club Manager is a WordPress plugin for managing all aspects of a swimming club:
- Members — full profiles (personal info, club details, membership fees, equipment orders, competition entries, results) organized into tabs on a single edit screen
- Attendance — per-session log with present / absent / excused status
- Groups & Schedules — training groups with weekly schedule management
- Competition Calendar — upcoming meets with participant tracking
- Competition Entries & Results — log which disciplines a member is entered in per meet (including relay leg/stroke and pool length), and see their personal-best times automatically summarized in a year-by-year, pool-length results matrix
- Club Equipment Catalog — club gear with stock and pricing info
All data is managed through the WordPress admin. Shortcodes are available for frontend display — see Shortcodes below, or the full list with a copy-paste-ready syntax on the plugin’s Dashboard page in wp-admin.
Shortcodes
[swimclma_groups_schedule program="competitive" season="2025-26"]— training groups & weekly schedule (both attributes optional)[swimclma_competition_calendar season="2025-26"]— upcoming competitions for a season[swimclma_equipment_catalog in_stock="1"]— club equipment catalog with an “order via email” form[swimclma_member_list program="competitive"]— member list (visible to logged-in staff only)[swimclma_attendance_stats member_id="123"]— one member’s attendance rate[swimclma_member_results member_id="123"]— one member’s personal-best times, grouped by pool length, year and discipline
Developer Notes
Autoloading
Classes are loaded via Composer’s PSR-4 autoloader (vendor/autoload.php), required once at the top of swim-club-manager.php.
composer.json maps the `SwimClub` namespace to three base directories:
SwimClub\includes/SwimClub\Admin\admin/SwimClub\Public\public/
Sub-namespaces map to subdirectories one-to-one, and the filename must match the class name exactly (PSR-4):
SwimClub\PostTypes\Memberincludes/PostTypes/Member.phpSwimClub\Taxonomies\Age_Categoryincludes/Taxonomies/Age_Category.phpSwimClub\DB\EquipmentOrdersincludes/DB/EquipmentOrders.php-
SwimClub\Admin\Adminadmin/Admin.phpincludes/Plugin.php (
SwimClub\Plugin, the bootstrap singleton returned byswim_club_manager()) wires up admin/public hooks, post types, taxonomies, shortcodes, and REST routes — each referenced class is autoloaded lazily when first instantiated, not eagerly required.
Admin controllers
admin/Admin.php only handles enqueueing, menu registration, page-partial rendering, and meta boxes. Form/CRUD handling (the `admin_post_swimclma_*` actions) lives one-per-domain under `admin/Controllers/` (`SwimClub\Admin\Controllers\`) — `MemberController`, `GroupController`, `AttendanceController`, `CompetitionController`, `EquipmentController`, `EquipmentOrderController`, `MembershipFeeController`, `CompetitionEntryController`, `SettingsController`. Each exposes `save()` / `delete()` (and `update_status()` where relevant) and is wired directly to its `admin_post_*` hook in `Plugin::define_admin_hooks()`. They all extend the abstract `Controller` base class, which provides the shared nonce/capability guard helpers (`verify_nonce_or_die()`, `verify_request_nonce_or_die()`, `require_cap_or_die()`).
Working with the code
- After pulling changes that add/rename/move a class, run
composer dump-autoload -oto regenerate the optimized classmap invendor/. vendor/is committed and ships with the plugin — WordPress installs don’t run a Composer build step, so it must be present in the deployed copy.- Non-class files (admin partials, public partials, JS/CSS) are
included directly by the components that render them and are unaffected by autoloading. - Public-facing shortcode styles are written as Sass (
public/scss/) — one BEM component per shortcode underpublic/scss/components/, shared tokens/mixins underpublic/scss/abstracts/, compiled topublic/css/public.cssvianpm install && npm run build:css(ornpm run watch:csswhile editing). Likevendor/,public/css/public.cssis committed and ships with the plugin — regenerate it after any.scsschange, since WordPress installs don’t run this build step either. It’s enqueued bySwimClub\Public\PublicAssets::enqueue_styles()(wired inPlugin::define_public_hooks()), which only loads it on pages whose content contains one of the plugin’s shortcodes. includes/Activator.phpandincludes/Deactivator.phpare autoloaded like everything else; they don’t need to be required manually beforeplugins_loadedsinceregister_activation_hook()/register_deactivation_hook()only invoke their callback once WordPress actually fires the (de)activation event, by which point the autoloader is already registered.
Installation
- Upload the
swim-club-managerfolder to/wp-content/plugins/ - Activate through the Plugins menu
- Configure under Swim Club Settings
Reviews
There are no reviews for this plugin.
Contributors & Developers
“Swim Club Manager” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Swim Club Manager” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.2.0
- Members list: removed the City column and adjusted the Name, Group, and Membership Fee column widths
- Club Equipment list: the Size, Condition, Purchased, and Notes columns now hide below a 1500px viewport width for a cleaner view on smaller admin screens
- Admin controllers refactored to share common save/delete logic via the base Controller class (internal, no behavior change)
1.1.0
- Members admin page reorganized into tabs: Personal Information, Club Details, Membership Fee Payments, Club Equipment Orders, Competition Entries, and Results
- Competition entries: added an Edit action on the entries table, a wider result-time field, and a per-entry pool length (25m/50m, auto-filled from the competition)
- Competition disciplines: added 4x50m and 4x100m Freestyle Relay; the existing 4x50m/4x100m (medley) Relay disciplines now record which leg (1st–4th) and stroke a member swam
- New: personal-bests results matrix per member — best time per pool length / year / discipline, with an all-time-best row and a relay results table. Available as the “Results” tab in admin and via the new
[swimclma_member_results]shortcode on the frontend - New: Shortcodes list on the Dashboard page for quick copy-paste reference
- Admin CSS and the Members admin template refactored into smaller per-component files for maintainability
1.0.0
- Initial release
