{"id":287424,"date":"2026-03-20T09:04:30","date_gmt":"2026-03-20T09:04:30","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/chess-podium\/"},"modified":"2026-03-31T12:54:04","modified_gmt":"2026-03-31T12:54:04","slug":"chess-podium","status":"publish","type":"plugin","link":"https:\/\/lo.wordpress.org\/plugins\/chess-podium\/","author":23461866,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.8.3","stable_tag":"1.8.3","tested":"6.9.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Chess Podium","header_author":"Chess Podium","header_description":"Chess tournament manager for WordPress: players, rounds, Swiss pairings, results, standings, and exports. Free plan: up to 10 players per tournament. Upgrade to Pro for unlimited players.","assets_banners_color":"d5e5f7","last_updated":"2026-03-31 12:54:04","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/chesspodium.com","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":310,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.7.5":{"tag":"1.7.5","author":"marcobelemmi","date":"2026-03-20 10:34:01"},"1.7.6":{"tag":"1.7.6","author":"marcobelemmi","date":"2026-03-24 17:43:48"},"1.7.7":{"tag":"1.7.7","author":"marcobelemmi","date":"2026-03-26 16:27:01"},"1.7.8":{"tag":"1.7.8","author":"marcobelemmi","date":"2026-03-26 16:42:35"},"1.7.9":{"tag":"1.7.9","author":"marcobelemmi","date":"2026-03-28 18:35:58"},"1.8":{"tag":"1.8","author":"marcobelemmi","date":"2026-03-29 15:07:34"},"1.8.1":{"tag":"1.8.1","author":"marcobelemmi","date":"2026-03-30 16:28:10"},"1.8.2":{"tag":"1.8.2","author":"marcobelemmi","date":"2026-03-30 23:06:14"},"1.8.3":{"tag":"1.8.3","author":"marcobelemmi","date":"2026-03-31 12:54:04"}},"upgrade_notice":{"1.8.2":"<p>Pretty URLs for player profiles, clickable pairings, and improved profile photos (FIDE + Wikipedia\/Wikidata).<\/p>","1.8.1":"<p>Live replay\/analysis improvements and mobile UI fixes.<\/p>","1.8":"<p>Version alignment and marketing site update (Candidates tournament link on homepage). Same plugin behavior as 1.7.9.<\/p>","1.7.9":"<p>Fair play \/ anti-cheating section for players (FIDE-aligned themes), live page and export.<\/p>","1.7.8":"<p>Emergency hotfix for a fatal error introduced in 1.7.7. Update immediately.<\/p>","1.7.7":"<p>Major standings\/tie-break fixes (FIDE 2023 compliant), new badge\/placecard printing, real-time FIDE sync, and QR-linked player profiles.<\/p>","1.7.6":"<p>Setup wizard, Gutenberg tournament block, Customizer table\/board colors, smarter FIDE norm display.<\/p>","1.7.5":"<p>WordPress.org compliance: wp_enqueue for all assets, no remote CDN (jQuery bundled), plugin_dir_path\/plugins_url only, game page uses wp_add_inline_script\/style.<\/p>","1.7.4":"<p>WordPress.org compliance: Terms\/Privacy URLs, enqueue scripts, sanitization, escaping, external services docs, transient prefix.<\/p>","1.7.2":"<p>Plugin header format aligned to WordPress Plugin Handbook.<\/p>","1.7.1":"<p>Plugin header format fix for WordPress.org Plugin Check.<\/p>","1.7.0":"<p>WordPress.org compliance: local assets, proper enqueue, sanitization, escaping. Backward-compatible shortcodes preserved.<\/p>","1.6.0":"<p>Grand Prix: series of linked tournaments with points, social ELO, and aggregated standings. New admin section and shortcode.<\/p>","1.5.0":"<p>chess-results Excel import: import tournament data, player list, and round results from chess-results exports.<\/p>","0.3.0":"<p>Free plan: up to 10 players per tournament. Upgrade to Pro for unlimited players.<\/p>","0.2.0":"<ul>\n<li>Swiss pairing and standings<\/li>\n<\/ul>","0.1.0":"<ul>\n<li>Initial release<\/li>\n<\/ul>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":0},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3487216,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3487215,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3487218,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3487217,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":{"chess-podium\/tournament":{"name":"chess-podium\/tournament","title":"Tournament"}},"tagged_versions":["1.7.5","1.7.6","1.7.7","1.7.8","1.7.9","1.8","1.8.1","1.8.2","1.8.3"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Tournament management dashboard","2":"Add players and generate pairings","3":"Public standings page"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[17259,258184,30579,63425,14116],"plugin_category":[],"plugin_contributors":[258187],"plugin_business_model":[],"class_list":["post-287424","plugin","type-plugin","status-publish","hentry","plugin_tags-chess","plugin_tags-pairing","plugin_tags-standings","plugin_tags-swiss","plugin_tags-tournament","plugin_contributors-marcobelemmi","plugin_committers-marcobelemmi"],"banners":{"banner":"https:\/\/ps.w.org\/chess-podium\/assets\/banner-772x250.png?rev=3487217","banner_2x":"https:\/\/ps.w.org\/chess-podium\/assets\/banner-1544x500.png?rev=3487218","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/chess-podium\/assets\/icon-128x128.png?rev=3487216","icon_2x":"https:\/\/ps.w.org\/chess-podium\/assets\/icon-256x256.png?rev=3487215","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Chess Podium helps chess clubs organize tournaments directly from WordPress. Create tournaments, add players, generate Swiss pairings, enter results, and publish standings\u2014all without spreadsheets.<\/p>\n\n<p><strong>Free plan includes:<\/strong>\n* Up to 10 players per tournament\n* Swiss pairing\n* Round Robin and Double Round Robin\n* Results and standings\n* Public tournament page\n* CSV export\n* FIDE ID import<\/p>\n\n<p><strong>Upgrade to Pro<\/strong> for unlimited players, advanced exports, PGN pages, and more. <a href=\"https:\/\/chesspodium.com\/pricing\/\">Get Chess Podium Pro \u2192<\/a><\/p>\n\n<h3>Terms of Service and Privacy Policy<\/h3>\n\n<p>This plugin may link to the plugin website's legal pages. Ensure these URLs are valid and publicly accessible:\n* Terms of Service: https:\/\/chesspodium.com\/terms-of-service\/\n* Privacy Policy: https:\/\/chesspodium.com\/privacy-policy\/<\/p>\n\n<p>If your site uses different paths, create the corresponding pages and update the links where the plugin references them.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin relies on the following third-party services to provide core functionality:<\/p>\n\n<ol>\n<li><p><strong>Chess Podium Pairing API (http:\/\/89.167.56.28)<\/strong>: Used to calculate tournament pairings (Swiss System and Round Robin). The plugin sends tournament data (player names, ratings, and results) to this server to generate the next round's pairings.<\/p>\n\n<ul>\n<li>Service provided by: Chess Podium.<\/li>\n<li>Data sent: Tournament IDs, player names, and scores.<\/li>\n<\/ul><\/li>\n<li><p><strong>FIDE Ratings (https:\/\/ratings.fide.com)<\/strong>: Used to fetch and update player Elo ratings and titles based on their FIDE ID.<\/p>\n\n<ul>\n<li>Service provided by: International Chess Federation (FIDE).<\/li>\n<li>Data sent: FIDE ID (public identifier).<\/li>\n<\/ul><\/li>\n<li><p><strong>Stripe (https:\/\/api.stripe.com)<\/strong>: Used to process payments for the Pro license.<\/p>\n\n<ul>\n<li>Service provided by: Stripe, Inc.<\/li>\n<li>Terms of Service: https:\/\/stripe.com\/legal<\/li>\n<li>Privacy Policy: https:\/\/stripe.com\/privacy<\/li>\n<\/ul><\/li>\n<li><p><strong>PayPal (https:\/\/api-m.paypal.com, https:\/\/api-m.sandbox.paypal.com)<\/strong>: Used to process payments for the Pro license.<\/p>\n\n<ul>\n<li>Service provided by: PayPal Holdings, Inc.<\/li>\n<li>Terms of Service: https:\/\/www.paypal.com\/webapps\/mpp\/ua\/useragreement-full<\/li>\n<li>Privacy Policy: https:\/\/www.paypal.com\/webapps\/mpp\/ua\/privacy-full<\/li>\n<\/ul><\/li>\n<\/ol>\n\n<p>Additional services (optional, depending on configuration):<\/p>\n\n<ul>\n<li><strong>Chess Podium License API<\/strong> (chesspodium.com): Validates Pro licenses. Sends: license key, site URL. Ensure Terms and Privacy pages exist on your site (e.g. \/terms-of-service\/, \/privacy-policy\/) or use your own policy URLs.<\/li>\n<li><strong>Lichess<\/strong> (lichess.org): PGN live feed for broadcast games. Fetched server-side; no user data sent.<\/li>\n<li><strong>Wikimedia<\/strong> (Wikipedia REST API, Wikidata SPARQL \u2014 wikipedia.org, wikidata.org): Optional. Used only to resolve <strong>player profile thumbnail images<\/strong> when FIDE does not return a usable photo. Sends: player name and\/or FIDE ID (public). No account data.<\/li>\n<\/ul>\n\n<p><strong>Note on shortcode names:<\/strong> This plugin uses the prefix <code>chess_podium_<\/code> for all new shortcodes (e.g. <code>[chess_podium_tournament]<\/code>, <code>[chess_podium_manager_tornei]<\/code>). Legacy shortcodes <code>checkmate_manager_tornei<\/code>, <code>storico_tornei<\/code>, and <code>regina_torneo<\/code> are kept only for backward compatibility; prefer the <code>chess_podium_*<\/code> equivalents for new installations.<\/p>\n\n<h3>Third-party software<\/h3>\n\n<p>For third\u2011party software licenses and external services used by this plugin, see <code>THIRD-PARTY.txt<\/code> in the plugin root.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install the plugin through the 'Plugins' menu in WordPress, or upload the <code>chess-podium<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the 'Plugins' menu<\/li>\n<li>Go to <strong>Settings \u2192 Permalinks<\/strong> and save changes (required for the tournament page)<\/li>\n<li>Open <strong>Chess Podium<\/strong> in the admin menu to create your first tournament<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20is%20the%20free%20player%20limit%3F\"><h3>What is the free player limit?<\/h3><\/dt>\n<dd><p>The free plan allows up to 10 players per tournament. Upgrade to Chess Podium Pro for unlimited players.<\/p><\/dd>\n<dt id=\"how%20do%20i%20display%20the%20tournament%20on%20my%20site%3F\"><h3>How do I display the tournament on my site?<\/h3><\/dt>\n<dd><p>Use the shortcode <code>[chess_podium_tournament]<\/code> on any page, or visit <code>\/torneo\/<\/code> (or <code>\/currenttournament\/<\/code>) for the live tournament view.<\/p><\/dd>\n<dt id=\"can%20i%20import%20players%20from%20fide%3F\"><h3>Can I import players from FIDE?<\/h3><\/dt>\n<dd><p>Yes. Enter a FIDE ID to auto-import name, rating, and nationality from the official FIDE database.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.8.3<\/h4>\n\n<p><strong>Performance &amp; scalability (large tournaments)<\/strong><br \/>\n* Added <strong>versioned caching<\/strong> (object cache + per-request memoization) for heavy reads: players, pairings (all\/round\/detailed), standings.<br \/>\n* Cache invalidates automatically via a per-tournament <strong>cache version bump<\/strong> when results\/pairings\/rounds change (save results, save pairings, generate\/rollback round, swap colors, delete player, Lichess import).<br \/>\n* Public tournament page: <strong>standings load asynchronously<\/strong> (AJAX + pagination + nonce) for large tournaments to keep pages responsive.<\/p>\n\n<p><strong>Routing &amp; multilingual robustness<\/strong><br \/>\n* Fixed \u201cNo content\u201d on multilingual sites when <code>?lang=...<\/code> is present by parsing pretty URLs directly (player profile, game SEO URL, round URL) even if rewrite rules were flushed under a different locale.<\/p>\n\n<p><strong>Published tournaments grid<\/strong> (<code>[chess_podium_tornei]<\/code>)<br \/>\n* Preview image priority restored: <strong>gallery photo \u2192 event logo \u2192 default<\/strong>.<\/p>\n\n<p><strong>Translations<\/strong><br \/>\n* Completed missing UI strings (Lichess import, pairing settings labels\/options) across IT\/DE\/FR\/ES.<br \/>\n* Standardized <strong>\u201cAnti-cheating\u201d<\/strong> to remain in English everywhere (avoid non-standard local translations like \u201cantitrucchi\u201d).<\/p>\n\n<p><strong>Refactor (codebase maintainability)<\/strong><br \/>\n* Split bootstrap wiring into dedicated classes: <code>ChessPodium_Admin<\/code>, <code>ChessPodium_Frontend<\/code>, <code>ChessPodium_FrontendAjax<\/code> (keeps behavior, reduces <code>chess-podium.php<\/code> responsibilities).<\/p>\n\n<h4>1.8.2<\/h4>\n\n<p><strong>Public tournament &amp; player profile<\/strong><br \/>\n* SEO-friendly URLs for tournament, rounds, games, and <strong>player profile<\/strong> (pretty permalinks + rewrite rules; optional slug per tournament\/player).<br \/>\n* <strong>Current round pairings<\/strong>: white and black names are <strong>clickable<\/strong> and open the in-tournament player profile.<br \/>\n* <strong>Player profile photo<\/strong>: FIDE page parsing improved (rejects generic og:image); <strong>Wikipedia \/ Wikidata fallback<\/strong> \u2014 Wikidata <strong>P1440<\/strong> (FIDE ID) \u2192 article title, <strong>full-text search<\/strong> on Wikipedia when the stored name does not match the article title, multiple wiki languages; filter <code>chess_podium_player_photo_url<\/code> for overrides.<br \/>\n* External services note: optional requests to <strong>Wikimedia<\/strong> (Wikipedia API, Wikidata SPARQL) for profile thumbnails when FIDE does not expose a usable image.<\/p>\n\n<p><strong>Build<\/strong><br \/>\n* <code>CHESS_PODIUM_VERSION<\/code> <strong>1.8.3<\/strong>, <code>build-zip.ps1<\/code> \u2192 <code>chess-podium-1.8.3.zip<\/code>; marketing theme <strong>1.8.3<\/strong>; <code>dev\/chess-podium-svn<\/code> mirror aligned.<\/p>\n\n<h4>1.8.1<\/h4>\n\n<p><strong>Live single game replay: Chessground + engine analysis (client-side)<\/strong><br \/>\n* New single game page UI with Chessground board (mobile-friendly) and robust live polling without resetting to start position.<br \/>\n* Analysis mode: replay previous moves without live overriding; make your own legal moves as a \u201cvariation\u201d from any position.<br \/>\n* Client-side Stockfish (Web Worker) analysis with evaluation bar, best-move arrow and MultiPV lines; explicit Start\/Stop evaluation toggle.<br \/>\n* Exported photo galleries: lightbox restored (clicking an image opens it again).<br \/>\n* Live tournament UI: pairings table now scrolls horizontally on mobile instead of overflowing the page.<\/p>\n\n<h4>1.8<\/h4>\n\n<p><strong>FIDE profile import (ratings.fide.com)<\/strong><br \/>\n* Parsing updated for the current public profile HTML: federation from the flag image under <code>.profile-info-country<\/code> (e.g. <code>\/images\/flags\/us.svg<\/code> \u2192 ISO-2), FIDE title from <code>.profile-info-title<\/code> (e.g. \u201cGrandmaster\u201d \u2192 GM). Legacy fallbacks kept.<br \/>\n* <code>sanitize_fide_title()<\/code> now maps full English title names (Grandmaster, International Master, Woman Grandmaster, etc.) to standard abbreviations.<\/p>\n\n<p><strong>Tournament types &amp; rounds<\/strong><br \/>\n* New system type: <strong>Double round robin<\/strong> (second cycle repeats Berger pairings with colours reversed). Suitable for events such as the FIDE Candidates (8 players, 14 rounds).<br \/>\n* <strong>Tournament type<\/strong> can be changed after creation from <strong>Chess Podium \u2192 tournament \u2192 Settings<\/strong> (Swiss \/ Round Robin \/ Double Round Robin).<br \/>\n* Maximum <strong>rounds<\/strong> increased to <strong>99<\/strong> (create form, wizard, settings, Excel import); wizard client validation updated.<\/p>\n\n<p><strong>Players<\/strong><br \/>\n* <strong>Manual add player<\/strong>: optional <strong>FIDE ID<\/strong> field (unique per tournament), same validation as FIDE import.<\/p>\n\n<p><strong>Public &amp; live UI<\/strong><br \/>\n* <strong>Live tournament dashboard<\/strong> (<code>\/torneo\/livetournament\/<\/code>): shows <strong>tournament logo<\/strong> from brochure settings when set.<br \/>\n* <strong>Published tournaments grid<\/strong> (<code>[chess_podium_tornei]<\/code>): card image prefers <strong>brochure logo<\/strong>, then first gallery photo, then default.<\/p>\n\n<p><strong>Exports<\/strong><br \/>\n* TRF header tournament type: <code>round_robin<\/code> and <code>double_round_robin<\/code> both emit <strong>RR<\/strong> (two-letter field).<\/p>\n\n<p><strong>Marketing theme (chess-podium-template)<\/strong><br \/>\n* Homepage <strong>\u201cSee it in action\u201d<\/strong>: second example card links to the <strong>FIDE Candidates 2026<\/strong> tournament run on Chess Podium: <code>https:\/\/www.chesspodium.com\/tournament\/?tournament_id=27<\/code> (standings, rounds, pairings, live boards), alongside the Cattolica archive and DGT demo.<br \/>\n* Theme version <strong>1.8<\/strong>; download\/SEO strings and EN\/IT\/DE\/FR\/ES translations for the new block.<\/p>\n\n<p><strong>Build<\/strong><br \/>\n* <code>CHESS_PODIUM_VERSION<\/code> <strong>1.8.1<\/strong>, <code>build-zip.ps1<\/code> \u2192 <code>chess-podium-1.8.1.zip<\/code>; <code>dev\/chess-podium-svn<\/code> mirror aligned.<\/p>\n\n<h4>1.7.9<\/h4>\n\n<ul>\n<li>Fair play &amp; anti-cheating: per-tournament checklist and text (FIDE Handbook \u00a709 themes), optional fair play officer and complaints URL; shown on live page and static HTML export when enabled (Settings tab).<\/li>\n<\/ul>\n\n<h4>1.7.8<\/h4>\n\n<ul>\n<li>Emergency hotfix: include missing <code>includes\/class-pdf-badges.php<\/code> file in release package to prevent fatal errors on some installations.<\/li>\n<li>Hardening: badge module include is now guarded with <code>file_exists()<\/code> to prevent full plugin crash if file is unavailable.<\/li>\n<\/ul>\n\n<h4>1.7.7<\/h4>\n\n<ul>\n<li>Tie-break engine aligned with Swiss-Manager\/FIDE 2023 rules for unplayed rounds (BYE\/withdrawn) in Buchholz, Buchholz Cut 1, and Sonneborn-Berger.<\/li>\n<li>Direct Encounter (DE) ranking logic fixed with correct mini-league handling inside tied groups.<\/li>\n<li>New print-ready exports: Badges and Placecards PDF\/HTML with robust pagination (no card split across pages).<\/li>\n<li>Placecards layout optimized for green printing (4 per page).<\/li>\n<li>FIDE real-time sync: per-player and bulk \"Sync with FIDE\" action from Players tab.<\/li>\n<li>Public tournament player profile page (<code>?cp_player=<\/code>) with tournament stats and optional FIDE profile photo.<\/li>\n<li>Badges improved: tournament name on card, nationality flag, per-player QR code linking to live tournament player profile.<\/li>\n<li>New\/updated translations (IT\/DE\/FR\/ES) for the new UI and print features.<\/li>\n<\/ul>\n\n<h4>1.7.6<\/h4>\n\n<ul>\n<li>Setup wizard after activation (guided first tournament, optional published page with shortcode)<\/li>\n<li>Gutenberg block <code>chess-podium\/tournament<\/code> and Classic Editor shortcode inserter<\/li>\n<li>Customizer: colors for public tournament tables and chessboard squares<\/li>\n<li>FIDE norms: omit redundant GM\/IM norm badges when the player already holds that title or higher<\/li>\n<li>Minor copy and translation string updates<\/li>\n<\/ul>\n\n<h4>1.7.5<\/h4>\n\n<ul>\n<li>WordPress.org review compliance: All JS\/CSS included via wp_enqueue_script, wp_enqueue_style, wp_add_inline_script, wp_add_inline_style (no raw script\/style tags on WordPress pages)<\/li>\n<li>No remote assets: jQuery, chess.js, chessboard bundled in plugin; export uses only local paths (js\/jquery.min.js, js\/chess.min.js, etc.)<\/li>\n<li>Paths: plugin_dir_path() and plugins_url() used throughout; removed ABSPATH\/WPINC for export (jQuery copied from plugin only)<\/li>\n<li>Game page: inline CSS\/JS moved to wp_register_style + wp_add_inline_style and wp_register_script + wp_add_inline_script<\/li>\n<li>PDF certificate: comment added clarifying inline style is for dompdf output only<\/li>\n<\/ul>\n\n<h4>1.7.4<\/h4>\n\n<ul>\n<li>WordPress.org review compliance: Terms\/Privacy URLs updated to \/terms-of-service\/ and \/privacy-policy\/ (ensure these pages exist on your site)<\/li>\n<li>External services: full readme section (Pairing API, FIDE, Stripe, PayPal) with data sent and policy links<\/li>\n<li>Export: copy_export_vendor_assets uses plugin path only; jQuery fallback to WordPress wp-includes\/js\/jquery when not in plugin (chessboard always works in static export)<\/li>\n<li>Scripts: admin tab and config modal moved to wp_enqueue_script (admin-tabs.js, admin-config-modal.js) with wp_localize_script for strings<\/li>\n<li>Sanitization: HTTP_ACCEPT_LANGUAGE and all file upload type\/size use sanitize_text_field and wp_check_filetype (do not trust $_FILES['type'])<\/li>\n<li>Escaping: all echoed variables use esc_attr, esc_html, wp_kses_post; class-grand-prix.php render_player_with_flag output wrapped in wp_kses_post; wrap_html export title escaped<\/li>\n<li>Transient: cp_pgn_fetch_ renamed to chess_podium_pgn_fetch_ for consistent prefixing<\/li>\n<\/ul>\n\n<h4>1.7.2<\/h4>\n\n<ul>\n<li>Plugin header format aligned to WordPress Plugin Handbook (DocBlock, colon alignment)<\/li>\n<\/ul>\n\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>Plugin header format fix for WordPress.org Plugin Check (Description, Version, License)<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>WordPress.org compliance: replaced inline scripts\/styles with wp_enqueue_script, wp_enqueue_style, wp_add_inline_script, wp_add_inline_style<\/li>\n<li>Local assets: chess.js, chessboard-js, chess piece images, and country flags bundled in plugin (no CDN)<\/li>\n<li>External services documented in readme (License API, PayPal, bbpPairings, Lichess)<\/li>\n<li>Plugin paths use plugin_dir_path() and plugin_dir_url() consistently<\/li>\n<li>Sanitization: $_FILES filenames with sanitize_file_name(), wp_json_encode for JSON output<\/li>\n<li>Escaping: all echoed variables use esc_attr(), esc_html() where appropriate<\/li>\n<li>Shortcodes: added chess_podium_manager_tornei, chess_podium_storico_tornei; renamed cpSponsorsAdmin to chessPodiumSponsorsAdmin. Legacy shortcodes (regina_torneo, checkmate_manager_tornei, storico_tornei) kept only for backward compatibility with existing beta\/external installs; all new elements use chess_podium_ prefix.<\/li>\n<li>Static export: vendor JS\/CSS and flags copied locally; no remote dependencies<\/li>\n<li>Live dashboard: local flag images, escaped output (XSS prevention)<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Grand Prix: create series of linked tournaments with points per position, participation points, social ELO, aggregated standings<\/li>\n<li>Admin: Chess Podium \u2192 Grand Prix to create and manage Grand Prix<\/li>\n<li>Shortcode: [chess_podium_grand_prix id=\"X\"] to display Grand Prix standings<\/li>\n<li>Tournament settings: link tournaments to one or more Grand Prix<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>chess-results Excel import: create tournament, import players, bulk import round results<\/li>\n<li>Same pairing engine as Swiss Manager (JaVaFo) and chess-results compatibility<\/li>\n<li>Improved Excel format support for player list and pairing exports<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Free and Pro tiers: 10 players free, unlimited with Pro license<\/li>\n<li>License management page<\/li>\n<li>FIDE player import<\/li>\n<li>CSV bulk import<\/li>\n<li>External tournaments support<\/li>\n<li>PGN upload and display<\/li>\n<li>Photo gallery<\/li>\n<li>Export to folder<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Swiss pairing<\/li>\n<li>Standings and tiebreakers<\/li>\n<li>Public tournament page<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<\/ul>","raw_excerpt":"Manage chess tournaments from WordPress: players, Swiss pairings, results, standings, and exports. Free plan: up to 10 players per tournament.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/287424","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=287424"}],"author":[{"embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/marcobelemmi"}],"wp:attachment":[{"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=287424"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=287424"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=287424"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=287424"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=287424"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=287424"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}