Description
IQ Jobs Manager adds a “Job Opening” post type with a simple classic-editor admin screen (title + one form for
location, type, salary, deadline, etc. — no page-builder or block-editor knowledge required), a public Careers page
you set up by picking pages in Settings (no shortcodes to add), a secure application pipeline (resumes are never
stored at a public URL and are only ever emailed as an attachment or downloaded through a login-gated link), and
HR tools for tracking and exporting applications.
Displaying content on your site
Go to Job Openings > Settings and pick a page for “Job Listings Page” and/or “General Application Form Page”.
The content appears there automatically — nothing to paste into the page editor.
If you’d rather place things manually, two block-editor blocks are also available — “Job Listings” and “Job
Application Form” — searchable from the block inserter. The classic shortcodes still work too, for page builders or
older themes: [career_jobs] (job listing with Apply buttons) and [career_form] (the general application form).
Admin
- Job Openings > Add New — HR fills in one form (description, location, type, experience, salary, openings,
skills, deadline) and clicks Publish. - Job Openings > Form Fields — toggle/relabel which fields appear on the application form, and add custom
fields (label + type — the internal field name is generated automatically). - Job Openings > Settings — pick the Job Listings / Application Form pages, set the HR notification email, and
configure uninstall data behavior. - Applications — view submissions, change status (New / Reviewed / Interview / Hired / Rejected), download
resumes, export to CSV. Each application also records the applicant’s IP address and browser (user agent) to
help spot spam patterns. - Job Openings > Analytics — page views, Apply clicks, submission attempts/successes/failures, overall and
broken down per job, over the last 7/30/90 days or all time.
External services
This plugin can optionally connect to Google reCAPTCHA to help protect the application forms (the Apply modal and
the general application form) from spam and automated submissions. It is off by default and only takes effect
if you enable it and enter your own site key and secret key under Job Openings > Settings > reCAPTCHA.
When enabled:
- The applicant’s browser loads Google’s reCAPTCHA script (
https://www.google.com/recaptcha/api.js) so the
widget can render (v2) or a token can be generated (v3). - When the applicant submits the form, the site sends the reCAPTCHA response token and the applicant’s IP address
to Google’s verification endpoint (https://www.google.com/recaptcha/api/siteverify) to confirm the submission
wasn’t automated. - When an administrator saves a reCAPTCHA secret key in Settings, the site makes one request to the same Google
endpoint to confirm the key is valid.
This service is provided by Google LLC:
Terms of Service | Privacy Policy
No other third-party/remote service is contacted by this plugin.
Blocks
This plugin provides 2 blocks.
- Job Application Form The general job application form.
- Job Listings Job listing with search/filter and Apply buttons.
Installation
- Upload the
iq-jobs-managerfolder to/wp-content/plugins/. - Activate the plugin through the ‘Plugins’ menu in WordPress.
- Go to Job Openings > Settings, set the HR notification email, and pick your Job Listings and Application Form
pages.
FAQ
-
Do I need to add shortcodes to my pages?
-
No. Pick a “Job Listings Page” and/or “General Application Form Page” in Job Openings > Settings and the content
appears there automatically. Shortcodes ([career_jobs],[career_form]) and block-editor blocks are also
available if you’d rather place things manually. -
Where are submitted resumes stored?
-
In a private subfolder of your uploads directory (
wp-content/uploads/iqjoma-private-resumes/), under a randomly
generated filename and blocked from direct access. Resumes are never given a public URL — they can only be
downloaded from wp-admin (Applications screen) by a logged-in Administrator via a capability- and nonce-checked
link, or received as an email attachment if HR notification emails are enabled. -
Who can see submitted applications?
-
Only Administrators, by default (not Editors, Authors, or Contributors), since applications contain applicant PII
(name, email, phone, resume). -
Is Google reCAPTCHA required?
-
No. It’s off by default. You can enable it (v2 checkbox or v3 invisible) from Job Openings > Settings > reCAPTCHA
with your own Google reCAPTCHA site/secret keys. See “External services” below for what that sends to Google. -
What happens to my data if I delete the plugin?
-
By default, nothing is deleted — job openings, applications, resumes, and settings are all kept. Deletion only
happens if you explicitly enable “Delete data on uninstall” in Settings before removing the plugin.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“IQ Jobs Manager” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “IQ Jobs Manager” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
3.0.31
- Plugin Check: the custom application-field values array is inherently sanitized per-element further down (the
right sanitizer depends on each field’s configured type, known only inside that loop), so there’s no single
sanitizer that could apply at the point the array is first read — documented with an inline justification instead
of restructuring further.
3.0.30
- Re-ran Plugin Check after 3.0.29 and fixed what it still caught: a translators comment that had drifted away from
its printf() call (a phpcs:ignore line got inserted between them), two wp_dropdown_pages() calls where a
single-line ignore comment didn’t reach the flagged values nested inside its multi-line array argument (now
bracketed with phpcs:disable/enable instead), a card_button_text field now sanitized once into a variable instead
of re-reading $_POST across two branches, custom application-form field values now unslashed at the array level,
and the CSV export date filters now read $_GET once per key instead of multiple times across a ternary.
3.0.29
- Addressed the full Plugin Check report: a few remaining unescaped values (including one only reachable via
printf(), which the earlier manual review pass missed), several missing wp_unslash() calls, replaced direct
filesystem calls (unlink()/rmdir()) in uninstall.php with WP_Filesystem, and prefixed uninstall.php’s local
variables. Remaining Plugin Check warnings (custom-table direct queries, read-only GET filters without a nonce,
a couple of confirmed-safe false positives) are left in place with an inline explanation at each one rather than
worked around, since none of them are real issues.
3.0.28
- WordPress.org review follow-up: renamed the plugin’s internal prefix (options, hooks, post types, script/style
handles, meta box IDs, etc.) from the too-short “cjm”/”job” to “iqjoma” throughout, to avoid collisions with other
plugins. All dynamic output that reaches an echo/print statement is now either escaped at the point of output or,
where a helper method already escapes everything it builds internally (verified case by case), marked with an
inline phpcs:ignore and a short justification instead of double-escaping already-safe HTML. - Sites that already had this plugin active before 3.0.28 are migrated automatically and once, the first time this
version runs: existing settings, form field/custom field config, the Analytics history table, published jobs, and
submitted applications are all moved over to the new names. Nothing is deleted and no action is needed.
3.0.27
- WordPress.org review follow-up: resumes now store under the uploads directory (via wp_upload_dir()) instead of a
hardcoded wp-content path. The “Powered by” credit link now defaults off — site owners must explicitly opt in
from Settings > General. Inline admin CSS/JS is now enqueued through wp_add_inline_style()/wp_add_inline_script()
instead of being echoed directly. Nonce values are sanitized before verification. Removed the no-longer-needed
load_plugin_textdomain() call. Fixed the header short description’s shortcode wording to match the readme.
3.0.26
- Fixed WordPress.org automated plugin-check failures: both block.json files now declare apiVersion 3 (required for
the WordPress 7.0+ iframed block editor), and the resume upload handler now moves the uploaded file via the
WP_Filesystem API (with an explicit is_uploaded_file() check) instead of calling move_uploaded_file() directly.
3.0.25
- WordPress.org submission prep: added a GPL license header to the plugin’s main file, added External Services
and FAQ sections to this readme, and removed a self-hosted-only “View details” popup that would have shadowed
WordPress.org’s own plugin info screen once listed there. - The “Powered by IQ Jobs Manager” credit link (shown on the job listing, job detail, and application form pages)
is now optional — toggle it off from Settings > General. Was previously always shown with no way to disable it. - Hardened CSV export against formula/CSV injection: applicant-supplied values (name, message, custom field
answers) are now prefixed with a leading quote if they start with a character (=, +, -, @) that spreadsheet
apps could interpret as a formula when the export is opened. - Number of Openings is now stored as a plain integer instead of free text.
- Minor: job posting structured data’s deadline now uses UTC rather than the server’s local timezone.
3.0.24
- Fixed shared job links showing this plugin’s own small “Powered by” logo in the link preview instead of the
site’s own icon. Job posts have no featured image (no image field exists for them), so whatever generates the
preview card was falling back to scanning the page and picking up our logo image instead. Jobs with no featured
image now report the site’s own Site Icon (Settings > General > Site Icon) as their featured image, which is
what virtually every SEO plugin/sharing platform checks first.
3.0.23
- Fixed the ID-prefixed job URL (e.g. /jobs/5433-growth-lead-job-25072026/) 404ing right after a job was published,
even though the plain slug URL worked. The rewrite rule that recognizes the ID-prefixed format is generic (any
ID + any slug) and normally only needs flushing once, but if a job got published before that flush had actually
run for this site (e.g. right after a plugin update), its URL would 404 until something else happened to trigger
a flush later. Now a flush also runs the moment a job is first published, closing that gap.
3.0.22
- Settings page now tests the reCAPTCHA secret key against Google when you save (if reCAPTCHA is enabled and a
secret key is set), showing whether it looks valid or invalid right alongside the “Settings saved” notice.
Settings are always saved regardless of the check result, so a typo doesn’t cost you your other changes — you get
clear feedback and a chance to fix it, instead of only finding out when a real applicant’s submission fails.
3.0.21
- Fixed the grid card’s eye-icon badge not lining up with the title — it was absolutely positioned at a guessed
pixel offset rather than actually being measured against the title, so title length/wrapping could throw the
alignment off. Title and badge now share a flex row instead, keeping them level regardless.
3.0.20
- Fixed the hero paragraph’s margin-top (added last release) never actually applying when Elementor is active — the
rule setting it used an “h1 + p” adjacent-sibling selector, but wrapping the heading in its own
.elementor-widget-heading div (an earlier fix) put a div between the h1 and the paragraph in the DOM, silently
breaking that selector’s match. It’s now targeted by the paragraph’s own class instead, which doesn’t depend on
exact DOM nesting.
3.0.19
- Added margin-top: 20px to the hero paragraph text (the rule setting its margin already existed and was
explicitly zeroing out its top margin, so it needed updating directly there rather than a new rule elsewhere).
3.0.18
- Increased the gap between the hero section and the filter bar below it to 10rem total — 5rem of bottom padding on
the hero plus 5rem of top margin on the filter bar (kept as margin rather than padding on the filter bar itself,
so its own compact pill shape isn’t stretched out).
3.0.17
- Increased the gap between the hero heading and the text below it from 16px to 20px.
3.0.16
- Apply modal: the close “x” is now in a proper flex row with the title instead of being absolutely positioned in
the box’s corner, so it’s reliably vertically centered against the heading text rather than floating above it. - Modal/form container padding no longer shrinks on small screens — it now stays the same at every width.
- Added top spacing above the meta/Apply row on the overview page on mobile.
- Removed the “Share:” label before the share icons.
3.0.15
- Found the actual source of the recurring hover/click color changes: the active theme (Astra) has its own global
“button:hover, button:focus” rule that repaints background/text/border color on every plain element
site-wide. Removing our own hover rules in earlier rounds wasn’t enough — it just left nothing to stop that theme
rule from taking over instead. All 5 of our buttons (copy-link, Apply, Submit, filter Search, modal close) now
explicitly pin their resting colors against it on hover/focus/active/click, and Apply/Submit no longer depend on
the theme’s own “.button” class for their color, so there’s no more cascade-order gamble there either.
3.0.14
- Fixed the Job Listings page hero heading still not matching other Elementor-built pages’ heading weight/spacing/
color. It was correctly picking up Elementor’s site-wide default heading size, but not the bolder weight, tighter
letter-spacing, and darker color other headings have — those come from a per-page Elementor override tied to that
specific page’s own widget ID, which our heading (not a real Elementor-authored widget) has no way to match. Set
the same values directly instead.
3.0.13
- Changed the filter bar’s Search button from blue to yellow with dark text, matching the Apply button’s color.
- Grid card corner badge’s mobile top offset changed from 20px to 24px.
3.0.12
- The blue circle on the Apply modal’s close button on click wasn’t fixed by the previous round’s outline/tap-
highlight reset — it’s most likely the theme’s own Bootstrap-style focus glow, which is a box-shadow ring, not an
outline. Explicitly cleared box-shadow (and native button appearance) on the close button for every interaction
state (hover/focus/active).
3.0.11
- Removed every hover-state color change on buttons (hero button, icon buttons/share row, filter Search button, view
button) — they’re now visually static on hover/click, no exceptions. - Killed the mobile browser’s own default blue tap-highlight/focus flash on buttons (a WebKit default we’d never
explicitly turned off) — this is what was showing as a blue circle behind the Apply modal’s close “x”. - Fixed the Apply modal: a long job title wrapping to two lines could run underneath the close “x” button since no
space was reserved for it; the heading now keeps clear of it. Increased the gap between form fields, and gave
inputs slightly more breathing room (padding/corner radius).
3.0.10
- Fixed job card and list row titles (h5) also being subject to the active theme’s own responsive heading rule at
narrower widths, same root cause as the hero heading fix in 3.0.9 — they now have an explicit font-size that
can’t be overridden by it. - The grid card’s corner badge (the eye icon / “Applications Closed” label) now sits closer to the top on mobile
(20px instead of 30px), matching the card’s own reduced mobile padding. - Fixed the “Powered by” line: only the icon links to iquesters.com now, not the whole “Powered by … Jobs
Manager” line.
3.0.9
- Fixed the Job Listings page hero heading picking up the active theme’s generic mobile heading size instead of
Elementor’s own heading typography when Elementor is active — the heading was using Elementor’s CSS classes but
wasn’t wrapped in Elementor’s own widget container, so Elementor’s real (already-loaded) heading styles never
actually matched it and the theme’s own responsive “h1” rule won by default instead. It’s now wrapped correctly
so Elementor’s own styling takes over as intended. - The hero heading and text are now left-aligned on mobile instead of centered.
- Removed the green “success” background/border the copy-link button switched to after a click — the “Copied!”
tooltip already confirms the action, so the button itself no longer changes color.
3.0.7
- Removed the “|” separator between meta items (location/type/salary, posted-date/experience, list-row meta, card
meta) on small screens. No static CSS rule can tell where a flex row will actually wrap, so whenever only one
item ended up alone on its own line, it still showed a stray pipe next to nothing. Below 600px the pipes are
dropped entirely — each item already has its own icon, so the spacing alone reads fine without them. - Fixed a font-size mismatch on the overview page header: the location/type/salary row had no explicit font-size
(inheriting the theme’s default) while the posted-date/experience row below it was set to 0.9em, so the two rows
visibly rendered at different sizes. Both now use the same 0.9em.
3.0.6
- The “Powered by [icon] Jobs Manager” line shown on every plugin-rendered page now links to iquesters.com, the
same way “Powered by WordPress” links to wordpress.org. - On the Plugins screen: the author is now “Iquester Solutions LLP” (linked to iquesters.com) instead of
“Custom”, and there’s now a “View details” link next to it that opens the same details popup WordPress.org-hosted
plugins get — this plugin isn’t on WordPress.org, so that popup is now hand-built from this readme instead.
3.0.5
- Fixed the “|” separator between meta items (location/type/salary, posted-date/experience, list-row meta, card
meta) leaving a stray hanging “|” at the start of a wrapped line on narrow screens. It was baked onto the front
of each item, so when an item wrapped onto a new line, its leading “|” wrapped with it and landed with nothing
before it. It’s now baked onto the end of each item instead (skipped on the last item), so it reads as normal
trailing punctuation at the end of the previous line instead of a stray mark starting the new one.
3.0.4
- Openings + application deadline on the overview page now sit together under an “Additional Information” heading
with consistent spacing, instead of as two loose pills with inconsistent gaps between them. - Copy-link button: the icon now recolors on hover (previously only the background changed), and clicking it shows
a small “Copied!” tooltip above the button instead of only updating the accessible label. - Rebuilt the job filter bar’s dropdown/submit styling to look like one cohesive component instead of a native
select next to a theme-default button, and fixed a mobile layout bug where the search field could stretch to
240px tall (flex-basis meant for width was being applied as a height once the bar switched to a column layout).
On mobile, the Type/Location dropdowns now share one line instead of stacking one per row.
3.0.3
- Fixed the overview page’s meta rows (location/type/salary and posted-date/experience) rendering in a different
font on mobile than desktop — some themes/builders apply different responsive typography per breakpoint, which
this text was just inheriting; it now uses a fixed font stack instead. - Reverted the mobile-only “stack one item per line” layout from the last release — it wasn’t actually needed:
the “|” separator lives inside each item itself, so it already wraps together with its item instead of getting
stranded. Mobile now wraps naturally (as many items as fit per line, “|” between each), same as desktop.
3.0.2
- “Openings” on the overview page restyled as a quiet rounded badge, matching the “Apply by …” tag next to it
instead of plain text. Also fixed a bug this surfaced: it shared a class with the meta-row items that get a
“|” separator before them, which could incorrectly show a stray “|” in front of the badge.
3.0.1
- Restored the job title being moved inside the detail card, and the “|” separators in the overview page’s meta
rows — both had been mistakenly removed in the previous release while fixing an unrelated loading flash. The
flash is now fixed properly instead: the title move happens via a synchronous inline script positioned right
after the card in the page HTML (runs while the browser is still parsing, before that part of the page is
painted) rather than a DOMContentLoaded listener (which only runs after the whole page has already rendered). - Fixed the mobile bug that prompted the “|” removal properly this time: on narrow screens the meta rows now
stack one item per line (so there’s no wrap point for a separator to get stranded at) instead of losing the
separator on desktop too.
3.0.0
- Added an Analytics dashboard (Job Openings > Analytics): page views, Apply button clicks, submission attempts,
successes, and failures — overall and broken down per job, with a 7/30/90-day or all-time range selector.
Backed by a new database table, not third-party analytics. - Applications now record the applicant’s IP address and browser (user agent), shown on the application’s admin
detail screen and included in CSV exports, to help HR spot spam patterns (e.g. many submissions from one
IP/browser in a short window). - Resume uploads are now validated more strictly, both client- and server-side: max 10 MB, and PDF/Word only —
the server-side check now sniffs actual file content, not just the file extension, and a rejected upload now
shows a clear error instead of silently being dropped from the submission.
2.9.0
- Fixed the job title going invisible for a moment on page load — a previous version hid it via CSS and only
revealed it after a script repositioned it, which looked broken (especially on a slow connection). The title
now just stays in the theme’s normal position/visibility at all times; no more hide/move/reveal. - Plugin CSS/JS (and the reCAPTCHA script, if enabled) now only load on pages that actually use this plugin’s
markup (the job overview page, the configured Job Listings/Application Form pages, or any page/post using the
shortcodes or blocks manually) instead of on every page of the site. - The reCAPTCHA script now loads with the
asyncattribute — as a third-party, cross-origin script, this was a
likely real contributor to slow page loads when reCAPTCHA is enabled.
2.8.2
- Removed the light blue focus/click outline on the share icon buttons and the filter bar’s search/dropdown
fields — both now use a neutral gray focus ring instead.
2.8.1
- Removed the background and shadow from the job filter bar.
2.8.0
- Fixed a mobile bug on the overview page where the top meta row (location/type/salary) and the posted-info row
could show a stray “|” separator stranded at the start of a wrapped line. Removed the “|” separator there
entirely — each item already has its own icon, so it reads fine on plain spacing alone. - “Openings” moved out of the top posted-info row and now shows after Required Skills further down the page.
2.7.6
- List view meta (location/type/posted date) moved from the right side of the row to directly under the title,
instead of sitting alongside it.
2.7.5
- List row corner radius reduced to 1rem (was 2rem, matching the grid card/other surfaces).
2.7.4
- List row meta now matches the grid card’s styling: “|” separators (was “•”), and the same muted color/size for
the meta text — so both layouts read as one consistent design instead of two slightly different ones.
2.7.3
- Grid card meta line: added the missing clock icon before the job type, added a “Posted X ago” item (matching
the list view), and switched the separator to “|” between all three items. - Corner badge (the eye button) top offset increased to 30px.
2.7.2
- Removed the “Apply by …” deadline pill from listing cards (grid layout) — the excerpt already fills the
card, and the full deadline is one click away on the job’s own page. - Fixed a bug where a narrow grid card could wrap the location/type meta line mid-separator, stranding the dot
at the end of a line — location and type are now each a single unit that wraps as a whole. - Fixed list rows showing the job type twice (once as a subtitle under the title, once in the meta row) when no
department taxonomy was set — the subtitle now only shows the department, since type is already in the meta row. - Increased card/row padding so content sits further from the (2rem) rounded corners.
2.7.1
- Admin job form: the Responsibilities/Requirements/Benefits fields were relabeled to match what’s actually
shown on the job page (“Key Responsibilities”, “Preferred Qualifications”), and each now has a persistent
help note plus realistic example placeholders explaining that one line = one bullet point, instead of only a
placeholder hint that disappears once you start typing.
2.7.0
- Added an Education field to the Job Details admin form, shown as its own section on the overview page.
- Overview page sections reordered: Key Responsibilities, Preferred Qualifications, Benefits, Required Skills,
Education, then the application deadline. - Fixed the “Copy link” share button looking different from the other share icons — it’s a
<button>while the
others are<a>links, and browsers apply different default styling to each even with the same CSS class;
added explicit resets (outline, box-shadow, text-align, etc.) so all five share buttons render identically. - Required Skills tags restyled to match the “Apply by …” badge (same padding, muted background, size, and
weight) instead of their own slightly different pill style.
2.6.5
- Required Skills tags restyled to match the “Apply by …” badge (same padding, muted background, size, and
weight) instead of their own slightly different pill style.
2.6.4
- Fixed the “Copy link” share button looking different from the other share icons — it’s a
<button>while the
others are<a>links, and browsers apply different default styling to each even with the same CSS class;
added explicit resets (outline, box-shadow, text-align, etc.) so all five share buttons render identically.
2.6.3
- Fixed a flash where the job title briefly appeared in its original position before jumping into the detail
card on page load — it’s now hidden until the script has already moved it (with a no-JS fallback so it’s never
left invisible if JavaScript is disabled). - Apply button text shortened from “Apply for this Position” to “Apply”.
2.6.2
- Overview page sections relabeled/reordered to match the section structure used by major job portals, mapped
onto our existing fields: Description -> “Overview”, Responsibilities -> “Key Responsibilities” (now shown
first), Skills -> “Required Skills”, Requirements -> “Preferred Qualifications”. Benefits is unchanged; there’s
no “Required Experience” or “Education” section since we don’t collect those as separate fields.
2.6.1
- The job title now moves inside the detail card (above the meta row) instead of sitting outside it above a plain
white gap (best-effort, JS-driven — see the .entry-title caveat elsewhere in this file). - Top meta row trimmed to location | type | salary with pipe separators; experience and openings moved down next
to the “Posted X ago” line (also pipe-separated); the application deadline moved to sit right after Benefits
instead of in the top meta row.
2.6.0
- Overview page redesigned toward the plain, flat layout used by major job portals (Naukri, LinkedIn, Indeed)
instead of a tinted/elevated card: white background, simple dividers. - The theme’s author/date byline above the job title is now hidden (best-effort — depends on the theme using a
common class name for it). - Apply now sits directly next to the meta info at the top (alongside a new “Posted X ago · N openings” line),
in the same position major job portals place their primary CTA. Share icons moved down to a footer row instead
of competing with Apply for attention at the top.
2.5.0
- Grid card CTA moved to a corner badge (top-right, like a bookmark icon) instead of a footer button, and the
eye icon itself dropped its circular background — it’s now just a colored icon, no pill/fill. - Added a short auto-generated description snippet under the meta info on both the grid card and the list row.
- List rows now show a location and a clock icon next to location/type (previously plain text only, for
consistency with the grid card’s icon treatment).
2.4.3
- All card-style surfaces (job cards, job rows, the overview page’s detail card, the Apply modal/general form,
the filter bar) now use a consistent 2rem border-radius. - Application form field labels reduced to font-weight 500; form field (input/textarea/select) corners changed
to 7px.
2.4.2
- Grid listing card redesigned to cut icon clutter: one icon (location) instead of one per field, location/type
shown as plain dot-separated text, and the deadline shown as a quiet rounded tag instead of icon+sentence.
Added a subtle divider above the view button so it reads as an integrated footer rather than a floating element.
2.4.1
- Replaced the default hero illustration (self-hosted SVG) with a bundled photo
(assets/image/careers-hero-team-collaboration.webp). A custom image picked in Settings > Hero Section still
overrides it, same as before.
2.4.0
- Replaced the “View & Apply” text button on listing cards/rows with a circular icon-only (eye) button. The
configured button text (Settings > Job Listings > Apply Button Text) is kept as the accessible name
(aria-label/title) even though it’s no longer shown visually.
2.3.3
- Job overview page’s detail card now uses a soft blue tint (#f5fcff) instead of plain white.
- Job listing rows/cards now alternate between a soft cream (#fff6e0) and the same soft blue (#f5fcff) tint,
instead of all being plain white.
2.3.2
- Overview page section headings (Skills, etc.) reduced to font-weight 500.
- The “Back to Jobs” link now moves above the page title instead of sitting below it — done via a small script
since the theme renders the title outside any area the plugin’s PHP can reach (best-effort: relies on the
theme using the common “.entry-title” class, same caveat as the existing title-sizing CSS rule).
2.3.1
- Job filter bar redesigned in a Material style: filled pill-shaped search/dropdown fields (no borders, soft grey
fill that turns white with an accent focus ring), a search icon inside the search field, and the whole bar
distinguished by elevation (shadow) instead of a hard border.
2.3.0
- Added a “Back to Jobs” link at the top of the job overview page, linking to whichever page is set as the Job
Listings Page in Settings (hidden if that setting isn’t configured). - Job URLs now include the post ID for clarity/reference (e.g. /jobs/142-frontend-developer/ instead of
/jobs/frontend-developer/). The old ID-less URLs keep working — this adds a URL pattern, it doesn’t replace one.
Rewrite rules are flushed automatically once after this update, no manual Permalinks resave needed.
2.2.1
- The Submit button now shows a spinner while an application is being sent, and is disabled to prevent double-submits.
- After submitting, the form fields are replaced with a clear success (checkmark) or error (cross) icon and message
instead of a small line of text under the form; the Apply modal then closes automatically a few seconds later
either way, and the form is reset and ready again for the next visitor.
2.2.0
- Added Google reCAPTCHA protection for the application forms (Apply modal + general application form) — choose
v2 (“I’m not a robot” checkbox) or v3 (invisible, score-based) from the new Settings > reCAPTCHA tab. Off by
default until keys for the selected version are set. - Job overview page redesigned: Apply and Share now sit together right under the job’s meta info at the top of the
page (instead of only at the bottom after scrolling), the description now has its own “Description” heading, and
the page uses a single elevated card instead of a plain content block. - Listing and grid cards restyled with soft shadows and a hover lift instead of plain borders.
- All content headings (job titles, section headings, form headings) reduced to h5, keeping only the Hero heading
as an h1; section heading weight reduced so it reads as a label rather than a shout. - Removed the placeholder logo icon from list-layout rows.
- Added a Location filter (populated from whatever locations are actually in use) alongside Search/Department/Type,
and restyled the whole filter bar.
2.1.1
- Settings page reorganized into tabs (General / Job Listings / Hero Section) and gained a Hero Image picker
(Media Library) with the original illustration kept as the fallback when no image is set. - Fixed a bug where, if the Job Listings and General Application Form settings pointed at the same page, the
listing and the general form (each with their own “Powered by” footer) would both render on that page. - Job listing rows now show location / type / posted date on a single line instead of stacked.
- Job overview page: section headings (Skills, Responsibilities, etc.), the meta row icon alignment/spacing, and
the job title size/weight were all tightened up. - The auto-injected Job Listings / Application Form page content is now wrapped in a max-width, padded container,
so it no longer renders edge-to-edge on full-width page templates and no longer butts up against the header/footer.
2.1.0
- Removed the hardcoded HR notification email default (now defaults to the site admin email).
- Security review: fixed missing wp_unslash() on several inputs, and restricted resume/application access to
Administrators (was previously available to any Contributor-level role). - Added Google for Jobs (schema.org JobPosting) structured data on single job pages.
- Added Job Listings and Job Application Form blocks for the block editor, alongside the existing shortcodes.
- Added a first-run admin notice pointing to Settings.
- Accessibility: the Apply modal now traps focus, closes on Escape, and returns focus to the triggering button.
- Full translation-readiness pass (all admin/frontend/JS strings wrapped for translation).
2.0.0
- Rebuilt as a namespaced, multi-file OOP plugin (was a single procedural file).
- Added application status/pipeline tracking.
- Added a Settings page (HR notify email is no longer a hardcoded constant).
- Added CSV export of applications.
- Added deadline-based Apply button hiding.
- Moved inline CSS/JS into real enqueued asset files.
- Added custom application-form fields (HR picks a label + type; no shortcode/name editing needed).
- Added page-select in Settings so the job listing / application form display automatically — no shortcodes required.
1.0.0
- Initial release.