-
v1.3.1 Stable
released this
2026-09-15 12:44:01 +02:00 | 0 commits to main since this releaseFinding a category among fifty 🔎
🔎 Categories & tags
- A filter box above every category and tag list. With dozens of them,
tagging an event meant scrolling a checkbox list to find "Concert". Typing now
narrows the list, accents optional —theatrefinds Théâtre. Terms already
ticked stay visible whatever is typed, and a matching sub-category keeps its
parents on screen so the list still reads as a tree. - The same filter sits above the Categories & tags panel on the Calendar
screen, and the category and tag pickers in the block editor are now
searchable dropdowns. - The box is always there, on two categories as on fifty — one control that
appears and disappears is one more thing to learn, and a short list today is
a long one next season. - Adding a category or tag from the event editor now starts with whatever was
typed in the filter — "no match" is usually the moment you want a new one.
Nothing else changed: no database work, no change to how events are stored or
rendered.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- A filter box above every category and tag list. With dozens of them,
-
v1.3.0 Stable
released this
2026-09-08 14:36:21 +02:00 | 1 commits to main since this releaseA rescue release: moving a calendar in from another plugin now works on the
sites that actually need it, and repeats that run every few weeks finally
respect the "every few weeks" part.🚚 Rescuing a calendar from another plugin
The Import/Export screen could already read The Events Calendar and
All-in-One Event Calendar — as long as those plugins were still running.
That was exactly the wrong way round. The site that needs its calendar rescued
is almost always the site where the other plugin crashed, stopped being
compatible, or had to be switched off. On those sites the screen shrugged and
said "not detected".Events, categories, tags, venues and organizers are now read straight from
the database, so a dead plugin is no longer in the way. Along with that:- "Migrate now" does the whole thing in one click. Pick the source, click,
and the events land in your calendar. The old download-a-JSON-then-upload-it
route is still there for moving events to a different site, but you no
longer have to walk it — and a big calendar no longer runs into the file
upload limit on the way back in. - Recurring events stay recurring instead of arriving as hundreds of
separate entries. Up to version 5, The Events Calendar stored a repeating
event as one event plus a hidden copy for every single occurrence; a twelve
event calendar could import as nine hundred. Those copies are now folded back
into the event they belong to. - A repeat is carried over, or its dates are — never a guess. When this
plugin can reproduce the original rule exactly, you get a real repeat. When it
cannot, you get the exact list of dates the old plugin had already generated,
cancelled dates included. The migration report tells you which events took
that route, and that dates beyond the point the old plugin had generated are
not part of it. A rule that is nearly right would quietly put events on the
wrong days for years. - More of each event survives the trip. The currency symbol stays attached
to the price, a venue's phone and website fill in when there is no organizer,
the event's own map setting is kept, an event recorded with only a duration
gets a proper end time, and all-day events keep the day they were on instead
of drifting a day either way. - Your old plugin is never touched. Its events stay exactly where they are,
so you can look over the result, and run the migration again if something
needs adjusting first. A "Skip events already here" tick box keeps the
second run from duplicating the first.
✨ Additional dates
A new field, in both editors, for the one-off dates an event also happens
on, on top of its normal repeat — the extra rehearsal, the make-up session. It
is also where a migrated event keeps its dates when its original rule had no
equivalent here, so without this field such an event looked like it did not
repeat at all.🐛 Fixes
- "Every other Tuesday" was happening every Tuesday. An event set to repeat
every two weeks — or every three, or every four — ignored that setting
entirely and ran weekly, quietly doubling or quadrupling its dates. If you
have fortnightly events, open one and save it after updating: that rebuilds
its dates with the interval respected. - A single date in "Exclude dates" did nothing. It was read as midnight, so
it only cancelled anything if the event happened to start at midnight. A date
on its own now cancels that whole day, in the event's own timezone. - Dates can be typed as
2026-12-25— the format the field's own example
had been suggesting all along, while the plugin only accepted20261225. - Deleting an event left rows behind in the calendar's own tables. Nothing
ever displayed them and no calendar was wrong, but they piled up. Updating
clears out what was left. - Two event lists on one page filled the error log with a PHP warning on
every single page view.
Upgrading: the update tidies away the leftover rows from deleted events on
its own — nothing to do. Two things worth a minute afterwards: re-save any event
that repeats every few weeks so its dates get rebuilt, and flush your page cache
if your site runs one.Downloads
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
1 download
- "Migrate now" does the whole thing in one click. Pick the source, click,
-
v1.2.2 Stable
released this
2026-08-03 02:44:32 +02:00 | 2 commits to main since this releaseA tune-up release: less work on every page load, and a readability fix for
multi-day events.⚡ Lighter on every page load
Three things were running on every request to your site, whether or not a
calendar appeared on the page:- Working out the asset cache-busting suffix meant walking every CSS and JS
file in the plugin and reading its timestamp. Outside debug mode the plugin
version is used directly — those files only change when the plugin updates. - The event capabilities were re-granted on every load — 26 of them, each
handing the entire roles list to the options API to compare. Now done once per
plugin version. Deactivating and reactivating still repairs roles if they ever
lose the capabilities. - The media library was being loaded on the event and category screens, left
over from the category image picker that 1.2.1 removed. That's several hundred
kilobytes of scripts and templates for a feature that no longer exists.
Nothing changes in how the plugin looks or behaves — it just stops doing work
nobody asked for.🐛 Multi-day events are readable again
The bar drawn across several days used the category's colour as its background
and the theme's text colour on top. When those two happened to be similarly
light or dark, the event title disappeared into its own bar — a pale category on
a dark site, or a dark one on a light site. Multi-day bars now use the category's
hue with a lightness picked for the current palette, so the label stays legible
whatever colour you chose. The coloured dots are unchanged: nothing is written
over them.🧹 Housekeeping
- Category images are fully retired. Importing no longer downloads a picture
per category into your media library — nothing ever displayed them. Existing
values are left untouched in the database.
Upgrading: nothing to do — no database changes. If your site runs a page
cache, flush it once after updating.Downloads
-
Source code (ZIP)
3 downloads
-
Source code (TAR.GZ)
3 downloads
- Working out the asset cache-busting suffix meant walking every CSS and JS
-
v1.2.1 Stable
released this
2026-08-03 00:21:20 +02:00 | 4 commits to main since this releaseA maintenance release that makes the calendar behave on dark themes.
🌙 Dark themes, properly
Auto mode has been reworked. It used to try to disappear into your theme —
borrow its text colour, keep its own backgrounds transparent. That turned out to
fail two ways at once: a calendar wearing the page's own background has no edge
and dissolves into the page, and on themes that don't hand a colour down to
plugin content the borrowed colour came out black, on a black page.Auto now measures the background behind the block and picks the light or dark
palette to match. The calendar reads as a proper panel again, and it's legible
by construction rather than by luck. Themes with their own light/dark switch are
followed live, without a reload.🐛 Fixes
- Unreadable text on a single event's page. The details injected above the
content (date, place, price, contact) ignored the colour mode setting
entirely and always used the light palette — so on a dark theme the date read
as near-black on near-black. - Popups no longer come out white on a dark site. In Auto they followed your
operating system's light/dark preference rather than the page's, so a dark
site viewed from a light-mode computer got a white card, and no plugin setting
could override it. - Date pills adapt. The coloured day/month blocks kept a pale background and
dark text whatever the mode. They now invert on dark surfaces while keeping
each event's own hue.
🎨 Your own colours
Settings → Appearance now takes a background and a text colour for each
palette. Borders, muted text and hover shades are mixed from those two, so a
custom palette stays consistent instead of needing eight pickers that can
contradict each other. They apply to Auto as well — set the dark background
close to your theme's if you'd rather the calendar sat quietly on the page.🧹 Housekeeping
- Removed the category Image field. Nothing in the plugin ever displayed it,
and it was only reachable from a screen the menu no longer links to. Existing
values are untouched and still import and export, so nothing is lost. - French translation completed for the new screens.
Upgrading: nothing to do — no database changes. If your site runs a page
cache, flush it once after updating so pages rendered with the old styles go
away.Downloads
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
2 downloads
- Unreadable text on a single event's page. The details injected above the
-
released this
2026-08-01 04:10:37 +02:00 | 11 commits to main since this releaseThe biggest update yet: managing events no longer means wrestling with the
WordPress post list and the block editor.✨ A brand-new event manager
- A clean, dynamic admin screen replaces the stock post table as the home of
your events — search, filter, sort, duplicate and trash, all without page
reloads. - Create and edit events in an in-page modal: title, dates, recurrence,
location, contact, cost, categories, tags and image — you never leave the
screen. - Simple-by-default description editor (bold / italic / lists / links, with a
raw-HTML view and a gentle length hint) so event cards stay tidy. Power users
can jump to the full WordPress editor from the modal header at any time. - Categories & tags side panel — add, rename, recolour and delete right next
to your events. The redundant taxonomy menus are gone.
🔁 Recurring events that actually show up
Recurring events now appear on every occurrence across the calendar and
lists (previously only the next one showed), with per-view caps so a daily or
never-ending series can't flood the agenda or a list.📥 Migrate from other plugins
One-step migration from The Events Calendar and All-in-One Event
Calendar: export their data to JSON from the Import/Export screen, then import
it into LRob Calendar.🏠 New home: git.lrob.net
Development has moved to
git.lrob.net/WP/calendar — source,
releases and issue tracker. Automatic updates now come from there, so this is
the release that carries your installation across. New versions are also picked
up as soon as WordPress checks, instead of up to an hour later.💅 Polish
- Dark-theme friendly: event titles inherit your theme's text colour instead of
hard-coded black. - 24-hour time inputs on sites configured for 24h (no more AM/PM).
- Colour modes for the calendar block: Auto (follow theme) / Light / Dark.
- The classic "Add New" and admin-bar "+ New" now open the new modal.
- Fixes: popup prev/next navigation with recurring events, events-list ordering,
end-date defaulting to the start, durable asset cache-busting, and more.
Bug reports and suggestions: git.lrob.net/WP/calendar/issues
or lrob.fr/contact.Downloads
-
Source code (ZIP)
2 downloads
-
Source code (TAR.GZ)
3 downloads
- A clean, dynamic admin screen replaces the stock post table as the home of
-
released this
2026-06-19 19:49:35 +02:00 | 33 commits to main since this releaseNew
-
Migrate from The Events Calendar and All-in-One Event Calendar. A new Migrate from another plugin section on the Events → Import / Export screen reads your existing events straight from either plugin and exports them as a LRob Calendar JSON file, which you then import through the usual Import box — a clean two-step migration. Sources are auto-detected, so a button only appears when matching event data is present (with the event count shown next to it). The Events Calendar reader covers event dates and timezones, venues (
tribe_venue), organizers (tribe_organizer), categories, tags, cost and RRULE recurrence; the All-in-One reader covers itsai1ec_eventstable. Images keep their existing local URLs, so nothing is re-downloaded. -
Agenda: cap the number of events. The Calendar block gains a Maximum events control in the editor sidebar (agenda layout only,
0= no limit).
Fixes
-
Agenda only showed events from the next few months. The agenda reused the month grid's ±2-month load window, so events further out silently disappeared — a calendar with sparse future events could show just one. The agenda now loads the full upcoming range (−1 month … +3 years).
-
Multi-day events read as a single day. A week-long event showed only "18 July — all day", forcing a click to discover it actually ran for a week. Agenda rows now display the full date range (e.g. 18 – 25 July 2026), collapsing a shared month/year.
-
All-day title overlapping the location. All-day events dropped their title into the narrow time column where, inheriting the month-pill
nowraprule, it overflowed on top of the location row. The item layout is reworked into a bold title over a single muted meta line, so titles wrap cleanly and the "all day" label no longer stacks onto three lines. -
Venue country was never shown. Agenda locations now include the country when it is set (venue, city, country).
Translations
- Full French for the migration UI, the agenda All day label, and the new Maximum events control (plus a couple of fuzzy strings cleaned up).
Upgrading
Drop-in update — no database changes. To migrate from another calendar plugin, keep it active, open Events → Import / Export, export from the Migrate from another plugin box, then import the downloaded file with the box above.
Downloads
-
Source code (ZIP)
2 downloads
-
Source code (TAR.GZ)
3 downloads
-
-
released this
2026-06-04 18:01:35 +02:00 | 36 commits to main since this releaseFixes
- Stale calendar after edits. The calendar fetches events over a REST
GET, but neither the request nor the response forbade caching — so a browser/page-cache layer (e.g. W3 Total Cache "Browser Cache", which doesn't differentiate logged-in admins) could serve outdated events until a hard reload (Ctrl+Shift+R). The endpoint now sendsnocache_headers()and the front-end AJAX call adds a cache-buster, so a normal reload always shows current events. (Server-side freshness was already handled by the versioned transient.) - Long links overflowing cards. A long unbreakable string (a pasted URL in the description, a long contact link) used to spill past the card edge, most visibly in the grid template. Card content now wraps with
overflow-wrap: break-word. - No way to see details in the minimal template. Minimal rows show no description/image inline, leaving no path to the full event. They now carry a compact icon-only "i" trigger at the end of the row that opens the shared popup card.
Translations
- Fixed fuzzy/incorrect French for "Previous month", "Next month" and "Calendar by LRob".
- Plugin URI is now the English source (
/en/…) with the French translation pointing to the bare French URL.
Downloads
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
2 downloads
- Stale calendar after edits. The calendar fetches events over a REST
-
released this
2026-05-21 03:13:07 +02:00 | 37 commits to main since this releaseSnappier self-update checks
- Update cache TTL: 12h → 1h. New GitHub releases now surface to the WordPress Updates screen within an hour instead of half a day. Still well clear of GitHub's 60 req/h unauthenticated rate limit, even on shared hosting where multiple sites share an outbound IP.
- Force-refresh on admin intent. Clicking "Check again" on the Updates page (
?force-check=1), or simply landing onupdate-core.php, now bypasses the plugin's release cache for that one request. Matches the behavior of WordPress core's own update checks — no more "I just pushed a release, why isn't it showing?" friction.
Install / update: download
lrob-calendar-1.1.4.zipbelow, or wait up to an hour for the in-dashboard update to appear automatically (sites already on v1.1.3+ will pick this up via the built-in updater).Downloads
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
2 downloads
-
released this
2026-05-16 18:31:18 +02:00 | 38 commits to main since this releaseFour fixes from the v1.1.2 demo round.
Backslash bug in event field saves
Every text field on the event editor (venue, address, contact name, cost, …) used to gain a
\before apostrophes and quotes on save, and slashes accumulated on re-save (Université d'Orléans→Université d\'Orléans→Université d\\\'Orléans…). Cause: WordPress emulates legacy magic-quotes on$_POST, but the meta-box save handler didn'twp_unslash()before sanitizing. Fixed across the whole save path including the RRULE builder. Existing slashed values clean themselves with one re-save per affected event.Icon alignment in meta rows
Meta-row icons (location, date, contact, …) now top-align with the first line of the label instead of vertically centering against multi-line blocks (full address, date + time stack). Before, the location pin floated visually in the middle of a four-line address — looked like it belonged to the third line specifically. Now it labels the whole block from the top. 1px nudge keeps single-line items visually centered.
"Show more" toggle missing on long descriptions
The excerpt-clamp overflow check ran once at
DOMContentLoaded, but webfonts typically load after and reflow text taller. Early measurement said "fits", stripped the clampable class, user saw fade-clipped text with no way to expand. Now re-measures ondocument.fonts.readyandwindow.load, with a finalization pass that adds late-blooming toggles or drops the fade gradient on items that really do fit.Popup description parity between blocks
Clicking an event from the calendar popup used to show only the trimmed excerpt, while the events-list popup showed the full content — same shared module, different payload (
descriptionHtmlwas only attached on the events-list code path).format_event_for_client()now always shipsdescriptionHtml, so both blocks render identically.Install / update
Sites running v1.1.1+ should see this update directly in the WordPress dashboard within 12h (or immediately if you clear the
lrob_calendar_gh_releasetransient). Otherwise downloadlrob-calendar-1.1.3.zipbelow and upload via WP Admin → Plugins → Add New → Upload Plugin.Downloads
-
Source code (ZIP)
2 downloads
-
Source code (TAR.GZ)
4 downloads
-
Source code (ZIP)
-
released this
2026-05-16 13:22:42 +02:00 | 39 commits to main since this releaseSurfaces the data you enter and adds quality-of-life tools for previews and branding.
Popup card
- Full address (venue, street, postal code + city, region, country) and full contact block (name, email, phone, website) as separate icon rows. Previously only venue + city were visible in popups; contact info was only on the dedicated single-event page.
- Contact items grouped with tighter row gap so name + email + phone + website read as one cohesive contact card.
Events list rows
- Two new editor sidebar controls: "Location" (Full / Compact / None) and "Contact info" (Full / Compact / None). Both default to Full — if you took the time to fill the info, it shows.
- Time of day stacks under the date instead of joining inline with a separator. Same treatment as the popup.
- Contact items grouped in a sub-flex container so they cluster rather than scatter among unrelated meta items.
- "View details" button is now the default
descriptionMode(wasinline). Lean rows + full info in the popup is the better default for most calendars.
New install defaults
- Public event pages OFF by default for new installs. Most calendars are embedded in pages; standalone
/event/fooURLs were creating duplicate-content situations on small sites. Existing installs are unaffected (the setting is only set on first activation when the option doesn't yet exist).
Demo events generator
- Settings → "Demo events" → "Insert demo events" creates a handful of realistic WordPress + hosting themed sample events spread across the current + upcoming month (workshop, webinar, multi-day WordCamp, weekly recurring support, instant announcement, planned maintenance).
- All copy goes through
__()so demo events render in the site's locale (English source, French shipped, others fall back). - Locations and copy reference Orléans throughout (LRob's hometown).
- Clean titles — no
[DEMO]prefix. Disclaimer + link to lrob.fr lives in the description only. - Warns if events already exist; requires an explicit confirmation checkbox to proceed.
Branding toggle
- Small "© Calendar by LRob" credit at the bottom of each block, linking back to the plugin page. On by default. Disable freely from Settings → Appearance → "Branding".
Uninstall safety
- Uninstall is now a no-op. Removing the plugin from the WP admin used to silently drop every event, custom table and option. Now it leaves everything in place — re-installing later picks up where you left off. Manual cleanup remains possible by dropping the three
{prefix}lrob_*tables andlrob_calendar_*options.
Install / update
Sites running v1.1.1+ should see this update directly in the WordPress dashboard (auto-update from GitHub). Otherwise, download
lrob-calendar-1.1.2.zipbelow and upload via WP Admin → Plugins → Add New → Upload Plugin.Downloads
-
Source code (ZIP)
2 downloads
-
Source code (TAR.GZ)
2 downloads