{"id":357960,"date":"2026-08-29T09:34:18","date_gmt":"2026-08-29T09:34:18","guid":{"rendered":"https:\/\/de.wordpress.org\/plugins\/club-sports-manager\/"},"modified":"2026-08-29T17:07:52","modified_gmt":"2026-08-29T17:07:52","slug":"squadeno-club-sports-manager","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/squadeno-club-sports-manager\/","author":7754360,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.8.1","stable_tag":"1.8.1","tested":"7.1","requires":"6.7","requires_php":"8.1","requires_plugins":null,"header_name":"Squadeno - Club Sports Manager","header_author":"Thomas Schiffler","header_description":"Manage the sports offerings of a club: sports, trainers, training times, venues, holidays, events and an automatic calendar.","assets_banners_color":"14513f","last_updated":"2026-08-29 17:07:52","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/squadeno.com","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":39,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.8.0":{"tag":"1.8.0","author":"tschiffler","date":"2026-08-29 09:34:00","revision":3671311},"1.8.1":{"tag":"1.8.1","author":"tschiffler","date":"2026-08-29 17:07:52","revision":3671752}},"upgrade_notice":{"1.8.1":"<p>Text only: the directory page reads better and is now available in German. Nothing changes in the plugin, so there is no hurry.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3671311,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3671311,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3671311,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3671311,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"csmgr\/kalender":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"csmgr\/kalender","version":"1.0.0","title":"Club Calendar","category":"squadeno-club-sports-manager","icon":"calendar-alt","description":"Calendar with all dates of the club.","keywords":["calendar","dates","club sports"],"textdomain":"squadeno-club-sports-manager","attributes":{"view":{"type":"string","default":"month"}},"supports":{"html":false},"editorScript":"file:.\/index.js"},"csmgr\/sportarten":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"csmgr\/sportarten","version":"1.0.0","title":"Sports Overview","category":"squadeno-club-sports-manager","icon":"grid-view","description":"Grid of all sports of the club.","keywords":["sports","club sports","offers"],"textdomain":"squadeno-club-sports-manager","supports":{"html":false},"editorScript":"file:.\/index.js"},"csmgr\/naechste-termine":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"csmgr\/naechste-termine","version":"1.0.0","title":"Upcoming Dates","category":"squadeno-club-sports-manager","icon":"clock","description":"The upcoming dates of a sport.","keywords":["dates","training","club sports"],"textdomain":"squadeno-club-sports-manager","attributes":{"sport":{"type":"number","default":0},"limit":{"type":"number","default":5}},"supports":{"html":false},"editorScript":"file:.\/index.js"}},"tagged_versions":["1.8.0","1.8.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3671311,"resolution":"1","location":"assets","locale":"","width":1280,"height":1024},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3671311,"resolution":"2","location":"assets","locale":"","width":1280,"height":1585},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3671311,"resolution":"3","location":"assets","locale":"","width":1280,"height":1338},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3671311,"resolution":"4","location":"assets","locale":"","width":1280,"height":1201},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3671311,"resolution":"5","location":"assets","locale":"","width":1280,"height":924},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3671311,"resolution":"6","location":"assets","locale":"","width":1280,"height":1214}},"screenshots":{"1":"All sports at a glance on the website, with filters for age group and section.","2":"A sport's own page: training times, contacts and the automatically generated upcoming dates \u2013 holidays are blocked automatically.","3":"The club-wide calendar (month or week view) with trainings, events and closures.","4":"The admin overview introduces new users to the plugin and where to maintain content.","5":"Guided setup in five steps.","6":"Roles and permissions explained, including the three trainer permission levels."}},"plugin_section":[],"plugin_tags":[416,14241,7114,4776,4775],"plugin_category":[37,40],"plugin_contributors":[277212],"plugin_business_model":[],"class_list":["post-357960","plugin","type-plugin","status-publish","hentry","plugin_tags-calendar","plugin_tags-club","plugin_tags-courses","plugin_tags-sports","plugin_tags-training","plugin_category-arts-and-entertainment","plugin_category-calendar-and-events","plugin_contributors-tschiffler","plugin_committers-tschiffler"],"banners":{"banner":"https:\/\/ps.w.org\/squadeno-club-sports-manager\/assets\/banner-772x250.png?rev=3671311","banner_2x":"https:\/\/ps.w.org\/squadeno-club-sports-manager\/assets\/banner-1544x500.png?rev=3671311","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/squadeno-club-sports-manager\/assets\/icon-128x128.png?rev=3671311","icon_2x":"https:\/\/ps.w.org\/squadeno-club-sports-manager\/assets\/icon-256x256.png?rev=3671311","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/squadeno-club-sports-manager\/assets\/screenshot-1.png?rev=3671311","caption":"All sports at a glance on the website, with filters for age group and section."},{"src":"https:\/\/ps.w.org\/squadeno-club-sports-manager\/assets\/screenshot-2.png?rev=3671311","caption":"A sport's own page: training times, contacts and the automatically generated upcoming dates \u2013 holidays are blocked automatically."},{"src":"https:\/\/ps.w.org\/squadeno-club-sports-manager\/assets\/screenshot-3.png?rev=3671311","caption":"The club-wide calendar (month or week view) with trainings, events and closures."},{"src":"https:\/\/ps.w.org\/squadeno-club-sports-manager\/assets\/screenshot-4.png?rev=3671311","caption":"The admin overview introduces new users to the plugin and where to maintain content."},{"src":"https:\/\/ps.w.org\/squadeno-club-sports-manager\/assets\/screenshot-5.png?rev=3671311","caption":"Guided setup in five steps."},{"src":"https:\/\/ps.w.org\/squadeno-club-sports-manager\/assets\/screenshot-6.png?rev=3671311","caption":"Roles and permissions explained, including the three trainer permission levels."}],"raw_content":"<!--section=description-->\n<p>In most clubs the training schedule exists. Getting it onto the website and keeping it there is the work. The plan lives in a PDF that is two seasons old, the summer break is still not on the calendar, and the person who knows when the hall is free is away for three weeks.<\/p>\n\n<p>Squadeno turns that around. You maintain the training schedule once, say Tuesday at 6 pm in the gym hall from September to June, and every single date is generated from it. Closures and school holidays block the affected sessions automatically. A cancelled session, a moved date or an extra session is handled on the date itself, and the change shows up everywhere that sport appears.<\/p>\n\n<p><strong>Who it is for:<\/strong> clubs with more than a handful of offerings that want every sport to have its own findable page, and that want trainers to keep their own dates current without being handed the keys to the whole site.<\/p>\n\n<h4>What you get<\/h4>\n\n<ul>\n<li><strong>Sports<\/strong> with their own SEO-friendly page; optional subgroups\/disciplines (e.g. athletics \u2192 kids\/youth).<\/li>\n<li><strong>Training times<\/strong> per sport \u2013 season- and weather-aware; location as a venue or free text.<\/li>\n<li><strong>Automatic calendar<\/strong>: dates are generated from the training schedule, holidays\/closures block automatically, exceptions (cancelled\/rescheduled\/extra date) and events are added on top.<\/li>\n<li><strong>Trainers<\/strong> with their own profile page; any number per sport (main\/assistant\/substitute).<\/li>\n<li><strong>Venues<\/strong> with address, GPS, photo and an automatic \"what takes place here\" list.<\/li>\n<li><strong>Events<\/strong> via a simple builder (open\/registration, costs, single- or multi-day).<\/li>\n<li><strong>Roles<\/strong>: the editorial team maintains everything; trainers edit only their assigned sports and their own profile.<\/li>\n<li><strong>SEO<\/strong>: clean URLs, internal linking and structured data (schema.org).<\/li>\n<li><strong>Performance<\/strong>: computed dates are cached (transient) and refreshed automatically on changes.<\/li>\n<\/ul>\n\n<p>The source language of the plugin is English; a complete German translation (de_DE) is bundled. Public URL slugs default to English and can be localized per site in the settings.<\/p>\n\n<h4>Putting it on the page<\/h4>\n\n<p>Shortcodes (blocks with the same output are also available):<\/p>\n\n<ul>\n<li><code>[csmgr_sports]<\/code> \u2013 overview of all sports with filters (age group\/section).<\/li>\n<li><code>[csmgr_calendar view=\"month\"]<\/code> \u2013 club-wide calendar (<code>view=\"month\"<\/code> or <code>view=\"week\"<\/code>).<\/li>\n<li><code>[csmgr_upcoming sport=\"ID\" limit=\"5\"]<\/code> \u2013 upcoming dates of a sport.<\/li>\n<\/ul>\n\n<h4>More about the plugin<\/h4>\n\n<p>The project page at <a href=\"https:\/\/squadeno.com\">squadeno.com<\/a> covers the same ground in more detail, with larger screenshots and a German version of the text.<\/p>\n\n<h4>Privacy by default<\/h4>\n\n<p>Maps are optional and switched off by default: no map data is requested from any external server until an administrator selects the map provider \"OpenStreetMap\" in the settings. The Leaflet map library (BSD-2-Clause) is bundled with the plugin and served locally; it is not loaded from a CDN.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin relies on the following third-party services. It does not send any data unless the corresponding feature is used.<\/p>\n\n<p><strong>OpenStreetMap map tiles (optional, disabled by default)<\/strong> \u2013 Maps are off out of the box: the setting \"Map provider\" (Club Sports \u2192 Settings \u2192 Calendar &amp; maps) defaults to \"none\", and while it is set to \"none\" the plugin contacts no map server at all, neither on the public website nor in the WordPress admin area. Only after an administrator explicitly selects \"OpenStreetMap\" does the browser load map tiles directly from the OpenStreetMap tile servers (<code>tile.openstreetmap.org<\/code>), on venue pages with coordinates and on the venue editor screen in wp-admin. This transmits the IP address and the requested map section to OpenStreetMap. As a fallback for visitors without JavaScript, an embedded map from <code>openstreetmap.org<\/code> may be displayed. No tracking, analytics or usage data is collected by the plugin or sent anywhere.\nTerms\/attribution: https:\/\/www.openstreetmap.org\/copyright \u2013 Privacy policy: https:\/\/wiki.osmfoundation.org\/wiki\/Privacy_Policy<\/p>\n\n<p><strong>Nominatim geocoding (OpenStreetMap) (optional, disabled by default)<\/strong> \u2013 Part of the same opt-in: only when the map provider \"OpenStreetMap\" is enabled, and only when an editor clicks the \"Determine coordinates from address\" button in the venue editor, the address typed into the form is sent to the Nominatim service (<code>nominatim.openstreetmap.org<\/code>) to look up coordinates. It is never called on the public website, and it is not called at all while maps are disabled.\nUsage policy: https:\/\/operations.osmfoundation.org\/policies\/nominatim\/ \u2013 Privacy policy: https:\/\/wiki.osmfoundation.org\/wiki\/Privacy_Policy<\/p>\n\n<p><strong>Cloudflare Turnstile (optional, disabled by default)<\/strong> \u2013 Only if an administrator enables Turnstile in the settings, the plugin loads the Turnstile widget script from Cloudflare (<code>challenges.cloudflare.com<\/code>) on pages that show a trainer contact form, and on submission sends the challenge token together with the visitor's IP address to Cloudflare for bot verification. When Turnstile is disabled, no data is sent to Cloudflare.\nTerms of use: https:\/\/www.cloudflare.com\/website-terms\/ \u2013 Privacy policy: https:\/\/www.cloudflare.com\/privacypolicy\/<\/p>\n\n<h3>Source code and build<\/h3>\n\n<p>The plugin ships with the complete, human-readable source of every generated file, plus the tooling needed to regenerate it. Nothing is obfuscated.<\/p>\n\n<p><strong>Editor blocks<\/strong> \u2013 <code>build\/&lt;block&gt;\/index.js<\/code> is generated and minified. The readable ES module source of each of these files is included in the plugin under <code>blocks\/&lt;block&gt;\/index.js<\/code> (same folder name, e.g. <code>blocks\/kalender\/index.js<\/code> \u2192 <code>build\/kalender\/index.js<\/code>).<\/p>\n\n<p>Build tooling: <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/scripts\">@wordpress\/scripts<\/a> (webpack + Babel), declared in the bundled <code>package.json<\/code> \/ <code>package-lock.json<\/code>. To regenerate the files from the shipped sources, run inside the plugin folder:<\/p>\n\n<pre><code>npm ci\nnpm run build\n<\/code><\/pre>\n\n<p>which executes <code>wp-scripts build --webpack-src-dir=blocks<\/code> and writes <code>build\/<\/code>.<\/p>\n\n<p><strong>PHP<\/strong> \u2013 All PHP is plain, unminified source under <code>src\/<\/code> (PSR-4, autoloaded via Composer; see the bundled <code>composer.json<\/code> \/ <code>composer.lock<\/code>). <code>assets\/js\/*.js<\/code> and <code>assets\/css\/*.css<\/code> are hand-written and unminified as well.<\/p>\n\n<p><strong>Third-party libraries<\/strong><\/p>\n\n<ul>\n<li>Leaflet 1.9.4 \u2013 interactive maps, BSD-2-Clause. Bundled locally in <code>assets\/vendor\/leaflet\/<\/code> (upstream distribution build, including <code>LICENSE<\/code>); it is never loaded from a CDN. Project and full source: https:\/\/github.com\/Leaflet\/Leaflet \u2013 release used: https:\/\/github.com\/Leaflet\/Leaflet\/releases\/tag\/v1.9.4<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Copy the <code>squadeno-club-sports-manager<\/code> folder into <code>wp-content\/plugins\/<\/code> (or upload the plugin ZIP).<\/li>\n<li>Activate it under \"Plugins\" in the WordPress admin. This creates the content types, roles and default seasons.<\/li>\n<li>Maintain sports, trainers, venues and events under the new menu entries.<\/li>\n<li>Create pages with the shortcodes or blocks (overview, calendar).<\/li>\n<li>Optional: adjust the URL bases (slugs) in the plugin settings, then open Settings \u2192 Permalinks once to refresh the links.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"can%20trainers%20maintain%20their%20own%20content%3F\"><h3>Can trainers maintain their own content?<\/h3><\/dt>\n<dd><p>Yes. Trainers get a restricted role and edit only the sports assigned to them as well as their own profile.<\/p><\/dd>\n<dt id=\"how%20are%20holidays%20handled%3F\"><h3>How are holidays handled?<\/h3><\/dt>\n<dd><p>Central closures automatically hide regular trainings within the period; events (e.g. holiday care) remain visible.<\/p><\/dd>\n<dt id=\"is%20the%20plugin%20compatible%20with%20caching%20plugins%3F\"><h3>Is the plugin compatible with caching plugins?<\/h3><\/dt>\n<dd><p>Yes. Dates are cached internally and invalidated whenever something changes, so a page or object cache on top only makes it faster.<\/p><\/dd>\n<dt id=\"in%20which%20languages%20is%20the%20plugin%20available%3F\"><h3>In which languages is the plugin available?<\/h3><\/dt>\n<dd><p>The interface is English by default and ships with a complete German translation (de_DE). Additional languages can be added via the bundled .pot file.<\/p><\/dd>\n<dt id=\"can%20the%20urls%20be%20in%20another%20language%3F\"><h3>Can the URLs be in another language?<\/h3><\/dt>\n<dd><p>Yes. The URL bases (e.g. <code>sports<\/code>, <code>trainers<\/code>) default to English and can be changed per site in the plugin settings, for example to German (<code>sportarten<\/code>, <code>trainer<\/code>). After changing them, open Settings \u2192 Permalinks once.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.8.1<\/h4>\n\n<ul>\n<li>Clearer wording on the plugin directory page, with a link to the project page.<\/li>\n<li>German translation of the directory page, in both the informal and the formal address.<\/li>\n<li>No changes to the plugin itself.<\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li>First public release in the WordPress plugin directory.<\/li>\n<\/ul>","raw_excerpt":"Training times, trainers and events for sports clubs, with a calendar that keeps itself current and blocks school holidays automatically.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/357960","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=357960"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/tschiffler"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=357960"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=357960"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=357960"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=357960"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=357960"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=357960"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}