{"id":376713,"date":"2026-09-29T19:40:56","date_gmt":"2026-09-29T19:40:56","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/table-tennis-tournament-for-clubs\/"},"modified":"2026-09-29T17:38:49","modified_gmt":"2026-09-29T17:38:49","slug":"table-tennis-tournament-for-clubs","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/table-tennis-tournament-for-clubs\/","author":853037,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.8","stable_tag":"trunk","tested":"7.1.2","requires":"6.3","requires_php":"7.4","requires_plugins":null,"header_name":"Table Tennis Tournament for Clubs","header_author":"Bjorn van der Neut","header_description":"Manage club table tennis players, tournaments, and tournament player assignments.","assets_banners_color":"e0d6c2","last_updated":"2026-09-29 17:38:49","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":62,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation"],"tags":{"1.0.0":{"tag":"1.0.0","author":"neutcomp","date":"2026-09-29 17:38:49","revision":3719528}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.jpeg":{"filename":"icon-128x128.jpeg","revision":3719528,"resolution":"128x128","location":"assets","locale":"","width":1024,"height":1024},"icon-256x256.jpeg":{"filename":"icon-256x256.jpeg","revision":3719528,"resolution":"256x256","location":"assets","locale":"","width":1024,"height":1024}},"assets_banners":{"banner-772x250.jpeg":{"filename":"banner-772x250.jpeg","revision":3719528,"resolution":"772x250","location":"assets","locale":"","width":1824,"height":576}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3719528,"resolution":"1","location":"assets","locale":"","width":284,"height":226},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3719528,"resolution":"10","location":"assets","locale":"","width":1068,"height":904},"screenshot-11.png":{"filename":"screenshot-11.png","revision":3719528,"resolution":"11","location":"assets","locale":"","width":1800,"height":1198},"screenshot-12.png":{"filename":"screenshot-12.png","revision":3719528,"resolution":"12","location":"assets","locale":"","width":2700,"height":1212},"screenshot-13.png":{"filename":"screenshot-13.png","revision":3719528,"resolution":"13","location":"assets","locale":"","width":1354,"height":1210},"screenshot-14.png":{"filename":"screenshot-14.png","revision":3719528,"resolution":"14","location":"assets","locale":"","width":1776,"height":1486},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3719528,"resolution":"2","location":"assets","locale":"","width":1390,"height":570},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3719528,"resolution":"3","location":"assets","locale":"","width":1234,"height":530},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3719528,"resolution":"4","location":"assets","locale":"","width":1578,"height":1302},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3719528,"resolution":"5","location":"assets","locale":"","width":1780,"height":1222},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3719528,"resolution":"6","location":"assets","locale":"","width":2922,"height":1138},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3719528,"resolution":"7","location":"assets","locale":"","width":1312,"height":1284},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3719528,"resolution":"8","location":"assets","locale":"","width":1566,"height":1528},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3719528,"resolution":"9","location":"assets","locale":"","width":960,"height":1350}},"screenshots":[]},"plugin_section":[],"plugin_tags":[11615,42427,283481,14116],"plugin_category":[],"plugin_contributors":[280872],"plugin_business_model":[],"class_list":["post-376713","plugin","type-plugin","status-publish","hentry","plugin_tags-clubs","plugin_tags-players","plugin_tags-table-tennis","plugin_tags-tournament","plugin_contributors-neutcomp","plugin_committers-neutcomp"],"banners":{"banner":"https:\/\/ps.w.org\/table-tennis-tournament-for-clubs\/assets\/banner-772x250.jpeg?rev=3719528","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/table-tennis-tournament-for-clubs\/assets\/icon-128x128.jpeg?rev=3719528","icon_2x":"https:\/\/ps.w.org\/table-tennis-tournament-for-clubs\/assets\/icon-256x256.jpeg?rev=3719528","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/table-tennis-tournament-for-clubs\/assets\/screenshot-1.png?rev=3719528","caption":""},{"src":"https:\/\/ps.w.org\/table-tennis-tournament-for-clubs\/assets\/screenshot-2.png?rev=3719528","caption":""},{"src":"https:\/\/ps.w.org\/table-tennis-tournament-for-clubs\/assets\/screenshot-3.png?rev=3719528","caption":""},{"src":"https:\/\/ps.w.org\/table-tennis-tournament-for-clubs\/assets\/screenshot-4.png?rev=3719528","caption":""},{"src":"https:\/\/ps.w.org\/table-tennis-tournament-for-clubs\/assets\/screenshot-5.png?rev=3719528","caption":""},{"src":"https:\/\/ps.w.org\/table-tennis-tournament-for-clubs\/assets\/screenshot-6.png?rev=3719528","caption":""},{"src":"https:\/\/ps.w.org\/table-tennis-tournament-for-clubs\/assets\/screenshot-7.png?rev=3719528","caption":""},{"src":"https:\/\/ps.w.org\/table-tennis-tournament-for-clubs\/assets\/screenshot-8.png?rev=3719528","caption":""},{"src":"https:\/\/ps.w.org\/table-tennis-tournament-for-clubs\/assets\/screenshot-9.png?rev=3719528","caption":""},{"src":"https:\/\/ps.w.org\/table-tennis-tournament-for-clubs\/assets\/screenshot-10.png?rev=3719528","caption":""},{"src":"https:\/\/ps.w.org\/table-tennis-tournament-for-clubs\/assets\/screenshot-11.png?rev=3719528","caption":""},{"src":"https:\/\/ps.w.org\/table-tennis-tournament-for-clubs\/assets\/screenshot-12.png?rev=3719528","caption":""},{"src":"https:\/\/ps.w.org\/table-tennis-tournament-for-clubs\/assets\/screenshot-13.png?rev=3719528","caption":""},{"src":"https:\/\/ps.w.org\/table-tennis-tournament-for-clubs\/assets\/screenshot-14.png?rev=3719528","caption":""}],"raw_content":"<!--section=description-->\n<p>Table Tennis Tournament for Clubs provides a focused admin workflow for maintaining player ratings and contact details, creating tournaments, and assigning active players to each tournament.<\/p>\n\n<p>Player emails are stored for club administration and are not shown in public shortcodes.<\/p>\n\n<h3>Features<\/h3>\n\n<ul>\n<li>Player records with name, rating, email, and active status.<\/li>\n<li>Tournament records with name, date, best of, player type, and status.<\/li>\n<li>Tournament Players screen for adding and removing participants.<\/li>\n<li>Inactive players cannot be assigned to new tournaments.<\/li>\n<li>Tournament Scores screen with three or five score fields per generated match.<\/li>\n<li>Score validation requiring 11 points (with a 2+ point margin) or a deuce win with exactly two points lead, plus a completed Best of 3 or Best of 5 match without superfluous or skipped games.<\/li>\n<li>Automatic crossover rounds after all group matches are complete. Two groups produce a final and third-place match, three groups produce a round-robin among the group winners, and four groups produce semi-finals followed by a final and third-place match.<\/li>\n<li>Group and crossover standings are ordered by match wins, game difference, point difference, and then a stable player-order fallback.<\/li>\n<li>Public tournament pages with groups, round-robin match schedules, and match scores.<\/li>\n<li>TV mode (<code>?showtv=true<\/code>) for showing live scores full-screen on a TV, with automatic slide cycling and live refresh when scores are saved.<\/li>\n<li>Public player pages at <code>\/speler\/{player-name}\/{player-id}<\/code> with player details, played tournaments, and finalized top-three positions.<\/li>\n<li>Public shortcodes for tournament and active player lists.<\/li>\n<\/ul>\n\n<h3>Shortcodes<\/h3>\n\n<pre><code>[tttc_tournaments] displays published tournaments and their assigned players.\n<\/code><\/pre>\n\n<p>Each published tournament title links to <code>\/{tournament-url-base}\/{tournament-name}\/{DD-MM-YYYY}<\/code>. The default URL base is <code>toernooi<\/code>; change it under Settings &gt; Table Tennis &gt; URLs. The public tournament page lists active assigned players by rating, distributes them into groups using the tournament group rules, and shows every round-robin match in each group. Schedules are available for 4 to 28 players.<\/p>\n\n<p>Upcoming tournament pages also accept player signups. A new signup creates an active player and assigns them to the tournament. If the same name and email already exist, the existing player's rating is updated, the player is reactivated, and the player is assigned to the tournament without creating a duplicate. The tournament's player type restriction is enforced.<\/p>\n\n<p>Players must provide an email address when signing up. After a successful signup, the plugin sends a confirmation email using the sender address, subject, and body configured under Settings &gt; Table Tennis. The subject and body support the merge fields <code>[tournament-name]<\/code> and <code>[tournament-date]<\/code>. Email delivery does not undo a saved signup.<\/p>\n\n<p>Optional attributes:<\/p>\n\n<ul>\n<li><code>[tttc_tournaments limit=\"10\"]<\/code><\/li>\n<li><p><code>[tttc_tournaments id=\"123\"]<\/code><\/p>\n\n<p>[tttc_players] displays active published players and their ratings.<\/p><\/li>\n<\/ul>\n\n<p>Optional attribute:<\/p>\n\n<ul>\n<li><code>[tttc_players limit=\"50\"]<\/code><\/li>\n<\/ul>\n\n<h3>TV mode<\/h3>\n\n<p>Add <code>?showtv=true<\/code> to a public tournament page, for example <code>\/{tournament-url-base}\/{tournament-name}\/{DD-MM-YYYY}\/?showtv=true<\/code> (the default base is <code>toernooi<\/code>), to show a bare full-screen scoreboard without the theme header, footer, breadcrumbs, QR code, player list, or signup form.<\/p>\n\n<ul>\n<li>Each group is shown as one slide with all of its rounds and, once the group is complete, its standings. Crossover rounds, the final, and the final places follow as separate slides. The final and third-place match appear only when both players are known.<\/li>\n<li>When there is more than one slide, the page cycles to the next slide at the interval configured under Settings &gt; Table Tennis &gt; TV Display (20 seconds by default).<\/li>\n<li>Every 10 seconds the page checks <code>\/wp-json\/tttc\/v1\/tournaments\/{id}\/version<\/code>. When scores, players, or the tournament status change in the admin, the page reloads automatically and stays on the current slide.<\/li>\n<li>Tournaments that are not active or completed yet show a notice and switch to the scoreboard automatically once the schedule becomes available.<\/li>\n<\/ul>\n\n<p>If a page cache or CDN is used, exclude the TV URL or the REST endpoint from caching for the fastest updates.<\/p>\n\n<h3>Tournament statuses<\/h3>\n\n<p>Draft, Upcoming, Active, Completed, and Cancelled are available. Draft tournaments are managed in the admin area but are not shown by public shortcodes.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>Player email addresses are available to administrators in WordPress and are never rendered by the public shortcodes.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>table-tennis-tournament-for-clubs<\/code> folder to <code>wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin from Plugins in WordPress.<\/li>\n<li>Use the Table Tennis menu to create players and tournaments.<\/li>\n<li>Open Tournament Players, select a tournament, and save its participants.<\/li>\n<li>Select Best of 3 or Best of 5 when creating a tournament, then use Scores in the tournament overview to enter match scores.<\/li>\n<\/ol>\n\n<p>After every group match has a completed score, the Scores screen reveals the applicable crossover matches. Later four-group matches remain unavailable until their semi-finals are complete. Public tournament pages show the crossover results and final places when the deciding matches have been completed.<\/p>","raw_excerpt":"Manage table tennis club players, tournaments, and tournament participation from WordPress.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/376713","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=376713"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/neutcomp"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=376713"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=376713"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=376713"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=376713"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=376713"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=376713"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}