{"id":335038,"date":"2026-07-03T14:20:01","date_gmt":"2026-07-03T14:20:01","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/targetscore-events-calendar\/"},"modified":"2026-07-03T14:19:48","modified_gmt":"2026-07-03T14:19:48","slug":"targetscore-calendar","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/targetscore-calendar\/","author":15223369,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"TargetScore Events Calendar","header_author":"TargetScore","header_description":"Displays a club's upcoming TargetScore events in a calendar and list view, with an in-site event detail page. Configure a single Club ID under Settings \u2192 TargetScore Events Calendar.","assets_banners_color":"ffffff","last_updated":"2026-07-03 14:19:48","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/donate.stripe.com\/aEU5lHenb6K81jy147","header_plugin_uri":"https:\/\/targetscore.com\/","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":22,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"avtarnanrey","date":"2026-07-03 14:19:48"}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3595341,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3595341,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3595341,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3595341,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3595341,"resolution":"1","location":"assets","locale":"","width":2560,"height":1340},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3595341,"resolution":"2","location":"assets","locale":"","width":2560,"height":1340},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3595341,"resolution":"3","location":"assets","locale":"","width":2560,"height":1340},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3595341,"resolution":"4","location":"assets","locale":"","width":2560,"height":1340},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3595341,"resolution":"5","location":"assets","locale":"","width":2560,"height":1340}},"screenshots":{"1":"Calendar (month grid) view with per-category colors and multi-day events.","2":"List view of upcoming events.","3":"In-site event detail page with a Register button.","4":"Upcoming Events sidebar\/footer widget.","5":"Admin settings screen (Club ID, accent color, cache)."}},"plugin_section":[],"plugin_tags":[416,1486,270008,270009],"plugin_category":[40],"plugin_contributors":[],"plugin_business_model":[],"class_list":["post-335038","plugin","type-plugin","status-publish","hentry","plugin_tags-calendar","plugin_tags-events","plugin_tags-shooting-sports","plugin_tags-targetscore","plugin_category-calendar-and-events","plugin_committers-avtarnanrey"],"banners":{"banner":"https:\/\/ps.w.org\/targetscore-calendar\/assets\/banner-772x250.png?rev=3595341","banner_2x":"https:\/\/ps.w.org\/targetscore-calendar\/assets\/banner-1544x500.png?rev=3595341","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/targetscore-calendar\/assets\/icon-128x128.png?rev=3595341","icon_2x":"https:\/\/ps.w.org\/targetscore-calendar\/assets\/icon-256x256.png?rev=3595341","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/targetscore-calendar\/assets\/screenshot-1.png?rev=3595341","caption":"Calendar (month grid) view with per-category colors and multi-day events."},{"src":"https:\/\/ps.w.org\/targetscore-calendar\/assets\/screenshot-2.png?rev=3595341","caption":"List view of upcoming events."},{"src":"https:\/\/ps.w.org\/targetscore-calendar\/assets\/screenshot-3.png?rev=3595341","caption":"In-site event detail page with a Register button."},{"src":"https:\/\/ps.w.org\/targetscore-calendar\/assets\/screenshot-4.png?rev=3595341","caption":"Upcoming Events sidebar\/footer widget."},{"src":"https:\/\/ps.w.org\/targetscore-calendar\/assets\/screenshot-5.png?rev=3595341","caption":"Admin settings screen (Club ID, accent color, cache)."}],"raw_content":"<!--section=description-->\n<p>Given a single Club ID, this plugin displays that club's upcoming events (fetched from the TargetScore API) in two switchable views:<\/p>\n\n<ul>\n<li><strong>Calendar<\/strong> \u2014 a month grid with one color per event category and multi-day events shown as continuous bars.<\/li>\n<li><strong>List<\/strong> \u2014 the same upcoming events, chronological.<\/li>\n<\/ul>\n\n<p>Clicking an event opens an event detail page rendered inside your site. A Register button opens the external TargetScore registration page in a new tab. A separate sidebar\/footer <strong>widget<\/strong> shows a compact list of upcoming events.<\/p>\n\n<p>All API calls are made server-side (proxied + cached via WordPress transients), so nothing hits the browser cross-origin and payloads stay small.<\/p>\n\n<h4>How it works<\/h4>\n\n<ul>\n<li>Configure a <strong>Club ID<\/strong> under <strong>Settings \u2192 TargetScore Events Calendar<\/strong>.<\/li>\n<li>On activation the plugin creates a published <strong>Events<\/strong> page (slug <code>events<\/code>) containing the <code>[targetscore_calendar]<\/code> shortcode. You can rename, move, or delete it freely.<\/li>\n<li><p>Add the calendar to any page\/post with the shortcode:<\/p>\n\n<p>[targetscore_calendar]<\/p>\n\n<p>Optional per-instance default view: <code>[targetscore_calendar view=\"list\"]<\/code>.<\/p><\/li>\n<li><p>The event detail page uses the same page with a <code>?event={id}<\/code> query parameter \u2014 no rewrite rules needed.<\/p><\/li>\n<li>Add the <strong>\"TargetScore: Upcoming Events\"<\/strong> widget to any sidebar\/footer for a compact list.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to the TargetScore API to retrieve the configured club's public event data, and links to the TargetScore website for event registration.<\/p>\n\n<p><strong>TargetScore API (api.targetscore.com)<\/strong>\nThe plugin makes server-side GET requests to <code>https:\/\/api.targetscore.com<\/code> to fetch:<\/p>\n\n<ul>\n<li>the club's upcoming events \u2014 <code>\/api\/events\/by-club\/{clubId}<\/code><\/li>\n<li>club information and event categories\/colors \u2014 <code>\/api\/club\/{clubId}<\/code><\/li>\n<li>a single event's details \u2014 <code>\/api\/event\/{eventId}<\/code><\/li>\n<\/ul>\n\n<p>These requests are triggered when a visitor loads a page containing the events calendar, list, or the Upcoming Events widget. The only data sent is the Club ID you configure (and, for the detail view, an event ID from the page URL). No personal visitor data is transmitted. Responses are cached in WordPress transients.<\/p>\n\n<p><strong>TargetScore website (targetscore.com)<\/strong>\nEvent \"Register\" buttons and links open <code>https:\/\/targetscore.com\/{eventId}<\/code> in the visitor's browser (a normal outbound link; no data is sent by the plugin itself).<\/p>\n\n<p>Service provider: TargetScore.\nTerms of Service: https:\/\/docs.targetscore.com\/docs\/legal\/terms-of-service\nPrivacy Policy: https:\/\/docs.targetscore.com\/docs\/legal\/privacy-policy<\/p>\n\n<h3>Developer notes<\/h3>\n\n<p>The front-end bundle (<code>assets\/js\/dist\/targetscore-calendar.iife.js<\/code> + <code>.css<\/code>) is compiled from <code>assets\/js\/src\/<\/code> via esbuild:<\/p>\n\n<pre><code>cd build\nnpm install\nnpm run build     # produce the bundle\nnpm test          # run the normalizeEvent unit tests\n<\/code><\/pre>\n\n<p>All event-date parsing lives in one adapter (<code>assets\/js\/src\/normalize.js<\/code>) so the upcoming upstream change (splitting <code>dates<\/code> into <code>startDate<\/code>\/<code>endDate<\/code>) is a single-function edit.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code> and activate it.<\/li>\n<li>Go to <strong>Settings \u2192 TargetScore Events Calendar<\/strong> and enter your <strong>Club ID<\/strong>.<\/li>\n<li>Visit the auto-created <strong>Events<\/strong> page (or add <code>[targetscore_calendar]<\/code> to any page).<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20does%20the%20data%20come%20from%3F\"><h3>Where does the data come from?<\/h3><\/dt>\n<dd><p>The public TargetScore API (default base <code>https:\/\/api.targetscore.com<\/code>), proxied through this plugin's own REST routes under <code>\/wp-json\/targetscore\/v1\/<\/code>.<\/p><\/dd>\n<dt id=\"how%20do%20i%20clear%20cached%20events%3F\"><h3>How do I clear cached events?<\/h3><\/dt>\n<dd><p><strong>Settings \u2192 TargetScore Events Calendar \u2192 Clear cache now.<\/strong> The cache is also cleared automatically when you change the Club ID.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Calendar (month grid) and list views with per-category colors and multi-day bars.<\/li>\n<li>In-site event detail page with sanitized rich-text overview and a popup-safe Register button.<\/li>\n<li>\"Upcoming Events\" sidebar\/footer widget (server-rendered list).<\/li>\n<li>Admin settings: Club ID, accent color (Register button, view toggle, today highlight), cache TTLs, clear cache, and a connection test.<\/li>\n<li>PHP proxy with transient caching for all TargetScore API calls.<\/li>\n<\/ul>","raw_excerpt":"Show a TargetScore club&#039;s upcoming events on a WordPress page in a Calendar and List view, with an in-site event detail page.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/335038","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=335038"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/avtarnanrey"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=335038"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=335038"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=335038"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=335038"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=335038"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=335038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}