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.
by Learning Technology Center of Illinois · github.com/learning-technology-center/iarss-wordpress-plugin · website
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/learning-technology-center/iarss-wordpress-plugin/archive/refs/heads/main.zipReadme
=== IARSS Expert Directory === Contributors: Learning Technology Center Requires at least: 6.0 Tested up to: 6.7 Requires PHP: 7.4 Stable tag: 2.11.3 License: GPLv2 or later
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/mapREST 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 missinginit()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_latto 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
roecolumn 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
roecolumn 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 toLTC_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_isctaxonomy 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
namecolumn — 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).