{"id":10552,"date":"2026-05-16T05:30:15","date_gmt":"2026-05-15T21:30:15","guid":{"rendered":"https:\/\/aeosub.com\/sdaweb-gcal-sync\/"},"modified":"2026-05-16T05:30:15","modified_gmt":"2026-05-15T21:30:15","slug":"sdaweb-gcal-sync","status":"publish","type":"post","link":"https:\/\/aeosub.com\/zh\/sdaweb-gcal-sync\/","title":{"rendered":"SDAweb Calendar Sync for Google Calendar"},"content":{"rendered":"<div class=\"plugin-info-card\" style=\"border: 1px solid #e2e8f0;border-radius: 10px;overflow: hidden;margin-bottom: 30px;font-family: -apple-system, system-ui, sans-serif;background: #fff\">\n<table style=\"width: 100%;border-collapse: collapse;font-size: 14px\">\n<tr style=\"border-bottom: 1px solid #edf2f7\">\n<th style=\"padding: 15px 20px;text-align: left;width: 35%;color: #4a5568;background: #fcfcfc\"><img decoding=\"async\" src=\"https:\/\/ps.w.org\/sdaweb-gcal-sync\/assets\/icon.svg?rev=3533428\" style=\"width: 40px;height: 40px;border-radius: 6px;margin-right: 12px;vertical-align: middle\"> Developer<\/th>\n<td style=\"padding: 15px 20px;font-weight: 500\"><a href=\"https:\/\/profiles.wordpress.org\/rstake\/\" target=\"_blank\" rel=\"noopener\">rstake<\/a><\/td>\n<\/tr>\n<tr style=\"border-bottom: 1px solid #edf2f7\">\n<th style=\"padding: 12px 20px;text-align: left;color: #4a5568;background: #fcfcfc\">Version<\/th>\n<td style=\"padding: 12px 20px\">v0.8.6<\/td>\n<\/tr>\n<tr style=\"border-bottom: 1px solid #edf2f7\">\n<th style=\"padding: 12px 20px;text-align: left;color: #4a5568;background: #fcfcfc\">Active Installs<\/th>\n<td style=\"padding: 12px 20px\">0 +<\/td>\n<\/tr>\n<tr style=\"border-bottom: 1px solid #edf2f7\">\n<th style=\"padding: 12px 20px;text-align: left;color: #4a5568;background: #fcfcfc\">Requires \/ Tested<\/th>\n<td style=\"padding: 12px 20px\">6.0 \/ 6.9.4<\/td>\n<\/tr>\n<tr style=\"border-bottom: 1px solid #edf2f7\">\n<th style=\"padding: 12px 20px;text-align: left;color: #4a5568;background: #fcfcfc\">Last Updated<\/th>\n<td style=\"padding: 12px 20px\">2026-05-15 9:25pm GMT<\/td>\n<\/tr>\n<tr>\n<th style=\"padding: 12px 20px;text-align: left;color: #4a5568;background: #fcfcfc\">Official Link<\/th>\n<td style=\"padding: 12px 20px\"><a href=\"https:\/\/wordpress.org\/plugins\/sdaweb-gcal-sync\/\" target=\"_blank\" style=\"text-decoration: none;color: #4a3bca;font-weight: bold\" rel=\"noopener\">View Details \u2192<\/a><\/td>\n<\/tr>\n<\/table><\/div>\n<div class=\"plugin-short-desc\" style=\"margin: 20px 0;padding: 12px 15px;background: #f9fafb;border-left: 4px solid #4a3bca;border-radius: 6px;font-style: italic;color: #4a5568\">Display events from one or more Google Calendars. Six views, hover popovers, ICS subscribe, mobile-aware, theme-aware, accessible.<\/div>\n<p>SDAweb Calendar Sync pulls events directly from the Google Calendar API and renders them on your site through a Gutenberg block, a shortcode, or a classic widget. All three share one render pipeline so output is identical regardless of how you insert a calendar.<\/p>\n<h4>Six views, one render pipeline<\/h4>\n<ul>\n<li><strong>List \/ Agenda<\/strong> \u2014 chronological, optionally grouped by day, week, or month<\/li>\n<li><strong>Month grid<\/strong> \u2014 classic 7\u00d76 calendar with multi-day event ribbons spanning across cells, today highlight (cell or whole-column style), optional ISO 8601 week-number column, and per-feed pastel chips<\/li>\n<li><strong>Card grid<\/strong> \u2014 upcoming events as styled cards, responsive<\/li>\n<li><strong>Week<\/strong> \u2014 7 day columns, today highlighted<\/li>\n<li><strong>Day<\/strong> \u2014 single-day agenda<\/li>\n<li><strong>Mini-month<\/strong> \u2014 compact dot-density grid for sidebars and widgets, with a tap-to-expand event panel showing today + next upcoming events and a &#8220;Load more&#8221; button<\/li>\n<\/ul>\n<p>All views share the same data layer, the same CSS-variable system, and the same accessibility baseline. Switch between them with one setting, or expose a visitor-facing view-toggle pill so visitors can switch themselves.<\/p>\n<h4>Smart UX out of the box<\/h4>\n<ul>\n<li><strong>Hover popover on event chips<\/strong> (Month, Week, Mini) \u2014 a floating card with date, time, location, calendar, recurrence summary, and a click-through link. Desktop hover + keyboard focus only; touch users keep direct click-through.<\/li>\n<li><strong>Mobile auto-degrade Month <span aria-hidden=\"true\" class=\"wp-exclude-emoji\">\u2192<\/span> Mini<\/strong> \u2014 the full grid is hidden under ~600px and replaced with the compact Mini-month view; one wrapper, two layouts, no JS swap.<\/li>\n<li><strong>ICS subscribe dropdown<\/strong> \u2014 one-click hand-offs to Google Calendar (web), Apple Calendar \/ Outlook (webcal), Android Google Calendar app (intent), and Copy-link with toast confirmation. Mobile becomes a bottom sheet.<\/li>\n<li><strong>Live search<\/strong> + <strong>jump-to-date picker<\/strong> \u2014 optional chrome controls for visitors who want to filter or navigate quickly.<\/li>\n<li><strong>Multi-day event ribbons<\/strong> \u2014 week-spanning bars with arrow indicators when an event continues beyond the visible row.<\/li>\n<li><strong>Recurring event indicator<\/strong> \u2014 small \u21bb icon with cadence summary in the tooltip (&#8220;Repeats weekly until 31 December 2026&#8221;).<\/li>\n<li><strong>Per-display locale override<\/strong> \u2014 render the calendar in a specific language (e.g. nb_NO) even when the site language is English.<\/li>\n<\/ul>\n<h4>Two authentication paths<\/h4>\n<ul>\n<li><strong>API key<\/strong> \u2014 for calendars marked &#8220;Make available to public&#8221; in Google Calendar. One field, paste, done.<\/li>\n<li><strong>Service Account JSON<\/strong> \u2014 for <strong>private<\/strong> calendars without per-user OAuth. Upload the JSON, share the calendar with the service-account email, you&#8217;re set.<\/li>\n<\/ul>\n<p>Credentials are encrypted at rest using a key derived from your site&#8217;s authentication salt. They are never echoed back into the admin UI \u2014 only the masked value and (for service accounts) the public service-account email are shown.<\/p>\n<h4>Theme-aware out of the box<\/h4>\n<p>The plugin reads your active theme&#8217;s <code>theme.json<\/code> color palette and uses your <code>primary<\/code>, <code>accent<\/code>, <code>foreground<\/code>, and <code>background<\/code> colors automatically. Per-display overrides let you set custom primary, accent, today-highlight, and link colors and force light\/dark mode without touching code. Every design token is exposed as a CSS custom property so a developer can fully restyle the calendar from their theme stylesheet.<\/p>\n<h4>Five built-in theme presets<\/h4>\n<p>One-click coordinated colour bundles: <strong>Default<\/strong> (clean blue), <strong>Warm earth<\/strong> (cream + deep red), <strong>High contrast<\/strong> (solid black on white for AAA-stricter sites), <strong>Forest<\/strong> (deep green), <strong>Sunset<\/strong> (warm coral + amber).<\/p>\n<h4>Accessibility built in<\/h4>\n<p>WCAG 2.2 AA baseline with several AAA touches:<\/p>\n<ul>\n<li>Live contrast warnings on every colour picker \u2014 the admin UI shows the WCAG ratio against both light and dark surfaces with pass\/fail markers as you choose colours<\/li>\n<li>Automatic high-contrast overlay via <code>prefers-contrast: more<\/code><\/li>\n<li>Focus-visible halo: a 4px white ring behind the primary outline so focus stays visible against any chip background<\/li>\n<li><code>prefers-reduced-motion<\/code> honored everywhere<\/li>\n<li>ARIA roles and labels on the month grid, navigation, popovers, and view-toggle<\/li>\n<li>Semantic HTML throughout<\/li>\n<li>RTL-aware via CSS logical properties<\/li>\n<li>Tabular numerals for day numbers and time labels so single- and double-digit values don&#8217;t drift<\/li>\n<\/ul>\n<h4>Built for the WordPress.org standard<\/h4>\n<ul>\n<li>Block editor first-class \u2014 server-side rendered, ServerSideRender preview, all the standard <code>InspectorControls<\/code><\/li>\n<li>Shortcode and classic widget on the same render pipeline<\/li>\n<li>No bundled core libraries (no jQuery on front-end, no Guzzle, no Carbon, no Monolog)<\/li>\n<li>No third-party authentication relay \u2014 your credentials only ever talk directly to googleapis.com<\/li>\n<li>Translation ready via translate.wordpress.org once the plugin is published and indexed (no bundled <code>.po<\/code>\/<code>.mo<\/code> \u2014 WordPress auto-loads locale files into <code>wp-content\/languages\/plugins\/<\/code> per the WP Plugin Handbook), plurals via <code>_n()<\/code>, JS strings via <code>wp_localize_script<\/code><\/li>\n<li>Free and GPLv2<\/li>\n<\/ul>\n<h4>For developers<\/h4>\n<p>Extension hooks are documented in <code>docs\/hooks.md<\/code> inside the plugin folder. The first-release set includes filters for event data, event URLs, query args, cache TTL, render output, palette resolution, plus actions for refresh and uninstall lifecycle.<\/p>\n<h3>Third-Party Services<\/h3>\n<p>This plugin connects to the Google Calendar API to retrieve events from calendars you configure.<\/p>\n<ul>\n<li>Service: Google Calendar API v3<\/li>\n<li>Website: https:\/\/developers.google.com\/calendar<\/li>\n<li>Terms of Service: https:\/\/developers.google.com\/terms<\/li>\n<li>Privacy Policy: https:\/\/policies.google.com\/privacy<\/li>\n<\/ul>\n<p>Data sent: the calendar ID(s) you configure, plus either your API key or a JSON Web Token signed with your service account credentials. Event data is returned to your server and cached locally as WordPress transients. No event data is sent to any third party.<\/p>\n<p>The ICS subscribe feature, when enabled, links visitors directly to Google&#8217;s public iCal feed (<code>calendar.google.com\/calendar\/ical\/...\/public\/basic.ics<\/code>) \u2014 the plugin does not proxy or store that data.<\/p>","protected":false},"excerpt":{"rendered":"<p>Display events from one or more Google Calendars. Six views, hover popovers, ICS subscribe, mobile-aware, theme-aware, accessible.<\/p>","protected":false},"author":1,"featured_media":9317,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[252],"tags":[882,723,575,883,884,555],"class_list":["post-10552","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-trends","tag-agenda","tag-calendar","tag-events","tag-google-calendar","tag-schedule","tag-wordpress-plugin"],"_links":{"self":[{"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/posts\/10552","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/comments?post=10552"}],"version-history":[{"count":0,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/posts\/10552\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/media\/9317"}],"wp:attachment":[{"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/media?parent=10552"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/categories?post=10552"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/tags?post=10552"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}