Plugin Name: JPKCom ACF Jobs
Plugin URI:
https://github.com/JPKCom/jpkcom-acf-jobs
Description: Job application plugin for ACF
Version: 1.3.11
Author: Jean Pierre Kolb jpk@jpkc.com
Author URI: https://www.jpkc.com/
Contributors: JPKCom
Tags: ACF, Fields, CPT, CTT, Taxonomy, Forms
Requires Plugins: advanced-custom-fields-pro,
acf-quickedit-fields
Requires at least: 6.9
Tested up to: 7.1
Requires PHP: 8.3
Network: true
Stable tag: 1.3.11
License: GPL-2.0-or-later
License URI:
https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: jpkcom-acf-jobs
Domain Path: /languages
A plugin to provide a job application tool for ACF Pro.
JPKCom ACF Jobs is a job listing and application management system built on Advanced Custom Fields Pro. This plugin provides a complete solution for creating, managing, and displaying job postings on your WordPress website with powerful features for recruitment teams, HR departments, and job boards.
The following plugins are required for this plugin to work:
Optional: - WPML for multilingual job postings
includes/acf-field_groups.php) - Programmatically
registered ACF field groups for jobs, locations, and companiesincludes/acf-post_types.php) - Job, Location, and Company
post types with proper admin organizationincludes/acf-taxonomies.php) - Job attributes taxonomy for
benefits, perks, and requirementstemplates/) -
Complete set of single and archive templates with override supportincludes/schema.php) -
Automatic JobPosting JSON-LD structured data generationincludes/shortcodes.php) -
Display filtered job lists and attribute taxonomies anywhereincludes/helpers.php) - Utility functions for rendering
fields and formatting datesAPI Documentation: Complete PHPDoc-generated API documentation is available at: https://jpkcom.github.io/jpkcom-acf-jobs/docs/
The documentation includes detailed information about all functions, classes, hooks, and filters available in the plugin.
// Native WordPress:
get_template_part( 'jpkcom-acf-jobs/partials/job/company' );
// Plugin:
jpkcom_acf_jobs_get_template_part( 'partials/job/company' );All shortcode attributes are optional.
[jpkcom_acf_jobs_list type="FULL_TIME" company="6,8" location="1,3,7,11" limit="10" sort="DSC" style="background:transparent;" class="mb-5" title="Attributes Headline"]
<details> tags with filter
functions:[jpkcom_acf_jobs_attributes id="3,7,21" style="background:transparent;" class="mb-5" title="Attributes Headline"]
@param string $post_type Optional post type for field
group query. If empty, ‘current_post_type’ is used.
jpkcom_render_acf_fields();This plugin relies on ACF Pro’s powerful field group system to provide flexible job data management. ACF Pro offers advanced field types (repeaters, flexible content, groups) that are essential for complex job listings with salary information, multiple locations, and rich content layouts.
The job will automatically appear in your job archive and be indexed by search engines with Schema.org markup.
Option 1: Use the shortcode
[jpkcom_acf_jobs_list limit="10" sort="DSC"]
Option 2: Navigate to the archive Visit
/jobs/ on your site to see all published jobs.
Option 3: Create a custom template Use
WP_Query with post_type => 'job' to build
custom job displays.
The plugin automatically generates JobPosting structured data (JSON-LD) for each job post. This markup is recognized by Google for Jobs and other search engines, improving visibility and displaying rich snippets in search results. No configuration needed - it works out of the box!
Yes! The plugin includes full WPML support via
wpml-config.xml. Jobs, locations, companies, and taxonomies
can all be translated. Fields are configured with appropriate
translation strategies (translate, copy, or copy-once) for optimal
multilingual workflow.
You have three options:
Option 1: Child Theme Override (Recommended) Copy
templates from plugins/jpkcom-acf-jobs/templates/ to
your-child-theme/jpkcom-acf-jobs/ and customize them.
Option 2: Parent Theme Override Copy templates to
your-theme/jpkcom-acf-jobs/ (works if no child theme is
active).
Option 3: MU-Plugin Override Copy templates to
mu-plugins/jpkcom-acf-jobs-overrides/templates/ for
site-wide customization.
/**
* Add new path for overwrites of functional libraries
*/
add_filter( 'jpkcom_acfjobs_file_paths', function( $paths, $filename ) {
array_unshift( $paths, WP_CONTENT_DIR . '/custom-overrides/' . $filename );
return $paths;
}, 10, 2 );/**
* Add a new path, for example from the child theme or custom directory
*/
add_filter( 'jpkcom_acf_jobs_template_paths', function( $paths, $template_name ) {
array_unshift( $paths, WP_CONTENT_DIR . '/custom-templates/jpkcom-acf-jobs/' . $template_name );
return $paths;
}, 10, 2 );/**
* Last chance to dynamically overwrite template path
*/
add_filter( 'jpkcom_acf_jobs_final_template', function( $template ) {
if ( is_singular( 'job' ) ) {
return WP_CONTENT_DIR . '/special/single-job-custom.php';
}
return $template;
});The plugin uses a secure GitHub-based update system. When a new version is released:
https://jpkcom.github.io/jpkcom-acf-jobs/plugin_jpkcom-acf-jobs.json
for updatesYou can also download releases manually from the GitHub repository.
Yes! Use the shortcode attributes:
[jpkcom_acf_jobs_list location="1,3,7" company="6,8" type="FULL_TIME"]
Location and company values are post IDs. You can find them in the
admin when editing locations or companies (look at the URL:
post=123).
Job attributes are custom taxonomy terms (like tags) that you can assign to jobs. Use them for: - Benefits: “Health Insurance”, “Remote Work”, “Flexible Hours” - Requirements: “Driver’s License”, “Security Clearance” - Perks: “Company Car”, “Free Lunch”, “Gym Membership”
Display them with the shortcode:
[jpkcom_acf_jobs_attributes]
If you want to prevent visitors from accessing the job archive page
(/jobs/), you can disable it:
/careers/ or /contact/)When enabled: - Visitors accessing /jobs/ will be
redirected to your specified URL (or homepage if empty) - Individual job
pages (/jobs/job-title/) remain fully accessible - The
redirect uses HTTP 307 (Temporary Redirect) status
This is useful when you want to use shortcodes to display jobs on custom pages instead of the default archive.
Before installing this plugin, ensure you have: - WordPress 6.9 or higher - PHP 8.3 or higher - Advanced Custom Fields Pro installed and activated - ACF Quick Edit Fields installed and activated
jpkcom-acf-jobs.zip filejpkcom-acf-jobs folder to
/wp-content/plugins/cd /path/to/wordpress/wp-content/plugins/
git clone https://github.com/JPKCom/jpkcom-acf-jobs.gitThen activate the plugin in the WordPress admin panel.
/jobs/ on your
site to see the job archiveOnce installed, the plugin will automatically check for updates from GitHub. Update notifications will appear in: - Dashboard → Updates - Plugins page (update notice below plugin name)
Simply click Update Now to install the latest version securely with SHA256 checksum verification.
This plugin is network-compatible. To install on a multisite network:
Issue: Plugin fails to activate - Ensure PHP 8.3+ and WordPress 6.9+ requirements are met - Check that ACF Pro is installed and activated first
Issue: No Jobs menu in admin - Verify the plugin is activated (not just installed) - Check for PHP errors in Tools → Site Health → Info → Server
Issue: Templates not displaying correctly - Ensure
your theme supports Bootstrap 5 markup, or customize the templates -
Enable WP_DEBUG to load debug templates for
troubleshooting
esc_html__()Network: header to false instead of true, matching
WordPress’ own default. No change for this plugin, which declares
Network: true explicitlymain. It only covered pull requests, so a direct push with
bypass rights skipped every checkCLAUDE.md were translated and trimmed. No effect on the
shipped pluginTested up to raised to WordPress 7.1requires
and tested now say 6.9 and 7.1. They only apply when the
README metadata cannot be read, but a stale fallback would have
published a minimum the plugin no longer supportsassets/banner-1544x500.avif,
assets/banner-772x250.avif) are now a plain
#3c4955 surface with no letteringjob_attribute, the field name, instead of
job-attribute, the registered taxonomy.
get_term_by() returned false for every string value and the
attribute was dropped from the output with no error anywhere. Not
reached with the shipped return_format => 'id', but
immediate the moment anything hands that partial stringstools/check-term-sync.php could not run at all —
a declare(strict_types=1) halfway down the file made the
documented wp eval-file invocation a fatal errorwp_get_object_terms(),
which WPML rewrites to the current languagetests/test-conventions.php compares every
literal taxonomy argument against the slugs actually passed to
register_taxonomy()tax_query. None of the
three fields the list shortcode filters is taxonomy-backed, so the
switch made in jpkcom-acf-references does not apply
heredate( 'Y-m-d' ) returns the UTC day and expired listings
stayed visible for the length of the site’s UTC offset after local
midnight (1–2 hours for Europe/Berlin). shortcodes.php,
archive.php and redirects.php now use
current_time( 'Y-m-d' ). The date() call in
schema.php is deliberately unchanged — it round-trips a
stored date string and never refers to “now”current_user_can( 'administrator' ), passing a role name
where a capability belongs. That works only because the role is a key in
the capability array, bypassing map_meta_cap and missing
differently named roles with the same rights. Now checks
manage_optionstools/check-term-sync.php — a
read-only checker reporting whether the serialised
job_attribute meta values and the real
job-attribute term assignments agree. Groundwork for moving
the shortcode filters from unindexed meta_query +
LIKE to indexed tax_querytests/test-conventions.php —
regression guards for both fixes above, precise enough to leave the
legitimate schema.php date call alone. Run in CI on every
pull requestCLAUDE.md gained the Security
& Correctness section it was missing — the only JPKCom plugin
without onesprintf() calls in the updater bound named
arguments to a variadic parameter, which raises
ArgumentCountError on PHP 8.3TypeError when the manifest omitted
requires_plugins<main> element in the single job
template: it was closed immediately after opening, leaving the entire
job content outside of it and producing an unmatched closing tag at the
end of the templateGPL-2.0-or-later with the HTTPS license URIJSON_HEX_TAG | JSON_HEX_AMP, plus
output-point hardening in single-job.php)download_url over the slug heuristic, so a tampered
manifest can no longer bypass the checksum gatehash_equals()) with an is_string() guard
against hash_file() failureswp_safe_remote_get()
(SSRF defense-in-depth)display_name now provided)wp plugin list by
completing the no_update transient entry
(new_version, package, tested,
requires_php)esc_html__(), esc_html(),
esc_url(), esc_attr())flex-wrap with
row-gap-2 for responsive wrapping on small screens<li> elements no
longer rendered when no previous/next post existspage-link class for consistent Bootstrap stylingesc_url()