{"id":372046,"date":"2026-10-06T15:54:18","date_gmt":"2026-10-06T15:54:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/gymclasstimes\/"},"modified":"2026-10-06T15:53:42","modified_gmt":"2026-10-06T15:53:42","slug":"briskgrid-class-timetables","status":"publish","type":"plugin","link":"https:\/\/nl.wordpress.org\/plugins\/briskgrid-class-timetables\/","author":23569880,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.0","stable_tag":"1.1.0","tested":"7.1.3","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Briskgrid Class Timetables","header_author":"Briskgrid Class Timetables","header_description":"Visual, drag-and-drop class timetable builder for gyms, studios and fitness businesses.","assets_banners_color":"054187","last_updated":"2026-10-06 15:53:42","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/www.gymclasstimes.com\/","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":140,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.0":{"tag":"1.1.0","author":"ssplugins","date":"2026-10-06 15:53:42","revision":3731175},"1.1.1":{"tag":"1.1.1","author":"ssplugins","date":"2026-10-07 13:36:54","revision":3732691}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3731175,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3731175,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3731175,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3731175,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"briskgrid-class-timetables\/timetable":{"name":"briskgrid-class-timetables\/timetable","title":"pluginName"}},"tagged_versions":["1.1.0","1.1.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3731175,"resolution":"1","location":"assets","locale":"","width":1916,"height":969},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3731175,"resolution":"10","location":"assets","locale":"","width":1918,"height":886},"screenshot-11.png":{"filename":"screenshot-11.png","revision":3731175,"resolution":"11","location":"assets","locale":"","width":1920,"height":887},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3731175,"resolution":"2","location":"assets","locale":"","width":1918,"height":975},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3731175,"resolution":"3","location":"assets","locale":"","width":1915,"height":881},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3731175,"resolution":"4","location":"assets","locale":"","width":1920,"height":1614},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3731175,"resolution":"5","location":"assets","locale":"","width":1920,"height":887},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3731175,"resolution":"6","location":"assets","locale":"","width":1920,"height":887},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3731175,"resolution":"7","location":"assets","locale":"","width":1919,"height":977},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3731175,"resolution":"8","location":"assets","locale":"","width":1907,"height":882},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3731175,"resolution":"9","location":"assets","locale":"","width":1920,"height":887}},"screenshots":{"1":"The visual drag-and-drop builder with classes placed on the weekly grid.","2":"Adding a class: pick the day(s), time, instructor, location and color.","3":"The All Timetables list, showing the shortcode to paste for each timetable.","4":"A timetable rendered on the live front end of a site.","5":"The builder's empty state \u2014 ready to add your first class.","6":"The All Timetables list before any timetable has been created.","7":"Builder display settings: control how the timetable looks on the front end.","8":"Picking a category color from the built-in color picker.","9":"Importing classes in bulk from a CSV file.","10":"The Tools screen: export and import a full JSON backup of your timetables.","11":"The upgrade page, comparing the free plugin with Briskgrid Class Timetables Pro."}},"plugin_section":[],"plugin_tags":[416,27880,6165,16809,1612],"plugin_category":[40],"plugin_contributors":[284742],"plugin_business_model":[],"class_list":["post-372046","plugin","type-plugin","status-publish","hentry","plugin_tags-calendar","plugin_tags-class-schedule","plugin_tags-fitness","plugin_tags-gym","plugin_tags-timetable","plugin_category-calendar-and-events","plugin_contributors-ssplugins","plugin_committers-ssplugins"],"banners":{"banner":"https:\/\/ps.w.org\/briskgrid-class-timetables\/assets\/banner-772x250.png?rev=3731175","banner_2x":"https:\/\/ps.w.org\/briskgrid-class-timetables\/assets\/banner-1544x500.png?rev=3731175","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/briskgrid-class-timetables\/assets\/icon-128x128.png?rev=3731175","icon_2x":"https:\/\/ps.w.org\/briskgrid-class-timetables\/assets\/icon-256x256.png?rev=3731175","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/briskgrid-class-timetables\/assets\/screenshot-1.png?rev=3731175","caption":"The visual drag-and-drop builder with classes placed on the weekly grid."},{"src":"https:\/\/ps.w.org\/briskgrid-class-timetables\/assets\/screenshot-2.png?rev=3731175","caption":"Adding a class: pick the day(s), time, instructor, location and color."},{"src":"https:\/\/ps.w.org\/briskgrid-class-timetables\/assets\/screenshot-3.png?rev=3731175","caption":"The All Timetables list, showing the shortcode to paste for each timetable."},{"src":"https:\/\/ps.w.org\/briskgrid-class-timetables\/assets\/screenshot-4.png?rev=3731175","caption":"A timetable rendered on the live front end of a site."},{"src":"https:\/\/ps.w.org\/briskgrid-class-timetables\/assets\/screenshot-5.png?rev=3731175","caption":"The builder's empty state \u2014 ready to add your first class."},{"src":"https:\/\/ps.w.org\/briskgrid-class-timetables\/assets\/screenshot-6.png?rev=3731175","caption":"The All Timetables list before any timetable has been created."},{"src":"https:\/\/ps.w.org\/briskgrid-class-timetables\/assets\/screenshot-7.png?rev=3731175","caption":"Builder display settings: control how the timetable looks on the front end."},{"src":"https:\/\/ps.w.org\/briskgrid-class-timetables\/assets\/screenshot-8.png?rev=3731175","caption":"Picking a category color from the built-in color picker."},{"src":"https:\/\/ps.w.org\/briskgrid-class-timetables\/assets\/screenshot-9.png?rev=3731175","caption":"Importing classes in bulk from a CSV file."},{"src":"https:\/\/ps.w.org\/briskgrid-class-timetables\/assets\/screenshot-10.png?rev=3731175","caption":"The Tools screen: export and import a full JSON backup of your timetables."},{"src":"https:\/\/ps.w.org\/briskgrid-class-timetables\/assets\/screenshot-11.png?rev=3731175","caption":"The upgrade page, comparing the free plugin with Briskgrid Class Timetables Pro."}],"raw_content":"<!--section=description-->\n<p>Briskgrid Class Timetables is a visual, drag-and-drop grid builder for gym and studio class timetables. Build your schedule by dragging classes onto a real calendar grid \u2014 every column stays perfectly aligned automatically, and the front-end grid is fully responsive, collapsing into a clean list on mobile.<\/p>\n\n<p><strong>Free features<\/strong><\/p>\n\n<ul>\n<li>Unlimited timetables<\/li>\n<li>Visual drag-and-drop grid builder \u2014 click to add, drag to move, drag the edge to resize<\/li>\n<li>Two style presets (Modern, Minimal)<\/li>\n<li>Shortcode <code>[briskgrid_timetable id=\"123\"]<\/code> and a native Gutenberg block<\/li>\n<li>Fully responsive: automatic mobile accordion view<\/li>\n<li>CSV import for bulk-adding classes from a spreadsheet<\/li>\n<li>Per-timetable settings: days shown, hours shown, accent color, time format<\/li>\n<li>Fully translation-ready: admin and front-end strings use the <code>briskgrid-class-timetables<\/code> text domain and ship with a <code>.pot<\/code> file (<code>languages\/briskgrid-class-timetables.pot<\/code>) for translation tools such as Poedit or Loco Translate<\/li>\n<li>RTL layout support (Arabic, Hebrew, etc.) \u2014 swaps in automatically on RTL sites<\/li>\n<li>WPML compatible out of the box (<code>wpml-config.xml<\/code> included) \u2014 timetable content is translated per language while display settings can remain shared<\/li>\n<li>Polylang compatible \u2014 assign a language to each timetable, create linked language versions from the Timetables list or builder, edit each language independently, and use one shortcode\/block across translated pages<\/li>\n<\/ul>\n\n<p><strong>Briskgrid Class Timetables Pro<\/strong> (sold separately) adds instructor photos and bios, a front-end filter bar (by day \/ instructor \/ category), multiple color-coded categories, extra style presets, multi-location grouping, and custom CSS.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to <code>\/wp-content\/plugins\/briskgrid-class-timetables<\/code>, or install through the Plugins screen.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Go to <strong>Briskgrid Class Timetables \u2192 All Timetables<\/strong> to create your first timetable.<\/li>\n<li>Use the visual builder to add classes, then click <strong>Save Timetable<\/strong>.<\/li>\n<li>Copy the shortcode shown in the list, or add the \"Briskgrid Class Timetables\" block to any page\/post.<\/li>\n<\/ol>\n\n<h4>Multilingual sites with Polylang<\/h4>\n\n<ol>\n<li>Configure your languages in <strong>Languages \u2192 Languages<\/strong> in Polylang.<\/li>\n<li>Go to <strong>Briskgrid Class Timetables \u2192 All Timetables<\/strong>.<\/li>\n<li>Existing timetables are assigned the Polylang default language when they are created. If a timetable has no language, use <strong>Set language\u2026<\/strong> in its <strong>Language \/ Translations<\/strong> column.<\/li>\n<li>Use the <strong>+ FR<\/strong>, <strong>+ ES<\/strong>, or other language button to create a linked translation. The new timetable starts with a copy of the source schedule.<\/li>\n<li>Open the new language version in the visual builder and translate the class names, instructor names and locations as needed. The other language versions remain independent.<\/li>\n<li>Place the same Briskgrid Class Timetables shortcode or block on the corresponding translated pages. Briskgrid Class Timetables automatically displays the timetable version for the current Polylang language when a translation exists.<\/li>\n<\/ol>\n\n<p>The timetable's class content is not managed under Polylang's ordinary <strong>Strings translations<\/strong> screen. The <code>.pot<\/code> file and WordPress language packs are for translating Briskgrid Class Timetables interface text; the timetable content itself is edited in the language-specific Briskgrid Class Timetables builder.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20work%20with%20any%20theme%3F\"><h3>Does this work with any theme?<\/h3><\/dt>\n<dd><p>Yes. The front-end grid uses standard CSS Grid and inherits your theme's fonts; only layout and color are set by the plugin.<\/p><\/dd>\n<dt id=\"can%20i%20have%20more%20than%20one%20timetable%3F\"><h3>Can I have more than one timetable?<\/h3><\/dt>\n<dd><p>Yes, the free version supports unlimited timetables \u2014 for example, one per location or room.<\/p><\/dd>\n<dt id=\"does%20it%20support%20bookings%20or%20reservations%3F\"><h3>Does it support bookings or reservations?<\/h3><\/dt>\n<dd><p>Not currently. Briskgrid Class Timetables focuses on displaying a clear, good-looking schedule. Booking\/reservation support may be considered for a future release.<\/p><\/dd>\n<dt id=\"is%20briskgrid%20class%20timetables%20translation-ready%3F\"><h3>Is Briskgrid Class Timetables translation-ready?<\/h3><\/dt>\n<dd><p>Yes. Plugin interface text uses the <code>briskgrid-class-timetables<\/code> text domain and a <code>.pot<\/code> file is included for translation tools and WordPress language packs. Timetable content is separate: when Polylang is active, use the <strong>Language \/ Translations<\/strong> column in <strong>Briskgrid Class Timetables \u2192 All Timetables<\/strong> to assign a language and create linked language versions. Each language version has its own class names, instructors and locations, while the timetable layout can be copied from the source. On the front end, the shortcode or Gutenberg block automatically resolves to the version matching the current language.<\/p>\n\n<p>Polylang does not list the timetable's class names as ordinary Strings Translations because they are timetable content rather than plugin UI strings.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Renamed the plugin (display name, slug, text domain, and shortcode) from \"GymClassTimes\" to \"Briskgrid Class Timetables\" at the reviewers' request, since \"GymClassTimes\" was judged too generic\/descriptive as a directory listing name. The shortcode is now <code>[briskgrid_timetable id=\"123\"]<\/code>. No stored data, settings, or internal code structure changed \u2014 this is a naming update only, made before the plugin has any live installs.<\/li>\n<\/ul>\n\n<h4>1.0.9<\/h4>\n\n<ul>\n<li>Hardened: the Tools screen's \"could not be imported\" message now runs the redirected error text through <code>sanitize_text_field()<\/code> before display, in addition to the existing output escaping.<\/li>\n<li>Addressed WordPress Plugin Check (PCP) warnings: annotated read-only <code>$_GET<\/code> reads used only to choose what to display (no state change) as intentionally not nonce-checked; annotated the guarded <code>seems_utf8()<\/code> fallback as an intentional compatibility path; prefixed the uninstall script's variable names; clarified that unprefixed variables in included admin view templates are local render-context values, not globals.<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>Internal: renamed the plugin's internal code prefix from <code>gct<\/code>\/<code>GCT<\/code> to <code>gymcla<\/code>\/<code>GYMCLA<\/code> throughout (function, class, hook, and meta-key names). This is not a user-facing change \u2014 the shortcode, text domain, and all saved data are unaffected \u2014 but was made now, before the plugin has any live installs, in response to review feedback that a 3-letter internal prefix is too short to reliably avoid collisions with other plugins.<\/li>\n<li>Fixed: \"Upgrade to Pro\" menu styling was printed as an inline <code>&lt;style&gt;<\/code> tag instead of being enqueued properly.<\/li>\n<li>Fixed: the \"Upgrade to Pro\" nag no longer disappears when Briskgrid Class Timetables Pro is active \u2014 it was checking for a leftover constant name from an earlier working title of the plugin.<\/li>\n<li>Hardened: front-end attribute markup added by add-ons (via the <code>gymcla_entry_data_attrs<\/code> filter) is now re-validated and re-escaped before output, regardless of what a hook returns.<\/li>\n<li>Replaced the deprecated <code>seems_utf8()<\/code> calls (CSV import, Tools backup import) with a small wrapper that prefers WordPress's newer <code>wp_is_valid_utf8()<\/code> when available.<\/li>\n<li>Tightened the plugin description's wording.<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Fixed: accented characters and non-Latin scripts (Spanish, French, German, Arabic, Chinese, etc.) in class names, instructor names, locations, and categories were being corrupted to literal text like \"Fu00fatbol\" instead of \"F\u00fatbol\" when saved. Also fixes a related, more serious issue where a class title containing a literal quote character (e.g. Bob's \"Elite\" Class) could silently corrupt an entire timetable's saved classes.<\/li>\n<li>Fixed in: the builder's Save Timetable action, CSV import, and the Tools Import (restore from backup) action.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Fixed: the CSV import \"Please upload a CSV file.\" validation message was missing from the built-in Spanish translation.<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Added JSON export and backup restore tools for all timetables.<\/li>\n<li>Added a Briskgrid Class Timetables Tools admin page.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Improved Builder screen: existing timetables can now be selected directly from the Builder submenu.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Added Spanish translations for the Closed Dates interface.<\/li>\n<li>Added the Closed Dates strings to the Polylang translation registry and POT template.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Improved Polylang interface translation support and Spanish interface fallback.<\/li>\n<li>Improved UTF-8 handling for CSV imports, including accented characters.<\/li>\n<li>Block editor strings now use the localized plugin interface strings.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Improved Polylang integration with language assignment, linked translation creation, and language-aware timetable resolution.<\/li>\n<li>Improved WPML\/Polylang handling of JSON timetable content.<\/li>\n<li>Updated plugin metadata and submission compatibility.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: unlimited timetables, visual drag-and-drop grid builder (multi-day selection, right-click duplicate, recently-used color swatches), CSV import, shortcode and Gutenberg block, responsive front end with subtle grid lines, full translation-readiness (.pot file, RTL support, WPML\/Polylang compatibility), and an in-menu \"Upgrade to Pro\" page.<\/li>\n<\/ul>","raw_excerpt":"Visual, drag-and-drop class timetables for gyms, studios and fitness businesses.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/372046","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=372046"}],"author":[{"embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ssplugins"}],"wp:attachment":[{"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=372046"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=372046"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=372046"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=372046"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=372046"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/nl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=372046"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}