WP Manifestindependent plugin directory
manifest / users / iarss-wordpress-plugin

IARSS Expert Directory

Searchable WordPress expert directory plugin for IARSS — self-service profile editing, invite flow, CSV import/export, analytics, and full admin management tools.

★ 0stars

Install

Download source zip No release zip yet

This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/learning-technology-center/iarss-wordpress-plugin/archive/refs/heads/main.zip
No built-in updater. New versions won't appear under Dashboard → Updates. Install new releases yourself, or let Git Updater track the repository.

The IARSS Expert Directory: searchable public grid, self-service profile editing, invite flow, CSV import/export, and full management tools.

What's included

Public directory — [ltc_experts_directory]

  • Live search across name, title, organization, and bio
  • Expertise, service, grade level, and ROE/ISC filters, plus sorting (A–Z, recently updated, organization)
  • "Load more" pagination — the first page is server-rendered for SEO
  • Filters are written to the URL, so filtered views are shareable and survive the back button
  • Cards use a dedicated 320×320 crop so photos load fast

Single profiles

  • Contact buttons (Email, LinkedIn, Website) with per-field visibility controlled in Settings
  • Save contact (vCard) download
  • Credentials shown as badges
  • Schema.org Person JSON-LD for search engines

Expert self-service

  • Experts log in to wp-admin and can edit only their own profile (trimmed menus, own-media-only library, login redirect to their branded "My Profile" screen)
  • A draft profile is auto-created the moment a user is given the Expert role

Manager tools

  • Experts → Invite Expert: creates the account + draft profile and emails a set-password link
  • Experts → Import / Export: CSV round-trip for experts (including taxonomies and linked users) and a separate CSV round-trip for the ROEs/ISCs themselves (address and contact info)
  • Profile completeness column (photo, bio, tagline, title, org, email, expertise)
  • Experts → Settings: directory slug, page size, brand colors (LTC defaults), visible fields, and reminder window

v1.2 additions

  • Gutenberg blocks with live preview: "Experts Directory" (full grid) and "Expert Card" (feature one expert anywhere)
  • Print / PDF one-pager: a branded bio sheet on every profile, ready for conference programs or board packets
  • Analytics: profile views (bot-filtered, own-views excluded) plus Email, vCard, Website, and LinkedIn click counts — shown in the admin Views column and to each expert on their self-service editor
  • Experts → Email Experts: bulk messages with merge tags ({name}, {first_name}, {profile_url}, {edit_url}, {completeness}) and a one-click "select profiles under 80% complete"
  • Dashboard widget for managers: published/draft counts, average completeness, views this month, and the five stalest profiles

v1.3 admin experience

  • Branded "My Profile" welcome screen for Experts: completeness checklist, live stats, and one big Edit button — login and Dashboard both land here
  • Manager list filters: expertise, region, completeness range, stale/fresh, and "no Expert user linked"
  • Quick Edit now includes Job Title and Organization inline
  • Triage colors on the All Experts list: green edge (published, complete, fresh), yellow (needs attention), red (abandoned draft)
  • Directory Card Preview metabox on the edit screen — see exactly how the card renders, no tab-switching
  • Per-profile Activity log: field-level change history, status changes, reminder emails, imports, and bulk emails, with who and when

v2.5.0 — discoverability & polish

  • SEO: profile pages emit "Name — Job Title" document titles, a meta description drawn from the tagline, bio, or top topics, and Open Graph/Twitter tags including the headshot; the archive gets its own title and description. All of it automatically steps aside if Yoast, Rank Math, AIOSEO, or SEOPress is active.
  • Prev/next expert navigation: alphabetical Previous/Next cards at the bottom of each profile keep visitors browsing.
  • "Join the directory" CTA band on profiles and the directory — crimson banner with configurable heading, text, button label, and URL (Experts → Settings), on by default.
  • Empty-state polish: sparse profiles no longer render hollow sections. The contact card, General Information banner, and Biography card each hide entirely when they have nothing to show, and a profile with no content at all gets a graceful "details coming soon" note instead of empty headings.

v2.11.3

  • Fixed broken marker icons on the map (the pins were there, but rendering as broken-image placeholders) — a known Leaflet gotcha: its default icon auto-detects an "images/" folder next to its own script and prepends that guessed path onto whatever icon URL is actually configured, producing a mangled, double-prefixed 404. Removing the auto-detecting method before setting our own icon URLs fixes it — confirmed via a live browser check, not just static review this time
  • Added a sidebar list next to the map showing everyone currently plotted (photo, name, city) — click a person to pan/zoom the map to their pin and open their popup. Stacks above the map on narrower screens instead of sitting side-by-side

v2.11.2

  • Found the actual reason pins still weren't showing: LTC_Experts_Map::init() was never called anywhere in the main plugin file — the class loaded, but none of its three hooks ever registered: not the /map REST route (so it 404'd), not geocode-on-save, and not the daily cron backfill. This looks like it's been true since the map feature was originally built — geocoding has likely never run automatically on this site. Added the missing init() call
  • Added a "Geocode ROEs/ISCs and experts now" button (Experts → Settings) that runs a larger batch immediately instead of waiting on the daily cron's courteous trickle (15 ROEs + 10 experts/day), which could otherwise take several days to clear a backlog this size. Click again if the result shows more left to do

v2.11.1

  • Fixed the job title/organization text overflowing past the card edge on Grid view — a flexbox sizing gotcha: the card body has no explicit width, so it shrink-wraps to its content's natural size, and nowrap text (for the ellipsis truncation) has no upper bound, pushing it past the card instead of being clipped by it. Gave the body an explicit width: 100% so it's actually bounded by the card
  • Fixed the Map view showing zero pins — the query that finds matching experts required _ltc_lat to already exist on the post, which silently excluded every expert relying on the ROE/ISC fallback address (the majority, in practice) before they ever reached the fallback logic that was supposed to handle exactly that case. Removed that filter; the existing per-expert fallback (personal address → ROE/ISC address → skip) now actually runs for everyone

v2.11.0

  • Cards: job title and organization are now separate lines instead of one "Title · Organization" string — organization is bold. Applies to both Grid and List view
  • New Map view: every matching expert plotted with Leaflet + OpenStreetMap (no API key) and clustered with Leaflet.markercluster so dense areas collapse into a count bubble instead of overlapping pins. Pin location is the expert's own geocoded address, falling back to their ROE/ISC office address when they don't have one on file (the existing backend already did exactly this — it just never had a frontend). Hovering a pin shows a popup with everything the card itself shows (photo, name, title, organization, up to 3 topics) — but only city/state, never the street address. Leaflet and the clustering library load lazily, only the first time Map is actually opened, so Grid/List pages don't pay for it

v2.10.10

  • An expert can now belong to more than one ROE/ISC — the admin field is a multi-select (Cmd/Ctrl-click for more than one) instead of a single dropdown. Touches every place that assumed exactly one: display (profile page, CSV export) now lists all of them; CSV import's roe column accepts pipe-separated names, matching how topics/services/grade levels already work; bulk edit intentionally stays single-select/replace, since "set everyone selected to ROE X" is the sensible bulk operation. The directory's ROE filter dropdown is unchanged — filtering by one ROE among an expert's possibly-several still works correctly
  • Profile photo wrapper background changed from the maroon/purple gradient to white — it was only ever visible as a colored flash while the photo loads or showing through any transparency in the photo itself, neither of which is the point of that gradient (that's still used deliberately for the no-photo initials avatar, which is unchanged)
  • Previous/Next Expert links restyled to actually read as buttons — thicker border, bigger radius, and a hover lift/fill instead of a flat bordered box

v2.10.9

  • Default sort is now "Recently updated" instead of A–Z, on the directory page and the REST endpoint; the dropdown lists it first to match
  • Fixed the search icon floating above the search box instead of sitting inside it — same wpautop() <br>-insertion bug as earlier (a bare newline between the icon <svg> and the <input>, both inline elements with nothing else between them), just in a new spot. Applied the whitespace-stripping fix to the entire directory and profile page output this time, not just the piece that broke, so any other undiscovered instance of the same pattern is covered too
  • Experts → Import / Export now has a second section for bulk-loading the ROEs/ISCs themselves (name, address, city, state, zip, contact name/email) — separate from linking an expert to one, which was already possible via the roe column on the expert import. Matches by exact name; unmatched rows create a new ROE/ISC. Includes its own CSV export to use as a starter template or backup

v2.10.8

  • Removed the front-end self-service profile editor ([ltc_expert_edit_profile] shortcode and everything behind it) — Experts now edit their profile in wp-admin only, via the existing "My Profile" screen. The one shared utility it held (finding an expert's own profile ID) moved to LTC_Experts_CPT::get_own_profile_id(), since the invite flow and "My Profile" screen both depend on it and are unrelated to the editing form itself. If a page on the site still contains the [ltc_expert_edit_profile] shortcode, WordPress will now print it as literal text — remove or unpublish that page

v2.10.7

  • Removed the duplicate ROE/ISC meta box on the expert edit screen — WordPress was auto-adding its own hierarchical checkbox box for the roe_isc taxonomy alongside the purpose-built "ROE/ISC Information" box (which handles single-select assignment plus the ROE's address fields); the auto-generated one is suppressed now, the real one is unaffected
  • Removed the Organization field's "Learning Technology Center" placeholder — it was never an actual saved default (placeholders never are), but it read as one
  • Removed the Service Region taxonomy entirely: registration, admin filter dropdown, duplicate-expert copy, submenu link, frontend self-service checkboxes, REST/map query params, RSS feed field, printable profile line, single-profile display, CSV column, and the Settings slug override. Confirmed the ROE/ISC banner fact on the single profile page is fully independent of this and still displays whenever an expert has one assigned
  • Removed the First Name / Last Name fields (admin and frontend self-service editor) — the post title already is the expert's full name, and keeping both in sync was the actual redundancy. The native WordPress Title field is now the only place to edit it; a "Full name" field replaces the two on the frontend editor. CSV import/export changed from separate first_name/last_name columns to a single name column — existing CSV templates need updating to the new header row (shown on the Import/Export screen). vCard/CSV-export already had a title-splitting fallback for blank first/last, so existing profiles' more accurate stored names aren't affected — only new profiles going forward rely on the title split
  • Noted but not fixed (unrelated to the above, found while in this code): the frontend self-service editor pre-populates several fields (job title, organization, email, address, city, state, zip, miles, additional qualifications) by reading ltc_expert_{field} postmeta, but those are actually saved without that prefix — likely means those fields silently show blank on load even when already filled in

v2.10.6

  • Profile page: email, phone, website, "Save contact" (vCard — was built on the backend but never actually linked from the page), and social profiles are now one consistent row of icon buttons instead of a mix of big text buttons and small social icons; email is visually primary
  • Profile photo enlarged (260px, up from 200px) and given a matching shadow; the sidebar (photo, contact icons, topics/services) now stays in view while scrolling a long bio on desktop, and stays in normal document flow on mobile where it's stacked instead of side-by-side
  • Directory page: footer credit line linking to ltcillinois.org
  • Mobile pass across the sticky search bar, contact icon row, and profile sidebar to make sure nothing added this round fights the existing responsive layout

v2.10.5

  • Fixed the grid showing only two columns with big gaps: wpautop() was inserting a literal <br> between every card (and between the spans inside each card) because the shortcode's markup left plain newlines between inline elements it doesn't recognize as block-level; card output is now whitespace-stripped so nothing is left for it to convert
  • Cards: bigger photos (156px grid / 72px list), guaranteed equal heights (clamped name/role/tags plus grid stretch), the maroon ring removed from photos, list rows now actually stretch full width (a later CSS rule was silently overriding the width fix at equal specificity)
  • Directory speed: photos missing the dedicated crop (uploaded before it existed) now fall back to the full original — often 1MB+; Experts → Settings has a "Rebuild expert photo thumbnails" tool to backfill it. Card crop size right-sized to the new photo display size (400px → 320px). First row of cards loads eager/high-priority instead of lazy (they're above the fold). The AJAX layer now fetches a stripped-down fragment instead of the full themed page on every search/filter/page change, and Grid⇄List switching is instant (no fetch — it's a pure display toggle)
  • Search/filter bar is now sticky while scrolling, and no longer shifts position when results change height (scrollbar-gutter reserved)
  • Fixed the profile page's "+N more" topics/services toggle doing nothing — its script was registered as inline-only with no real file, which the site's JS-combining cache plugin was silently dropping; moved to a real external file
  • Profile page: larger corner radius across cards/banner/photo for a more modern look (a later rule was hard-overriding the radius variable back down to 8px)
  • "Interested in adding to the expert directory?" CTA now active by default at the bottom of the directory and every profile — the band already existed and was fully configurable in Settings, it just had no default contact URL so it rendered nothing; edit the text/button/link under Experts → Settings any time

v2.10.4

  • Grid columns are now explicit per breakpoint (4 / 3 / 2 / 1) instead of auto-fill — deterministic four-across on desktop regardless of how the theme distorts the container's computed width; cards stretch to fill their tracks with inherited max-widths and auto-margins neutralized
  • Cards condensed: smaller photo (84px), tighter padding and gaps, slightly smaller type and tags; inherited theme spacing inside cards zeroed (removing the stray vertical gap between the role line and the tags)

v2.10.3

  • SEO critical: the live /experts/ page was emitting noindex,nofollow — the plugin now forces index,follow on the directory archive and every expert profile via the wp_robots API, overriding whatever set it

v2.10.2 — full-width layout + profile-matched canvas

  • The directory now breaks out of the theme's content-width constraint properly (theme-native alignfull + hard width rules): the card grid fills the full content column with as many columns as fit, and list rows stretch edge to edge
  • The directory page sits on the same light-gray canvas as the individual profile pages, with the same card, border, and crimson accent language — the two pages now read as one designed system

v2.10.1 — clean-slate cards

  • Directory cards rebuilt with brand-new markup and class names (.ltc-xc): each card is a single element with its own compact, self-contained styles, so no rule in the legacy stylesheet can affect it — the recurring "extra empty box" has no mechanism left to exist
  • Controls refined: search, dropdowns, Search button, Clear filters, view switch, and pagination share one clean design — 44px height, soft 10px corners, subtle borders, crimson accents and focus rings
  • Grid and list variants both included, mobile-aware

v2.10.0

  • Fixed the extra empty box under every card: published expert posts with blank titles were rendering as blank cards; the public directory now excludes untitled posts entirely (clean them up under All Experts when convenient)
  • Form controls now inherit the site theme's own styles: the search field and dropdowns revert to native theme styling, the Search button uses the theme's wp-element-button design, Clear filters is a quiet themed link, and pagination is simple theme-adjacent numbers. The plugin now only manages layout (rows, gaps, widths)
  • AJAX enhancement layer: searching (as you type, debounced), filter changes, pagination, Grid/List switching, and Clear filters now update results in place with history/back-button support — built on top of the server-rendered page, so any hiccup falls back to a normal page load and the no-JavaScript path keeps working

v2.9.0 — separate capacities & the Access screen

  • Creating experts is now its own capability (create_ltc_experts), fully separate from editing — a role can edit existing profiles without being able to add new ones, or vice versa
  • New Experts → Access & Roles screen: a role × capacity matrix covering Create, Edit own, Edit anyone's, Publish, Delete own, Delete anyone's, View private, and Manage taxonomies — check any combination per role and it applies immediately. Companion capabilities (edit_published, edit_private, …) are bundled automatically so every checkbox behaves as expected; Administrators are locked to full access
  • Expert Manager gains the create capability; Administrators are re-synced on upgrade so nothing breaks on existing sites

v2.8.2 — directory visual cleanup

  • Removed the "View profile" element entirely — the whole card is a link, and legacy styles were rendering it as a detached white box under every card (grid) and an empty band under every row (list)
  • One inner container now governs the width of the toolbar, count row, cards, and pagination — everything aligns to the same edges
  • The form is two intentional rows: search + Search button (+ Clear filters when active), then the filter dropdowns and sort with sensible width caps
  • Grid cards get a uniform circular photo zone (104px, photo or crimson-gradient initials) so rows line up instead of staggering
  • List rows always show an avatar — photo or initials — including experts without photos

v2.8.1

  • Inviting an expert (or granting the Expert role to an existing user) now adopts the existing directory profile whose email matches, instead of creating a duplicate draft — essential for imported directories where profiles predate accounts

v2.8.0 — the simple, foolproof directory

  • The directory search page is rebuilt from scratch as a fully server-rendered form: search, all four filter dropdowns (with live counts), sort, Grid/List view, numbered pagination, and Clear filters all work through ordinary page loads. If a browser can render HTML, this page works — there is no JavaScript to fail, no REST calls to block, no cache-version mismatch that can break it. A three-line inline enhancement auto-submits when a dropdown changes; without it, the Search button does the identical job.
  • Every state is a shareable URL (e.g. ?ltc_topic=autism&ltc_view=list), and search-engine crawlable.
  • Friendly empty state with a one-click reset when no experts match.
  • The map is removed entirely, per decision: no Leaflet, no map view, no geocoding background tasks, no bundled vendor scripts. ROE/ISC address and contact fields remain on the taxonomy for reference and future use.
  • The old client-side directory script is deleted outright.

v2.7.3 — toolbar redesigned from scratch

  • One unified toolbar layout for every screen size: search on top (full width on phones), filter dropdowns as flexible pills that wrap two-up on mobile, then view toggle, sort, and Clear filters in the flow. The mobile slide-up filter sheet, Filters button, and overlay are fully retired — fewer moving parts, nothing left to break
  • All controls share one 44px pill design; the definitive style layer overrides every legacy toolbar rule with hard precedence
  • Cards are only as tall as their content — no more stretch-to-match-the-tallest-card whitespace
  • Directory hero is centered with proper breathing room
  • Load more button is smaller and quieter
  • Map initialization now logs to the browser console: success (with plugin version — instantly confirms whether cached assets are stale) or the exact reason it stopped (missing container / Leaflet unreachable)

v2.7.2

  • List view: fixed the phantom empty box under every row (the grid hover CTA was rendering white-on-white as a block); rows are now true single-line entries — name, ellipsized title/organization, tags right — with the accent strip removed in list contexts
  • Split map view rows ellipsize the role line instead of wrapping word-by-word
  • Toolbar controls are top-aligned with stray margins zeroed
  • Grid rows separated by a full 24px; list rows by 14px
  • The map pane gets an explicit 640px height when revealed so it can never collapse
  • Archive header is now a proper hero: bold crimson Roboto title with a gradient underline accent plus a one-line subtitle
  • Note for cached hosts (Pressable, Cloudflare, etc.): asset URLs are version-stamped, but cached HTML can keep pointing at old versions — purge the site cache after updating

v2.7.1

  • Fixed "chips is not defined": a leftover reference to the removed topic chip-cloud broke every filter refresh (and blocked the map from initializing); the Topics dropdown is now fully wired into state, URL, and pills
  • Map bootstraps reliably: size recalculation after reveal so it can't render as a blank pane
  • Toolbar polish: search, all filter dropdowns, sort, and view toggle share one 46px pill design with brand-crimson focus states and custom chevrons; the view toggle is a proper segmented control
  • "✕ Clear filters" button appears in the toolbar whenever any filter is active
  • Grid gains real 20px gaps with equal-height cards; List view rows have consistent spacing and anatomy — the NEW badge is pinned top-right so it can no longer shove a row's content sideways
  • Split map view: compact rows with capped tags, so no more towering cards in the side list
  • Load more button: centered, brand crimson, proper padding
  • Profile eyebrow: content-width with rounded corners, larger presence, and a bordered pill link

v2.7.0 — directory reliability + profile UX

  • Fixed: the ROE/ISC taxonomy was never registered in 2.6.0 (initialization miswired) — filters referencing it and the migration now work
  • Fixed: filter/Load More/map requests now send the REST nonce with same-origin credentials, so security plugins that lock down the REST API for visitors no longer break the directory for logged-in users; failures now show the HTTP status and log response details to the browser console instead of a generic message
  • Leaflet and MarkerCluster are now bundled with the plugin (no unpkg.com CDN) — school and district content filters that block CDNs were killing the map
  • Filters, search, view toggle, and sort now sit in a single row on desktop; the mobile filter sheet is unchanged
  • Search field polish: the magnifier sits inside the rounded input with proper focus styles
  • Load More button now uses the brand crimson
  • Profiles get a slim crimson "IARSS Expert Directory" eyebrow bar below the site header with a View All Experts link
  • Topics/Services on profiles collapse after 5 tags with a "+N more" toggle; long tag names wrap gracefully (left-aligned, tighter line-height) instead of forming awkward blobs

v2.6.0 — ROE/ISC becomes a taxonomy that drives the map

  • New ROEs/ISCs taxonomy on experts (no extra post type), with Address, City, State, Zip, Contact name, and Contact email fields on each term
  • One-time migration: every old roeisc post becomes a term (address + contact meta copied over — works even if CPT UI is already gone), and every expert is assigned to its ROE/ISC via the old ACF relationship value; fresh sites seed the official 38-entry list
  • ROE/ISC addresses are geocoded automatically (on save + daily background task) and drive the directory map: experts without a personal address are pinned at their ROE/ISC office (the existing per-expert jitter keeps colleagues from stacking), and inherit those coordinates for nearest-first sorting
  • The ROE dropdowns in the admin editor, self-service editor, bulk edit, and CSV import now source from the taxonomy and assign the term
  • New ROE/ISC filter dropdown (with counts) in the directory, wired into search, the map, pills, and URL state

v2.5.0

  • SEO: profile pages set a proper document title ("Name — Job Title"), meta description (tagline → bio excerpt → job + topics), and Open Graph/Twitter tags with the headshot; the archive gets its own title and description. All of it steps aside automatically if Yoast, Rank Math, AIOSEO, or SEOPress is active.
  • Prev/next expert navigation: alphabetical Previous/Next cards at the bottom of every profile, replacing the removed blog post navigation.
  • "Join the directory" CTA band above the footer on the directory and every profile — crimson gradient, configurable text/button/URL under Settings (toggle to hide).
  • Empty-state polish: the General Information banner, Get in touch card, Topics/Services card, and Biography sections now render only when they have content; travel distance no longer shows a default for profiles that never set it; fully sparse profiles get a friendly "still being completed" note instead of empty headings.

v2.4.0 — proper page framing on block themes

  • Expert profiles and the /experts/ archive now register real block templates (WordPress 6.7+ block themes such as Twenty Twenty-Five): the site's own header and footer render, and the blog chrome is gone — no serif post-title band, no "Written by …" byline, no previous/next post navigation, no "More posts" section, no stray whitespace
  • The expert's name now lives at the top of the identity card, above the photo, instead of a detached page title
  • The directory archive gets a clean "Expert Directory" heading in the brand crimson
  • Classic themes continue to use the bundled PHP archive template; nothing changes there

v2.3.0 — bulk edit

  • Bulk edit expert details from All Experts: select profiles → Bulk actions → Edit → Apply. Alongside the native status/author/taxonomy controls (Topics, Services, Grade Levels, and Regions checklists are built in), you can now set Job Title, Organization, ROE/ISC, Address, City, State, Zip, Miles Willing to Travel, Phone, and Website across every selected profile at once. Blank fields and "— No change —" selections leave existing values untouched; ROE, State, and Miles are validated against their official lists; every change lands in each profile's activity log as "Bulk edited: …".

v2.2.2

  • Fixed duplicate taxonomies (e.g. "Grade Levels" appearing twice): slug adoption previously ran after the plugin registered its own fallbacks and could lock onto its own empty taxonomy. Detection now runs first and reads actual term assignments from the database, always choosing the taxonomy that really holds the data — and it re-runs once on upgrade to self-heal any mis-adopted mapping. The leftover empty duplicate disappears from the editor and admin columns automatically.

v2.2.1 — photo recovery

  • Photo sideload failures are no longer silent: the import result now reports how many photos attached and lists the reason for each failure (timeouts, blocked downloads, bad URLs)
  • New "Photos only" import mode: re-upload the same CSV and it matches existing experts (email, then name) and attaches only the missing featured photos — no field changes
  • On upgrade, experts missing a featured image adopt one from common ACF image-field meta (photo, headshot, profile_image, …) whether stored as an attachment ID or a same-site URL
  • Each photo download gets its own extended time limit so large batches don't die mid-run

v2.2.0 — ACF & CPT UI takeover (zero data loss)

  • The plugin now registers the site's existing experts post type itself (at a later init priority, so it takes over cleanly whether CPT UI is active or deleted). All existing expert posts keep working.
  • All profile fields now read and write the original ACF meta keys: first_name, last_name, email, job_title, organization, presenter_bio, additional_qualifications, roe, address, city, zip, state, miles_willing_to_travel. Deleting ACF removes only the field-editing UI — the data rows stay and this plugin keeps using them.
  • ROE handles every historical format: ACF Relationship values (post IDs) resolve to the related post's title and are preserved on save; new selections store the official ROE/ISC list value. Travel radios accept legacy capitalization ("Statewide").
  • presenter_bio is copied into the post content on first upgrade (originals untouched; existing content never overwritten), with a runtime fallback for any stragglers.
  • Taxonomy slugs are auto-adopted from whatever CPT UI attached to the post type (topics/services/grades/regions matched by name), stored, and editable under Settings → Taxonomy slugs.

Migration checklist

  1. Install/activate this plugin while ACF and CPT UI are still active
  2. Visit Experts → Settings and confirm the four Taxonomy slugs match CPT UI (Tools → Taxonomies)
  3. Spot-check a few expert profiles on the front end (bio, ROE, travel, topics)
  4. Deactivate + delete CPT UI, then ACF — permalinks and data persist
  5. If /experts/ 404s after removal, visit Settings → Permalinks once to flush

v2.1.0

  • Fixed the split map view: directory scripts now load in guaranteed order (Leaflet → clustering → directory), and the map initializes only after the split layout has painted, with a delayed re-measure — the map pane renders reliably.
  • Removed the Illinois Regions quick-filter and ZIP code search (server endpoints, UI, and URL state). "Sort: Nearest" remains available via the map's ◎ locate control.
  • All filters now sit on one row on desktop: Search, Topic, Service, Grade level, Region, sort, and view toggle. Topics moved from a chip cloud to a dropdown with counts. On mobile everything still collapses into the Filters sheet.
  • Restyled for iarss.org (Twenty Twenty-Five): deep crimson #7F0B17 primary with neutral grays, Roboto typography, quieter 8px corners, and a crimson General Information banner on profiles. Colors remain adjustable under Experts → Settings.

v2.0.1

  • CSV import/export gains an optional photo_url column: on import, the image is sideloaded into the Media Library and set as the featured photo (existing photos are never overwritten)

v2.0 — map overhaul & discovery

  • Map redesigned: brand photo-circle markers with navy cluster bubbles (Leaflet.markercluster), muted CARTO Positron tiles, and the map locked to Illinois (bounds + min zoom) so it can never drift away
  • Experts sharing an office address no longer stack — a small deterministic offset spreads their pins
  • Rich map popups: mini expert card with photo, role, topic tags, and a View Profile button
  • Clicking a pin draws that expert's travel-radius circle (50/100/200 miles)
  • Map view is now a split layout: scrollable expert list beside the map with two-way hover highlighting (card ↔ pin)
  • "Experts near me" locate control centers the map and sorts by distance
  • New List view (compact rows) joins Grid and Map; the active view persists in the URL
  • Distance search: enter a ZIP (or use locate) and cards sort nearest-first with mile badges; ZIP geocoding is cached 30 days
  • Illinois zone quick-filter: a clickable six-region state map (stylized) filters experts by ROE/ISC groupings
  • Topic chips and filter dropdowns show live counts, e.g. "Cybersecurity (8)"
  • Profile pages prefetch on card hover for instant navigation

v1.9

  • The directory now renders automatically at /experts/ — no shortcode page needed. The archive template includes a titled header and the full search/filter/map experience. (Rewrites also auto-flush on plugin upgrade, so the URL resolves immediately after updating.)
  • Duplicate: managers and admins get a "Duplicate" row action on All Experts that clones the profile (fields, meta, taxonomies, photo, resources) as a draft titled "(Copy)", with analytics, activity history, and reminder throttles reset.
  • Removed the Save Contact and Print/PDF buttons from public profiles (the underlying endpoints remain for direct links).

v1.8

  • Email deliverability tools under Experts → Settings: "Send test email to me" button, last-failure capture (wp_mail errors are now recorded and displayed), and optional From name/address override. If mail still doesn't arrive, the site needs SMTP (WP Mail SMTP or host-level sending) — plain WordPress mail is unreliable.
  • The Experts admin menu is organized into sections with separator lines: content (All Experts / Add New), classification (Topics / Services / Grade Levels / Regions), tools (Invite / Email / Import-Export), then Settings. Experts see My Profile pinned on top.
  • Profile redesign in the consultant-directory style: soft gray canvas, left column of white cards (photo, Get in touch, Topics & Services), and a blue gradient General Information banner with icon rows (location, ROE/ISC, email, travel, phone, grades, regions) over decorative circles, followed by a clean Biography card.
  • Email appears exactly once, as plain text in the banner; clicking it silently copies the address and shows a quiet "Saved ✓" snackbar. Phone works the same way. No visible "copy" chrome.

v1.7

  • Email is now required (admin marker + enforced in the self-service editor)
  • ROE is a fixed dropdown of all 35 Illinois ROEs and 3 ISCs (official list built in; values validated on save); the ROE/ISC post-type setting was removed
  • State is a dropdown defaulting to IL
  • Resources & Downloads accepts multiple files in one upload (admin and self-service), each validated individually
  • Expert profiles use the classic metabox editor — the block editor is disabled for this post type
  • Topics taxonomy is seeded on activation (Assessments, Autism, Classroom Management, Co-teaching, College/Career Pathway Endorsement, College/Career Readiness, Competency Based Learning) alongside Services and Grade Levels
  • Frontend: social links render as circular icons (LinkedIn, X, Bluesky, Mastodon, YouTube) with accessible labels; the directory and profiles break out to full viewport width with comfortable inner measures; larger, calmer typography; flatter, simplified hero and panels

v1.6 — UX modernization (LTC brand palette)

  • Skeleton shimmer cards while results load, with a staggered fade-up entrance for arriving cards (respects prefers-reduced-motion)
  • Sticky, blurred filter toolbar that stays available while scrolling
  • Active filters shown as removable pills ("Cybersecurity ✕") under the search bar
  • Infinite scroll via IntersectionObserver with the Load More button kept as an accessible fallback, plus a floating Back-to-top button
  • Mobile: filters collapse into a "Filters (n)" button opening a bottom sheet with Clear all / Show results; topic chips swipe horizontally with scroll-snap
  • Profile redesign: gradient hero band with the photo overlapping the boundary, two-column layout with a sticky "Get in touch" rail on desktop, and a fixed bottom action bar (Email / Save / Print) on mobile
  • Tap-to-copy email and phone with a "Copied ✓" toast — no more broken mailto on devices without a mail client

v1.5 — field parity with the legacy Expert form

  • Personal Information: separate First Name and Last Name (profile title auto-composed), Email, Job Title, Organization
  • Qualifications: Presenter Bio (main editor), Additional Qualifications textarea, credentials badges
  • ROE/ISC Information: ROE dropdown sourced from your roeisc post type (configurable in Settings; falls back to a text field), Address, City, Zip, State, and Miles Willing to Travel (50/100/200/Statewide)
  • Taxonomies now match the original: Services (seeded with Coaching, Consulting, Facilitation, Mentoring, Online Learning, PD & Teacher Training), Topics, Grade Levels (seeded PK–12), plus Service Regions
  • Services and Grade Level filters added to the public directory; map geocoding now uses the structured address
  • Required fields are marked and enforced in the self-service editor; CSV import/export updated to the full field set (new header layout — re-export for a fresh template)

v1.4 additions

  • Map view: Grid/Map toggle on the directory. Locations are geocoded automatically (OpenStreetMap Nominatim — no API key) and rendered with Leaflet; pins respect the active search and filters. Existing profiles are backfilled a few per day by cron.
  • "New" badge on experts published in the last 30 days
  • Feeds: RSS at /feed/ltc-experts/ and JSON at /wp-json/ltc-experts/v1/feed for partner-site syndication (honors field visibility settings)
  • Search autocomplete: expert names and expertise terms suggested as you type
  • Resources & downloads: attach up to 8 PDFs/Office files per expert (admin metabox and self-service editor), listed on the public profile
  • Additional social links: X/Twitter, Bluesky, Mastodon, YouTube — with a visibility toggle in Settings and click tracking
  • Weekly manager digest email (Mondays): new/edited profiles, drafts, stale count, and most-viewed experts

Automation

  • Daily check emails experts whose profile hasn't been updated in N months (default 12), throttled to one reminder per 90 days, 25 emails/day max

Setup

  1. Activate the plugin.
  2. Create a page with [ltc_experts_directory] for the public directory.
  3. Add Areas of Expertise under the Experts menu. Experts edit their own profile in wp-admin (My Profile), not on the front end.
  4. Invite experts from Experts → Invite Expert, or import from CSV.

Linking a user to a profile: set the profile's Author to their user account, or just give them the Expert role (a draft profile is created automatically), or use the linked_user_email column in a CSV import.

Notes

  • Stale reminders require WP-Cron (or a real cron hitting wp-cron.php).
  • Regenerate thumbnails after activating on an existing site so the new square crops exist for old photos.
  • Map view requires outbound requests to nominatim.openstreetmap.org (geocoding) and unpkg.com + tile.openstreetmap.org (Leaflet + tiles).
  • Re-save a profile (or wait for the daily backfill) to geocode locations added before v1.4.
  • Visit Settings → Permalinks once after updating so the /feed/ltc-experts/ rewrite registers.
  • Uninstall removes roles, settings, and scheduled events but keeps all profile content.