All notable changes to SocietyPress are recorded here.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Entries describe user-visible changes only. For the underlying commits, see the Git log.
Pre-1.0 development iterations are archived in CHANGELOG-pre1.md.
[Unreleased]
Added
A Records page is created for you
New sites now get a Records page, in the main menu alongside Library, showing the searchable index of your transcribed records. Every other part of SocietyPress that has a public page already got one automatically; records did not, so a society could transcribe and import thousands of cemetery, census or obituary entries and have nowhere for a visitor to reach them short of building the page by hand. If you already have a site, add a page and choose the Genealogical Records Search template.
Folders for the media library
Images, PDFs and documents are now sorted into folders — Newsletters, Photo Galleries, Events, Documents and Site Design — instead of one long list. Files are filed automatically as they arrive: importing newsletters puts them in Newsletters, adding gallery photos puts them in Photo Galleries. You can create your own folders and move files between them at any time, and anything SocietyPress moves is never moved back out from under you. A folder filter appears both in the media library and in the file picker. Existing files are sorted on upgrade, so the folders are useful immediately rather than after somebody sorts thousands of files by hand.
Progress bars on every import
Newsletter, records and bulk records imports now upload in small batches with a progress bar, a running count, and a list naming any file that failed. Previously a large upload could stop partway with nothing on screen to say how far it got.
Uploading more files than the server allows now says so
Selecting more newsletters or CSVs than the server accepts in one go used to discard the extras silently — pick forty newsletters, get twenty, with no warning. The importers now upload in batches so there is no practical limit, and the older non-JavaScript path says plainly when files were not received.
Give someone access to only certain pages
Content access used to be all or nothing. Under User Access, someone with Content access can now be limited to specific pages: they see only those pages in their list and cannot open the others. Administrators are never limited.
List view for album photos
The album editor has a Thumbnails / List by name toggle, so an album of a hundred similar photographs can be scanned by filename instead of by sight. Captions, reordering and removal work the same in both views.
Sort a menu into alphabetical order
Appearance → Menus has a Sort A→Z button. Items nested under another item stay where they are and are sorted among themselves.
Samples and previews for store items
A store item can now link to a sample — a chapter PDF, a table of contents, or a page on the site — shown as a See a sample link on the store page, so a buyer can look before paying.
Tidying the audit log
The Audit Log screen now shows how many entries it holds, offers to delete entries older than a period you choose, and lets you set how long entries are kept from then on. Previously entries were kept for a year with no way to change it.
The shared notepad is open to everyone with backend access
The notepad is a handoff board — what was left half-done, what the next person needs to know — so it is now available to anyone who can edit content, not only to people holding a SocietyPress access area. Members cannot see it.
Hiding a document category
A document category can be hidden from visitors without deleting it. Its documents stay in place and it keeps working in the admin; it simply stops appearing on the website.
Draft review links
Any page can now be shared for review before it goes live. Save the page as a draft and use the new Review link on the page editor: it's a private link anyone can open — no account needed — to see the page exactly as it will look, with a Preview button and a one-click Copy. The link only ever unlocks that one draft, works even while the site is set to require login, and can be turned off at any time by generating a new one. Publishing the page makes it public in the normal way.
Description and directions above the Events list
The Events page now shows whatever you type into its page editor above the list of events, so you can add a welcome, meeting location, or directions — matching the other SocietyPress page templates.
Fixed
Apostrophes and quotation marks collected stray backslashes
Anything typed with an apostrophe or a quotation mark came back with a backslash in front of it — Beginner's saved as Beginner\'s — and removing the backslash by hand didn't help, because saving the form put it straight back. This affected event titles and descriptions, member names and notes, research surnames, library and resource entries, document titles, ballot questions, page-builder text, and the sign-up form when it redisplayed what a visitor had typed.
Entries already stored with a stray backslash are cleaned up for you. The repair runs by itself the next few times you visit the admin, works through your existing entries a little at a time so nothing slows down, and notes in the audit log how many it corrected. Genuine backslashes — a file path in a document note, for instance — are left alone.
Imported GENRECORD files lost their record type
A GENRECORD file that named its type the way the published format guide does — Cemetery, Marriage, Military and most of the rest — imported as an untyped general collection. Ten of the fourteen documented types were affected; only Census, Court, Land and Tax happened to work. The record type decides how a collection is labelled and grouped, so a shared cemetery index arrived looking like a miscellaneous pile. Both the spelled-out names and the short codes are now recognised, and existing collections can be corrected by editing the collection and choosing the right type.
Event categories could not be added, renamed or deleted
The Events → Categories screen looked complete but did nothing: adding a category, renaming one, changing its colour and deleting one all silently failed, on every site. Every society was limited to the categories created when SocietyPress was installed. All of it now works. Deleting a category leaves its events in place and simply uncategorises them.
Colouring a table's header row appeared to do nothing
Using Table → Row background color on a header row had no visible effect, because the header's own grey covered it. Body rows were unaffected, which made the feature look unreliable rather than broken.
Sorting the page list by title appeared to do nothing
The Pages list showed its Title column as already sorted A→Z when it was not, so the first click sorted Z→A and looked like nothing had happened.
Dates and times displayed in the site's timezone instead of as entered
Event times, meeting dates, newsletter publication dates, membership expiration dates, document dates, and ballot voting windows are all stored as plain wall-clock values — 3:00 PM means 3:00 PM, with no timezone attached. Every screen that displayed them was converting them as though they were UTC, shifting each one by the site's offset.
On a US Central site that meant:
- A 3:00 PM–5:30 PM event listed as 10:00 AM–12:30 PM
- Any date on the first of a month displayed as the previous month, and any
- Membership expiration dates displayed a day early, including the
- Ballot edit screens reloaded the shifted time into their own fields, so
date in January displayed as the previous year — a newsletter published 2016-01-01 read "December 2015"
{{expiration_date}} token in renewal emails
each re-save moved the voting window further back
The stored data was correct throughout; only the display was wrong, so no repair of existing records is needed. Voting-window comparisons were already consistent and were not affected.
Buttons that appeared to do nothing
Any admin action whose confirmation dialog re-sent the form lost the button that triggered it, so the request arrived with no action and the page simply reloaded unchanged. This affected Forms → Delete and Picture Wall → Reject. Confirmation dialogs now also restore the browser validation that had been skipped.
Photo album imports silently stopped at 20 images
Selecting more than 20 images imported only the first 20, with no error and no indication anything was missing — PHP discards the surplus before the upload reaches the plugin. Images now upload in small batches with a progress bar and a per-image error list, so album size is limited only by available storage.
Page content ignored on SocietyPress page templates
Pages using the Research Help, Resources, Library Catalog, Records, Store, Cart, or Documents templates discarded anything typed into the page editor. A shortcode placed on such a page never rendered, and there was no way to add a line of explanation above the listing. Page content now appears above the module.
Other fixes
- The Newsletter Archive page-builder widget showed "No newsletters
- Reordering membership plans saved correctly but left the row in place, so
- Blank lines added in the page builder's Rich Text block showed in the
- Several buttons and time ranges displayed raw escape codes instead of an
published yet" on sites with a full archive; it was reading a location newsletters are no longer stored in.
the change was invisible until the page was reloaded.
editor but not on the published page.
ellipsis or dash.
[1.0.1] — 2026-06-27
A large maintenance-and-feature release on top of the first public 1.0: bulk importers across every module, online membership dues, deeper per-society configurability, and a sustained security, accessibility, and performance pass.
Added
Importers
- ENS Page Maintenance importer (Settings → Import ENS Pages)
- Newsletters bulk importer — multi-PDF upload with automatic cover
- Library catalog importer with column-variant auto-detection
- Events importer supporting recurrence, speakers, and slots
- Gallery importer — file upload or URL fetch into a new album
- Bulk records importer — N CSVs become N collections in one pass
- CSV export for record collections
generation and metadata
Membership & dues
- Online membership dues and multi-year renewal via Stripe
- Escalating renewal banner on the My Account page
- Per-section member self-edit locks
- Society-configurable new-member email-preference defaults
- Admin-managed name prefix/suffix dropdowns
- Print / PDF view for the admin Members list
Records & genealogy
- GEDCOM 7.0 export
- Per-surname alternate-spelling lists, used in surname search
- A–Z browse mode for the surname widget
- Researched-surname collection on the join form
- Public (non-member) surname contact on public registries
- Split death-notice vs obituary fields in the obituary record template
Store
- Member vs non-member pricing, with "Apply member pricing" on order detail
- Flat-rate shipping option and a complimentary (comp) order action
- Mail-in check donation path for
[sp_donate] - Search + date filters and inline sort-order editing in the orders and
products admin
Blast email
- File attachments on blasts
- Status-based audience segments and per-tier audience narrowing
- Per-blast sender name / From-address override
- Clone action, opt-out override for critical notices, and audience
- One-click member email health scan
name + count shown in the send confirmation
Documents & resources
- Members-only access at the document-category level
- Recency filter, per-category "last updated", and Month/Year display
- Drag-to-reorder and optional last-updated date for Resource Links;
format for documents
grid layout option on the Resource Links widget
Events, donations & governance
- Per-event file attachments and an "Email this event" row action
- Admin-configurable default range for the public Events page
- All-source income summary on the Finances page
- Society notification when a donation arrives; donation search by
- Chair dashboard widget and a URL shortener
- Contact form routing to a specific officer or committee chair, with an
- Theme exchange Tier 2 —
.spchildthemebundle import; Playfair Display
processor transaction ID; Year filter on the donations admin
optional preset subject
as a selectable font; a saved-look preset library
Changed
- Single source of truth for the genealogy service list
- Early renewals stack onto remaining days in rolling mode
- Duplicating an event resets its date to today instead of inheriting the
- Pending/failed donations excluded from campaign raised totals
- Removed HostGator from recommended hosting; refreshed installer
original
diagnostics with errno-aware failure messages
Security
- Hardened the backup feature (capability, path, headers) and added a
- Closed a ballot double-vote race with an atomic participation gate
- Nonce ordering on refund/help handlers; tightened Reply-To and
ENT_QUOTES/UTF-8 flags on installerhtmlspecialcharscalls- Post-rebaseline audit pass over the new importers
scheduled-backup admin UI with secure download and nightly email
ownership checks
Performance
- Bounded export memory and replaced whole-membership dropdowns
- Streamed GEDCOM export in batches
- Eliminated cold-load and ballot N+1 query overhead
Accessibility
focus-visiblestyles and color-contrast fixesaria-describedbyfield hints; modalinertandaria-describedby- Clearer library catalog tab and calendar-cell semantics
- Confirm-dialog buttons labeled with the action verb; save confirmations
brought into view and focused
Fixed
- Frozen password-reset dialog on WordPress 7.0
- Login-acknowledgment modal that could re-trap members
- Theme builder modal that never opened, and numerous unclosed
- Setup wizard blank page on Continue, and stray admin notices on the
- My Account fatal from an unbuilt feature; preset import dropping valid
- Dead Documents frontend; GENRECORD parser brought into spec conformance
spConfirm() handlers across the admin
wizard screen
fonts via a stale allowlist
[1.0.0] — 2026-06-01
First public release.
SocietyPress is a free, GPL-licensed WordPress platform that gives a volunteer-run genealogical or historical society everything it needs to operate online — members, dues, events, library, newsletters, records, volunteers, donations, blast email, committees, documents, photos, voting, lineage programs, and research help — without third-party services.
What's in 1.0
Members (always on)
- Full membership database with custom fields, household/joint members,
- Renewal reminders, lapsed-member workflows, lifetime members
- Pending-changes queue so member-initiated edits land in moderation
- CSV import with field mapping; full data export
- XChaCha20-Poly1305 encryption (via libsodium) on phone numbers and
research surnames, research areas, and skills/interests
street addresses at rest
Optional modules (toggle in Settings → Modules)
- Events — calendar, registration with capacity + waitlist, speakers,
- Library — full OPAC-style catalog with faceted search, browse-by
- Newsletters — archive with searchable cover gallery and inline PDF
- Resource Links — categorized external links with maintenance tools
- Governance — committees, meeting records, leadership roster
- Store — online publication sales with per-item shipping, Stripe
- Records — collection-based historical record sets with custom fields,
- Donations — one-time and recurring donations, campaigns,
- Blast Email — newsletter blasts, segmented sends, plain-text or
- Photo Gallery — albums with member uploads, Picture Wall public view
- Help Requests — public-facing research-question intake with member
- Documents — gated members-only document library with categories
- Voting & Elections — multi-question ballots, eligibility rules,
- Lineage Programs — "First Families"-style heritage recognition with
- Research Services — paid research request workflow with assignment,
slot-based events, iCal subscribe, Stripe/PayPal payments, attendance check-in, recurring series, external iCal feed sync
sections, ISBN enrichment, donor tracking, condition + availability
viewer
and PayPal checkout, order management
member submissions, search, .genrecord open-format import/export, and GEDCOM import (5.5/5.5.1/7.0) and export (5.5.1 or 7.0)
acknowledgments, year-end reports
templated HTML, delivery log
responses and admin moderation
anonymous secrecy, results with charts and CSV export
application review and optional public roster
hours tracking, invoicing
Themes
- Parent theme + five GPL child themes (Coastline, Heritage, Ledger,
Parlor, Prairie), each with palette-on-activation and per-section Customizer controls
Site building
- 21+ page-builder widgets covering hero sliders, contact cards, event
- Page templates for members-only content, search, and login modal
- PWA manifest with offline fallback page
lists, calendars, donation forms, member directories, library catalogs, research guides, and more
Security
- All AJAX endpoints nonce + capability gated
- Stripe + PayPal webhook signature verification
- Server-side outbound HTTP for iCal sync and color extraction is
- File uploads validated against an explicit MIME allowlist;
.htaccess - Email header CR/LF stripping in
sp_get_email_headers()so a stray - Legacy
noenc:decryption fallback removed; on activation any surviving - Stripe Checkout redirect URLs validated via
sp_safe_stripe_checkout_url() - GDPR: five exporters and five erasers (donations pseudonymize for IRS
DNS-rebinding pinned (CURLOPT_RESOLVE)
drops PHP execution in upload paths
newline in admin-edited From/Reply-To settings cannot inject Bcc/Cc
rows are re-encrypted via sp_maybe_migrate_noenc_members()
at every checkout site (lineage applications, donations, research cases, invoice payments)
recordkeeping rather than delete)
Accessibility
- Custom
spConfirm/spAlertmodals with focus management, focus traps, - WCAG AA color contrast across status badges, links, and admin tables
- Form labels, aria-live regions, and
prefers-reduced-motionguards - Login acknowledgment modal that requires explicit dismissal
- Filter-bar
<select>controls in the Members, Events, and Email Log - Page builder widget cards are keyboard-operable (Enter / Space toggles
- 48 page-builder widget fields now have programmatically associated
- Hero slider per-line size/weight/color selects and per-slide Button
- Theme builder hex-color text inputs are labeled per color
- Lineage application form fields are fully label-associated
- Donations bulk-action "select all" checkbox has an associated label
inert siblings, and screen-reader-friendly labels
list tables now expose visible-label-equivalent aria-label text
open/closed; aria-expanded tracks the body's visible state)
labels (for=/id=) across flat and repeater field patterns
Text / Button URL inputs each have their own labels
Internationalization
- 4,600+ translatable strings, generated
.potfiles for plugin and - Page template names ("Library Catalog", "Genealogical Records Search",
- Frontend event-count plural moved to
_n()("1 event" / "%s events") - Frontend event location labels for virtual events translated
- Design Settings, Event Categories, Event price fields, Page Builder
parent theme
"Store", "Shopping Cart", "Documents", "Interest Groups") now translatable in the WordPress page Template dropdown
"Standard Pages" description, and Events Import file-format helper strings wrapped with the societypress text domain
Operations
- One-file installer (
sp-installer.php) — drop into web root, browse to - Built-in dashboard update checker against GitHub releases
- Daily maintenance cron, email-log cleanup, renewal reminder cron,
it, follow the wizard, the installer self-deletes after success
event reminder cron, iCal feed sync cron
License
- GPL-2.0-or-later