# Matador Jobs Lite/Pro Changelog

## 3.9.9

- Bugfix: Fixed bug that caused a delay in an application being synced when there was only one pending application.
- Bugfix: Fixed a critical (site breaking) error that was encountered only when Admin Emails were turned off and a site disconnection occurred.
- Bugfix: (Bullhorn Integration) Added error suppression to the method we use to compress processed resume HTML data to prevent issues caused by malformed HTML. This is further supporting changes introduced in 3.9.6 and 3.9.7.

## 3.9.8

- Enhancement: Adding a Domain Path plugin header to support improvements to WordPress' translation files loading.

## 3.9.7

- Bugfix: To update Matador Jobs for WordPress 6.7 & 6.8 just-in-time translations features, some translatable strings declared at Matador instantiation were moved elsewhere in load order. This fixes an issue where, when WP_DEBUG was on, PHP NOTICE messages would cause Translations files to not load. Please note: some Matador Jobs extensions are also causing this issue, but WordPress PHP NOTICE messages are associating the issue with Matador Jobs core. We are actively working on updating all extensions so this issue is resolved finally.
- Bugfix: (Bullhorn Integration) Some processed Bullhorn resumes were too large to be processed by the solution we devised to remove presentational tags from the resume text in 3.9.6. A new solution requiring greater processing time, but is more reliable, is included in this version. 
- Bugfix: (Bullhorn Integration) Fixed issue causing the import categories cache to not save as expected.
- Bugfix: (Bullhorn Integration) Modified the process in which the Bullhorn Country data cache is refreshed, preventing a stale cache from returning invalid/missing Country data and impacting user applications. The cache is now persistent and a separate mechanism is in place to refresh it regularly.
- Enhancement: Added WordPress filter `matador_application_field_should_skip` on the default Application form template to give developers using the default template access to a way to programmatically skip application fields. Users on modified application templates should refresh their template version.
- Enhancement: (Bullhorn Integration) In the event of missing Bullhorn Country data, the Country field in the application will now be disabled, and authenticated editor and administrator users will be shown a message encouraging them to initialize a Bullhorn sync. This will only occur, due to changes to how the Bullhorn Country data is cached, when new sites are created or object caches or transients are cleared. This requires users to be using the default application template or that they have added the new `matador_application_field_should_skip` filter to their customized template.

## 3.9.6

- Bugfix: (Bullhorn Integration) Candidate objects returned from the Bullhorn API following resume processing will have presentational HTML tags removed to prevent situations where highly stylized HTML candidate descriptions cause the data object to exceed data limits.

## 3.9.5

- Enhancement: Allowed HTML tags in a job description is expanded to now also support `<blockquote>`, `<s>`, `<sub>`, `<sup>`, and `<u>`. This is largely to support updates in the Bullhorn ATS rich text editor, but is good practice for all job descriptions in future integrations.
- Enhancement: Added filter `matador_get_currency_codes` to give developers the ability to modify the list of currency codes used by Matador. The defaults are from an ISO Currency Codes list, so should be good for most users without modification.
- Bugfix: Fixed an issue causing currency code data to not load as intended for users of certain world currencies.
- Bugfix: Fixed an issue causing the Application Processing log data to not save to the database as intended, leaving the sync log data section of the application transcript blank.
- Bugfix: Fixed an issue causing WordPress to experience a fatal error on versions prior to 6.7. Matador Jobs Block Editor blocks leveraged improved WordPress Editor Blocks loading routines introduced WordPress 6.7, but was missing a required check. This check is now added and in place. That said, we always strongly recommend our users run the most up-to-date version of WordPress for security and stability purposes.
- Bugfix: Fixed an issue causing translatable strings to be untranslatable due to WordPress 6.8 "just-in-time" translation loading. This affected labels for Jobs Orderby Search Options. Note: there are more strings that are affected by the WordPress 6.8 "just-in-time" changes, and we are working hard to get all of them fixed before WordPress 6.8 releases.
- Bugfix: Updated Matador Jobs Block Editor Blocks to support changes to block registration slated for the soon-to-be WordPress 6.8 release.
- Bugfix: (Bullhorn Integration) Fixed an issue that was causing Matador Jobs Pro to sync applications slower than intended. For high-volume sites this could create a backlog over long periods of time resulting in the volume getting too far ahead of incoming applications. This fix will ease that problem and prevent it in the future.
- Misc: Updated references to our Matador Jobs Pro documentation website to ensure links match valid articles.
- Misc: Matador Jobs is tested up to WordPress 6.8, with no fatal or blocking errors, however full support for changes to translations loading will come in an upcoming patch.

## 3.9.4
 
- Bugfix: The uploaded files metabox will now display again after going missing on Application admin views with 3.9.0.
- Bugfix: Fixed an issue encountered only by logged in admin users when accessing cached Matador forms. Cross-site request forgery protections were not being properly refreshed on cached pages for admin users. While this did not impact most customer users, it made testing staging/development sites frustrating for site admins and developers.
- Bugfix: (Bullhorn Integration) Fixed an issue causing the job_general_location to still not save correctly. 2nd times the charm here?
- Bugfix: (Bullhorn Integration) Fixed an issue during import causing the "is hybrid job" flag to not be saved.
- Bugfix: (Bullhorn Integration) Fixed an issue during import causing the "is remote job" flag to also be saved when a job is a hybrid job.

## 3.9.3

- Bugfix: Fixed issue with the reset button in default search, previously the reset button was unable to clear the form and reset the search query params in some circumstances.
- Bugfix: (Bullhorn) Fixed an issue where a Bullhorn job import for a job without a city/locality and a state/province would create a "job general location" with only a comma. Now, a missing city and state will result in an empty/not set "job general location."
- Bugfix: Fixed issue allowing servers running PHP 7.4 to PHP 8.0.x to initialize Matador. Please upgrade to PHP 8.1, the minimum supported version of PHP for the plugin.

## 3.9.2

- Bugfix: Fixed issue causing admin javascript to fail to load, impacting the use of Matador Jobs settings screens when the WP_DEBUG or WP_SCRIPT_DEBUG is true or WordPress environment is set to DEVELOPMENT.
- Bugfix: Fixed issue with readme.txt file formatting that caused information about the plugin to not load properly when displayed on WordPress.org plugin repository and in the WordPress plugins admin screen.

## 3.9.1

- Unaddressed Known Issue: Matador Jobs 3.9.0 and 3.9.1 have an issue causing admin javascript to fail to load, impacting the use of Matador Jobs settings screens when the WP_DEBUG or WP_SCRIPT_DEBUG is true, or WordPress environment is set to DEVELOPMENT. This will be addressed in 3.9.2 ASAP.
- Bugfix: Fixed issue causing the packaging of Matador Jobs Lite to be incorrect, creating issues for our Lite users.

## 3.9.0

### Key New Features

**Matador Jobs Editor Blocks**

We finally are confident in our WordPress Block Editor Blocks, and release them for our users to build robust front-end displays! Our editor blocks have 100% parity to our old shortcodes, and in fact add new features to customize display. Included blocks are:

* Jobs
* Jobs Filters
* Jobs Search
* Application
* Application Link
* Job Description
* Job Field
* Job Relative Age
* Job Link

See our guide to building block-based Matador layouts on our docs website (https://docs.matadorjobs.com/collection/blocks-fse-gutenberg/).

**Application Screening**

Application Screening, code-named "Traffic Lights", gives users a method to control whether an application is synced to the external ATS. When enabled, the Application Screening feature will hold an application until a recruiter reviews (screens) it and performs an action. The recruiter will receive an email and/or notification on messaging apps (when Slack, etc, services are enabled) with a summary of the application data. The notification (and screens in the WordPress admin) will include action links that give them the recruiter the option to "reject", "add", or "apply".

* "Reject" will remove the application data from the site and never submit it to your ATS system.
* "Add" will create a new person or candidate record in your ATS, but not submit that candidate for associated role. This allows recruiters to build a database of candidates even when the candidate may be unfit for the applied role.
* "Apply" will create a new person or candidate record in your ATS and then link the record as a job submission. This option may not appear for candidates who submit information on the general application form.

Application Screening will be powerful for users who are experiencing high volumes of unqualified candidates and/or spam applications. It is also useful for users who wish to more finely manage their ATS database.

**Enhanced Logging**

Matador Jobs 3.9.0 completely overhauls the event logging. Logs are an incredibly useful tool for site admins and developers alike to monitor how Matador is functioning. Since our initial release, new log entries have been added as Matador has grown in complexity and new quirks have been discovered, and this means logs were getting extremely detailed and long. Some sites were creating log files so huge that they were impacting site storage limits. While this information helps our users--and us, when debugging issues--understand what is going on, some log items are not necessary when a site and external connection is deemed operating effectively. This overhaul cleans up some legacy logging code, making it more efficient, and it also gives users granular control over what is logged so only the information a site admin needs is taking up space.

All logged items are now assigned a "Severity" by the developers. Severity are levels of importance, and are, least important to most important, are:

* Note, to log items which are extremely detailed pieces of information for debugging and validating function.
* Notice, to log items that modify or impact behavior in a way that is determined by settings or user filters. This type of log is helpful for us to discover the cause of "unexpected" behavior being the result of forgotten customizations or misunderstood settings values. 
* Warning, to log items that imply something unexpected occurred, usually due to malformed external data or connection issues, but that does not affect Matador's ability to run. For example
* Error, to log items that are errors that impact Matador's ability to complete a task, and that interrupts Matador's operation. Examples could include disconnections from external integrations or bad application data. These can trigger admin email alerts as well.
* Critical, to log items that Matador cannot recover from. These are usually unexpected errors and often a result of misuse of Developer Filters or issues with external connections that Matador developers have not written code to handle.
* Info, to log items that are important to the user for purely informational purposes. These always log. These can be confirmation of completed syncs, applications received, and more.

Along with this enhanced logging functionality, come the following highlights:

- Users can set a setting or filter to choose which level of severity are written to the logs. "Info" items will always be logged. Default is "Warning".
- Added filter `matador_activity_log_verbose` which prints associated array data or object data to the logfile in addition to the log entry. This will create an extremely verbose, detailed log and should only be enabled during developer debugging.
- Enhancement: Four new constants are now supported related to logging. Defining these in a `wp-config.php` file will give a site developer power to override and hide the associated user settings:
- - `MATADOR_LOGGING_ENABLED` allows developers to turn on Matador Activity Logging.x
- - `MATADOR_LOGGING_DAYS` allows developers to define the number of days of logs to keep and removes the setting.
- - `MATADOR_LOGGING_SEVERITY` allows developers to define the logging severity level and removes the setting.
- - `MATADOR_LOGGING_VERBOSE` allows developers to configure whether arrays of metadata related to the action spawning the log entry should be printed into the logs.

### Enhancements & Bugfixes

**Jobs**

- "Sync" job button is added to the Block Editor view of the Job Posting to ensure feature parity with the older Classic Editor.
- A Job Archive will now only be available via the front-end UI if the setting for an archive is turned on.
- Optimized database calls around the get job by ID function for Bullhorn. Four database calls are now optimized down to two.
- Fixed an issue where the jobs shortcode would not accept values from the `jobs_per_page` attribute. This is actually a change to support a long-time error in documentation, as docs described `jobs_per_page` while `jobs_to_show` was the intended attribute name.
- Fixed two issues and improved one behavior related to The Template_Support::the_job_meta() function. First, it will return an empty string instead of false when failing to find a post meta value for the field. This brings it in line with the behavior of other conditionals and in parity with its documentation. Further, the function was calling esc_html() on data, and some data was stored as an object, which was resulting in a fatal error. This method now detects if the retrieved metadata is an object or array and avoids the error. Finally, if the retrieved data is an object and has a name property, then the is returned as the meta value. To get the full object, use `get_post_meta()` instead.
- Fixed an issue causing Matador Jobs Lite sites to not have access to Salary related settings from the 3.8.x family of patches. These settings have been extended to Lite users.

**Taxonomies (Locations, Categories, Etc)**

- A new "auto suggest" input type for taxonomy search is now available: text input with datalist. This input type uses existing taxonomy terms to autosuggest values to users as they fill in the input. By default, this feature is not enabled to maintain backward compatibility with existing CSS on sites which may rely on taxonomy search fields being <select> elements. To enable this new field on a site-wide basis use the `matador_search_form_args` filter to set `taxonomy_type => 'datalist'`. Alternatively, the datalist field can be enabled in the Matador Search Editor Block, the matador_search shortcode by passing `taxonomy_type=datalist`, or in the `matador_search()` template function by setting `taxonomy_type => 'datalist'` in the arguments passed in.
- Job Taxonomy Editor Block, Shortcode, and Template Function now supports the "order" argument, which allows the user to dictate whether results are sorted ascending or descending. The default behavior is to sort ascending except when the 'orderby' argument is set to 'count', in which case Matador will default the ordering to descending (highest count to lowest count).
- The Location taxonomy term "Hybrid" will be added, like we add a "Remote" term, for jobs which rules that determine it is a part-time in office, part-time work-from-home role. A CSS class is also added to jobs which are remote or hybrid, which can be used by developers to highlight these roles. For backward compatibility, the CSS class is not used to change existing sites' appearance.
- Taxonomy (eg: job category) terms (eg: "Accounting") will now include additional data from the remote source, including "remote category ID" when a term is imported from an external ATS source.
- The WordPress theme will now use a Matador Jobs archive template for the taxonomy pages if a taxonomy-specific archive is not found, simplifying theming work for Matador Jobs.
- Job Taxonomy Archives will now have the five default feeds disabled by default. Enable all by unhooking the action `remove_action( 'pre_get_posts', [ 'matador\Job_Taxonomies', 'disable_feed' ], 10 );` or enable certain default feeds by modifying the list of disabled feeds with filter `matador_taxonomies_disabled_feeds`.
- Added argument to `matador_import_meta_to_taxonomy_value` filter with full job object, to offer users even more control in determining what the taxonomy term is saved (or if a taxonomy term is set at all).

**Submissions (Applications)**

- Added a Country field (drop-down) to the Matador Application Form. When possible, the list of countries are sourced from the connected ATS.
- Added a unique ID hash to submission data to enable secure external actions on submissions.
- The submissions (applications) list admin screen received upgraded styling to aid in readability and user experience of sync status labels and buttons, especially on smaller screens.
- The submissions (applications) list admin screen will no longer show action buttons when viewing the trash. A trashed post can be restored by the user to perform actions, ie: "Sync Now" or new Application Screening actions.
- Added WordPress filters to give user developers more control over the Duplicate Prevention methods in the routine that attempts to find an existing candidate in Bullhorn before deciding to modify or create a new candidate from an application.
- The filter `matador_bullhorn_candidate_find_candidate` is passed the full application object and found record from Bullhorn and can return false or an integer remote candidate ID. This filter will need to be used with the `matador_bullhorn_candidate_find_candidate_request_params` and `matador_bullhorn_candidate_find_candidate_query` to modify the scope and shape of the found records to test against. After finding a record or records that match the query, each record is looped through and run through this filter, with the first positive match returned as a found candidate.
- The filter `matador_bullhorn_candidate_find_candidate_by_lastname` is now available to turn off the last name check that is a part of our default duplicate prevention routine. This is helpful when a user's site operates in a country where last names may be different in casual and formal contexts.
- User developers may now use a WordPress filter to force the candidate and submissions to be categorized the same as the job the applicant initially applied for. For example, if an applicant applies to a job with the category "Accounting", when the applicant is created in the ATS database, the created candidate submission will also have the category "Accounting." Pass `true` to the filter `matador_applications_category_defaults_to_job_category`.
- Added check to prevent the saving of empty application files. It is occasionally possible that a file with no contents could be submitted and these should not be saved to the application record.
- Changed the naming scheme by which uploaded application files are saved to the web server. Formerly, application files were saved to a secure uploads folder with a unique name built by prepending a unique character string to the start of the original file name. Now, each new application will create a folder with a unique name and store uploaded files in that folder without changing the original file name. This will provide the same level of security while also addressing concerns from users of the confusing and long resume file names.
- Fixed an issue where the description for the `resume` field on the application form now respects the user setting which allows a choice between `CV`, `Resume`, and `Curriculum Vitae` for the word used to refer to the CV/Resume. Additionally fixed a typo in the output when `Curriculum Vitae` was selected for this user setting.

**Settings**

- Added actions `matador_options_before_update` and `matador_options_after_update` which run only on the Matador Options screen and after the nonce is validated. This will make it easier for extensions to add actionable buttons to their settings without needing to do separate nonce checks.
- "Toggle" type admin settings now automatically have an off default setting, finally solving an annoying issue we've been struggling with for three years.
- Fixed issue that causes the screen to "jump" when user selects different tabs on the settings screen.

**Bullhorn Integration**

Moving forward, changes to behavior for a specific ATS integration will be isolated into a separate sections of patch notes, as with Matador Jobs 4.0.0, Matador will support multiple ATS integrations. All items in this section apply only to sites integrated with Bullhorn.

- "Edit" job button (which links into Bullhorn) is added to the Block Editor view of the Job Posting to ensure feature parity with the older Classic Editor.
- The Application Sync routine may perform an API call to check if the Application being processed represents a Candidate that has already applied to the Job. If setting is turned on, a new Job Submission or Web Response will not be created when this is determined. This process requires an additional API call and only checks for the presence of an existing submission. Site admins that wish to customize this behavior, for example to only skip when there are matches in certain categories, can use the WordPress filter `matador_bullhorn_candidate_maybe_skip_submission` to customize the behavior when performing these checks.
- Improved the method which is used to get Bullhorn Custom Objects.
- Sets the JSON+LD Structured Data Job Location Requirements for Remote/Work-from-Home Jobs based on the job address.
- When saving notes to Bullhorn we now set the action to Matador Jobs Note and set the author to match the matador setting for candidate owner. 

**Third-Party Plugin Integrations**

- Yoast SEO Premium will no longer notify or attempt to automatically generate redirects for job listings. This warning, while correct for most types of content, should not apply to Job Listings. Specifically, Google, and other search engines too, express a preference for a `404 Not Found` or `410 Gone` be sent expired and removed Job Listings.
- Google Indexing API Integration now has added status monitoring feature to health page.

**Misc**

- REST API is enabled for Matador Jobs Job Postings and Job Postings Taxonomies.

### Security

- Bugfix: (Core) Fixed bug where an empty `index.php` file is not created when an uploads directory exists but the empty `index.php` does not. The bug occurred because the check only ran during the recreation of the containing directory, not on every file save to the directory.

### General

- Replaced all WordPress intval() function calls with PHP 7+ (int) variable casting method. 
- Minimum PHP Version Bumped from 5.6 to 8.1
- General: Tested up to WordPress 6.7.2

## 3.8.24

-Bugfix (Bullhorn Integration) Fixed incorrect function call impacting candidate deduplication.

## 3.8.23

- Bugfix (Core) Fixed issue with improperly minified files

## 3.8.22

- Enhancement: (Bullhorn Integration) Improved functions and WordPress filters around the Bullhorn duplicate prevention tools in the Candidate Application processing routine. 
- - Updated WordPress filter `matador_bullhorn_candidate_find_candidate_query` with a new parameter $application, containing the full Application data array.
- - Updated WordPress filter `matador_bullhorn_candidate_find_candidate_params` with a new parameter $application, containing the full Application data array.
- - Added WordPress filter `matador_bullhorn_candidate_find_candidate_check_lastname` to flag whether the duplication prevention routine should check against a matching last name.
- - Added WordPress filter `matador_bullhorn_candidate_find_candidate` to enable further processing on found candidate records.

- Bugfix: (Bullhorn Integration) Fixed issue where only the first 5 assignedUsers for a given job were being imported. Now all of each job's assignedUsers will be imported properly.
- Bugfix: Fixed issue causing some Matador Jobs extensions fail to load extension translations files.

- Developer - New release build routines using Webpack.

- Compatibility: Updated the loading of WordPress translations files to work with updates to WordPress with WordPress 6.7.

- General: Tested up to WordPress 6.7.

## 3.8.21

- Bugfix: Fixed issue introduced in 3.8.17 that impacted automatic updates for most users. Manual update may be required if current version is 3.8.17, 3.8.18, 3.8.19, or 3.8.20.

## 3.8.20

- Enhancement: Added client-side scripting that appends the CSS class value `file_added` to the file input box for the application form when a file is added. This gives developers and designers more tools to impact the user experience of the site. Matador's default presentation will not change with this update, but may in the future.
- Enhancement: (Bullhorn Integration) Added max field size protections for the following fields: candidateWorkHistory->companyName and all fields under candidateEducation. The Bullhorn resume processor can return data that is invalid with values exceeding the maximum character limits for these fields which would result in an API error when Matador submits the data for saving. This update handles that error.
- Enhancement: (Bullhorn Integration) Added fallback to use dateLastModified as the job posted date/time if the dateLastPublished is selected by the user as the job date but that value isn't set. This is a protection for misuse of the Bullhorn system, as jobs should not be "public" aka "published" without a dateLastPublished value. Unfortunately, customizations of the Bullhorn UI using field mappings and customizations of the Bullhorn experience via API-based applications can "publish" a job without setting the "dateLastPublished" value. This change to Matador protects the user from an error, but users are strongly encouraged to use Bullhorn via its best practices, as Matador is optimized for this.
- Bugfix: Reduced number of javascript remote calls during page loading.
- Bugfix: Fixed a bug causing Matador Jobs job listing schema data to be included in the graphs of two SEO integrations tools when we were not on Matador Jobs job listing single pages. 
- Bugfix: Fixed a PHP WARNING encountered for Matador Jobs Lite users.
- Bugfix: (Bullhorn Integration) Fixed issues that could arise when candidate data was missing a Bullhorn ownerID value by adding checks and protections around reference or manipulation of Owner data.
- Internationalization: Added several new language packs based on work by clients and volunteers, with some use of AI translation tools.
- Developer: Updated build routines from Gulp to Webpack. Some stylesheet and javascript files were renamed. While this should not impact our users, it is possible some caching configurations may be impacted by the file name changes.

## 3.8.19

- Bugfix: This release contains a missing file that was somehow omitted from our release package of Matador Jobs Lite via the WordPress.org repository. We are sorry for this and will be re-evaluating our release and build processes following 3.8.18 to determine how to avoid such an issue in the future.

## 3.8.18

- Feature: Added new code to address user experience issues encountered by job seekers served cached web page data that included Matador application forms with cross-site request forgery (CSRF) protections in place that were stale due to caching. This update will aim to prevent those errors and ensure a smooth experience for users without requiring adjustments to the site's caching settings.
- Feature: Added a WordPress filter called `matador_jobs_query_jobs_args` to filter the search query arguments after code-based processing is complete. This is used in some advanced extension development and should only be used when the filter for before code-based processing will not work, as code-based query arg processing is designed to protect the user from unintentional issues.
- Bugfix: Fixes a bug that caused the Bullhorn Candidate Work History entries for newly created candidates to be missing the job title.
- General: Tested up to WordPress 6.6.1

## 3.8.17

- Feature: Persist Bullhorn connection for 5.5 hours. With an announcement made on March 5th, 2024, Bullhorn's API can now support connections lasting up to 5.6 hours instead of the old default of 10 minutes. Matador is updated to support the full extended connection which will reduce time-consuming and resource-intensive API calls to the Bullhorn Login systems from several times per hour to 4-5 times per day. See https://supportforums.bullhorn.com/viewtopic.php?t=35590 for more information from Bullhorn regarding the announcement.
- Feature: Added a default "action" argument to the Bullhorn sync routine that adds Notes to a created or modified Candidate entries. We recently learned that to apply Bullhorn Automation routines to the Notes, they must have an "action" set, so moving forward Candidate Notes created by Matador will have an action of "other".
- Feature: Added filters to Bullhorn sync routine that adds Notes to created or modified Candidate entries. The filter `matador_bullhorn_candidate_note` allows a developer to modify the string of text saved to the note and the filter `matador_bullhorn_candidate_note_args` allows a developer to modify the other arguments including the "action" value we now set as "other" (see previous changelog entry).
- Feature: The Bullhorn sync routine that creates a Submission between a Candidate and JobOrder will now include the value of the Candidate Owner in the `sendingUser` and `owners` fields. New Candidates created by Matador will be owned by the preferred owner as set in the setting 'Preferred New Candidate "Owner"', falling back to the the API User if the preferred owner is not found. This feature update will give that same assignment to the Submission, preventing issues where Candidate owners cannot see the Submission.
- Feature: Added protections to Bullhorn Candidate Sync for users who enable "allow multiple values" on any of the four phone fields on the Bullhorn Candidate object. _In general, we discourage users from enabling "allow multiple values" settings in the Bullhorn field mappings to any default fields._
- Bugfix: Fixed issue causing Admin Notices handling to sometimes throw a PHP > 8.1 warning. Depending on user error reporting, this could've resulted in errors printed to screen, logs, or had no impact.
- Logging: Various improvements to logging to support plugin development and issue resolution.
- General: Clarified minimum WordPress version required as 5.5.0. In our 3.8.0 release we deployed a feature from 5.3.0 and 5.5.0 and didn't bump our "Requires WordPress" version requirement from 4.9.6. Unofficially we now can run at 5.5.0 and above, however officially, as explained in our Prerequisites help doc on our support website (https://docs.matadorjobs.com/articles/prerequisites/), officially we require WordPress 5.8 beginning January 24th, 2024 and 5.9 beginning May 23rd, 2024.
- General: Tested up to WordPress 6.5.0.

## 3.8.16

- Bugfix: Yoast SEO's Third-Party Integration began triggering a fatal error with Yoast SEO's update 21.9, which removed a deprecated class Matador had previously used to enable our support of their SEO Graph. This fix upgrades to the new Yoast SEO API while also adding code to hopefully prevent future changes of Yoast from breaking Matador.
- Misc: Matador Analytics reporting disabled due to our data aggregation service entering sunset. We will be exploring new solutions for telemetry in the future.

## 3.8.15

- Security: Fixed an issue that resulted in upgrades from Matador Jobs Lite to Matador Jobs Pro not establishing folders for log files or resume files that did not have index.php files to prevent directory indexing.
- Security: Added a routine that double-checks for the presence of an empty index.php file to prevent directory indexing in the resume uploads folder during each candidate file save. This will replace the index.php file if it was missing from a previous bug or user error.
- Security: Added routine that double-checks for presence of an empty index.php file to prevent directory indexing in the Matador log files folder on during the creation of a new log file. This will replace the index.php file if it was missing from a previous bug or user error.

- Bugfix: Added a fix to handle unrecognized arguments/dynamic arguments for the [matador_portal] shortcode
- Bugfix: Added a routine to restore a missing log file folder that may have been deleted or not created properly on install/activation.

- Compatability: Changed an argument in a few WordPress core function calls that previously allowed null but in PHP 8.1 and later requires an empty string.
- Compatability: Added #[ReturnTypeWillChange] attributes to the Cookie Monster class to ensure PHP 8.1 and later compatability.
- Compatability: Modified the log delete function to fix an instantiation of the DateTimeImmutable class from a null value, which threw PHP deprecation warnings in 8.1 and later.
- Compatability: Added a method argument strict typing indicator and modified a function call to prevent an error with PHP's rtrim() after an accepted argument deprecation was added in PHP 8.2.

- Misc: Tested up to WordPress 6.4

## 3.8.14

- Enhancement: Plucked changes from the 3.9.x development branch into Matador Jobs 3.8.x branch to support updates to the Job Syndication Extension, formerly Jobs XML Feeds Extension, prior to the release of Matador Jobs 3.9.0.

## 3.8.13

- Enhancement: It appears that Bullhorn is currently experiencing some issues with its connection quality and in reviewing our automatic reconnection routine we identified an opportunity to add finesse around a temporary error that was being misinterpreted by Matador as a permanent error, resulting in Matador determining it could no longer connect and send notice to the administrator. We will now retry a reconnection on these temporary errors while continuing to stop attempts to reconnect when the permanent error is encountered.
- Bugfix: Fixes a bug impacting the functionality of the Test Auto Reconnect feature of the Bullhorn Connection Assistant that was introduced with performance improvements in 3.8.7.

## 3.8.12

- Bugfix: Fixes a bug introduced in 3.8.10 around deprecated function update impacting the job info header.

## 3.8.11

- Bugfix: Bullhorn resume parser can return no values for job title in a work history entry, and when that occurred would generate a PHP Warning in error logs. Added protections to supress the error and allow a resume
- Bugfix: Identified and fixed issue causing Matador to create a WordPress transient with no name, which disrupted object caching when Redis Object cache was deployed.
- Misc: Tested up to WordPress 6.3

## 3.8.10

- Enhancement: Matador Search previously supported an additional field that searches job by the external ID, aka Bullhorn ID. Now, when the search field is used to search for a whole (integer) positive number greater than zero, search will be performed on the external ID field and not the title and description. This makes it easier to implement ID-based searching on your site without changing previous behavior. Future implementations of Matador that import non-numeric ID values from external services will still need to use the separate external ID search field, however.
- Enhancement: Modified Matador's Bullhorn Connection routine to leverage the use of the datacenter-specific OAuth and Rest servers to optimize for changes to the Bullhorn API authorization systems July 11th and 12th, 2023. The changes to Bullhorn's system did made connections in our prior integrations less performant (slower, less reliable) and subject to occasional failure, while these changes will result in more performant connections.
- Enhancement: Bullhorn Connection Assistant now no longer inquires about the users' Bullhorn Datacenter. Matador will now determine the proper Datacenter based on client cluster information gathered from the first successful login to Bullhorn, and on an update to 3.8.10, if an existing active login is present, the Datacenter will be detected from the client cluster information in that login. In the event a user's company moves server client clusters, a one-time reset of the Bullhorn Connection Assistant will be required to ensure Matador acknowledges the move, however, it is not common for Bullhorn to move a client to another cluster.
- Enhancement: Added handling for when "Allow Multiple Values" is selected for the required Education Degree Name field on the Job Order.
- Enhancement: Remove decimal values in salary fields when the number is greater than or equal to 1000. This prevents salary strings like "$64,000.00 per year" but leaves "$17.50 per hour" in place.
- Enhancement: Improved error logging for issues encountered during license activation.
- Bugfix: Do not set the 'salary_string' and 'salary_formatted' values for a job when the fallback/default 'salary' value is used and is not set or set too zero.
- Bugfix: When a fallback/default 'salary' value is used and is a non-zero, set the 'salary_string' value.
- Bugfix: Fixed issue where a Google reCAPTCHA installed by another theme or other plugin while not using Matador's Google reCAPTCHA solution would cause issue with Matador's form validating.
- Bugfix: Identified and fixed issue in Matador's beta new sync routine that could be encountered when a sync step is not found as a class method or callable, resulting in an infinite loop.
- Bugfix: Identified and fixed two issues in Matador's new sync routine (currently in beta) where a class property that was to be read via late static binding was being read as an instance property, causing issues in some implementations. Notably, locally created jobs were being removed during a remote sync.
- Misc: Updated template use of deprecated function to use the replacement function for the same behavior.

## 3.8.9

- Enhancement: A legacy behavior of Matador is to include all custom form fields in the Notes section of a newly created Candidate. This behavior allows site operators to collect custom data that isn't mapped to a Bullhorn field. Recently, anti-spam and user-behavior tracking tools started to add meta-data to forms on sites using "hidden" form fields. This would result in loads of "junk" data being scooped up by Matador and appended to the notes. An enhancement to our form processing will retain the legacy behavior of the form data processor while preventing this junk data from being collected in the Candidate data record.
- Enhancement: The `publishedZip` field will be included in the default job data import and used in lieu of the `address->zip` when found. The `publishedZip` is a newer field in the Bullhorn API and many users do not use it beyond default behavior, which is to copy the value of the job address zip into the `publishedZip` when a publishing action is taken. For that reason, in most use cases, `publishedZip` it matches the `address->zip`. Given its description on the job data object, however, some users of Matador have brought it to our attention that they provide an alternate "published postal code" at publishing that is different than the jobs' address postal code. This change will benefit those users largely without modifying the behavior of Matador for existing users.
- Bugfix: Fixed issue caused by change to how Bullhorn's returned resume object formats secondarySkills data. The issue was not impacting sync of Applications but was logging a PHP Warning and resulted further in the secondary skill data not saving to the Applicant record.
- Bugfix: Fixed an issue with one of Matador's site health monitoring systems failing when a transient is not set properly on first use of the day.
- Bugfix: Fixed a bug where some salary strings would not have the proper salary unit field due to a variable name for the salary unit being misspelled.
- Bugfix: Added logic to prevent a PHP "warning" from being logged when a job did not have a value in the "last post meta" meta array. The "last post meta" meta array was added in 3.8.7 so this would only occur on the first job update (due to republishing or a hard sync) on each job record after an upgrade from before 3.8.6 or earlier.
- Bugfix: Fixed issue where items appended to the content of a job posting description, ie: apply button, application, job info bar, etc, was being added to XML feed content when it should not.
- Misc: Added improved logging for the new/experimental sync experience.

## 3.8.8

- Enhancement: Added copies of WordPress 5.9 Polyfills for PHP 7.3 and 8.0 string and array functions. This is to protect users of WordPress before 5.8 who also use PHP before 7.3 and before 8.0.
- Enhancement: Updated a log line to display the ID of the Submission when a candidate is added to a job as a Web Response or Job Submission.
- Enhancement: Added filter `matador_bullhorn_applicant_countryID_default` to override the Bullhorn CountryID default on new Applications
- Enhancement: Added protections for improperly formatted WorkHistory job titles returned from the Bullhorn API resume processor.

- Bugfix: Fixed an issue that caused an improper salary range string (used to display salary information in templates since 3.8.4) to be generated when there was a zero or null value in the Bullhorn data object's `salary` field for the job but a properly configured salary high and salary low field was defined in Matador settings.
- Bugfix: Fixed issue that may occur during source tracking when a server HTTP User Agent is blank.

## 3.8.7

- Performance: Removed any reliance on the WordPress Transients API for handling Bullhorn connection variables, falling back to explicit use of the options database. This is to prevent inconsistent handling of transients by load balancers and persistent object caching systems we've encountered since WordPress 6.1 and Matador 3.8.0.
- Performance: Prevented "race condition" bugs when multiple concurrent Bullhorn connections are running at once. These will now be considerably more rare.
- Performance: Removed a developer debugging feature that could interrupt regular Bullhorn communication if a logged in user was accessing WP Admin during a specific window of time during an active Bullhorn communication.

- Feature: Added special handling for users of the Akismet comment/form spam prevention plugin. This plugin adds a number of hidden form fields to be used as form validation and anti-spam validation to every form on a WordPress site including Matador Jobs application forms. Users of Akismet and Matador would see this now otherwise junk data in their Bullhorn records and emails after submission. This feature will strip this junk data from the form before processing.
- Feature: The `matador_delete_job` action is an alias for the WordPress core `delete_post` action, but to enhance its usefulness and give it access to items removed earlier in the core WordPress delete post process, it will now run on WordPress's `before_delete_post`. It now also has access to a WP Post object as a second argument.
- Feature: Code infrastructure added for rapid development of "Developer Tools". These can now be created by extending the `matador\MatadorJobs\Developer\DevToolAbstract` class, which will add a menu under Matador Jobs called "Matador Developer" with the registered tool(s).
- Feature: Application Processor can now also accept and process files that already exist on the web server, as opposed to those only in the form submission temporary memory. This allows extensions to download and store resume files and then process applications with them.

- Enhancement: As of Matador 3.8.4, new Salary Range features format the raw numbers from the API into localized numbers based on the locale of the site. This feature requires the PHP `NumberFormatter` which may not be included on all installations of PHP. The PHP module `intl` is not required by WordPress (though is recommended) but is required for this feature. A consequence was that on a few users' sites that did not have PHP's `intl` module, a PHP fatal error would be triggered. This release adds a failsafe that ignores number formatting when the `NumberFormatter` class of the `intl` module is unavailable.
- Enhancement: Salary Range would fall back to the value of the `salary` field when the high and low were the same non-zero value. Some users, we learned, have begun to use the default `salary` field for internal uses only and thus we modified the behavior to use the value of the high salary field when high and low are the same. That said, we encourage users to never use standard Bullhorn fields for any purpose other than its assumed or defined use case.
- Enhancement: Added exception handling for occurrences of a customized Job Object from Bullhorn featuring a multi-value `onSite` field. Prior to this update, a multi-value `onSite` field may result in a failed job sync. We again warn our users to, within reason, use standard Bullhorn fields in its assumed and defined use case.
- Enhancement: Admin Email notices will no longer send on Staging and Local sites. Basic automatic detection of staging/local is used but users wishing to leverage these features are encouraged to set WP_ENVIRONMENT constants in their wp-config.php file (since 5.9).
- Enhancement: Admin Emails are now throttled on a per-email basis, instead of all. This may result in more total emails per day but still only per issue, per day.
- Enhancement: All registered Job Taxonomies will now have sidebar menu item. We previously disabled these by default because most users don't need them and some sites that make heavy use of Job Taxonomies saw their sidebars taken over by the Matador Jobs menu, which was poor user experience. Unfortunately, we are temporarily enabling this due to the popular Elementor page builder hiding taxonomies if they do not show in side menu. We will explore improving User Experience around this in a future release.

- Bugfix: Fixed an issue causing .docx files generated by Google Docs to fail validation prior to processing to external systems. This actually wasn't "fixed," but rather avoided, as the cause of the issue is in libmagic, the Unix/Linux file handler that PHP relies on. The fix runs an after-validation check on files that fail validation to detect the bugged Google Docs generated MS Office Open Office formatted files.
- Bugfix: Fixed the "Test Auto Reconnect" button to once again work immediately, which due to 3.8.0 performance improvements, still technically worked but with a delay.
- Bugfix: Prevented the careerPortalDomainRoot test from attempting to run until Matador is connected to Bullhorn.
- Bugfix: Resolved issue where the setting "Log Googlebot Visits to Jobs" was not honoring the "off" selection.
- Bugfix: Modified the application sync routine to prevent a rare bug where too many applications could cause a memory overflow and cause all applications to fail to process.
- Bugfix: Fixed issue where date last updated/synced information would not store in the job object local copy. This would not impact sync routines, but could cause a PHP Notice, which may display on-screen or logged in error logs depending on site settings, and also impact sites that might want to show date/time of job added or updated.
- Bugfix: For reasons we still cannot explain, some sites will rarely save temporary Bullhorn connection data without a natural expiration. Since subsequent Bullhorn connections will use this transient data (or create new data if it is expired), we added a behavior that when a connection fails it can force-refresh this prior to a reconnection attempt.
- Bugfix: Fixed a bug affecting is_staging_site() when the Automattic JetPack plugin is active.
- Bugfix: Fixed a PHP Warning caused by sites that either have the matador_uploads folder deleted and/or not created upon plugin install/activation (due to any other bugs on the site at the time).
- Bugfix: Fixed a bug that could be encountered by Matador's template helpers aggressively escaping HTML in places where Matador would put some HTML for styling purposes.
- Bugfix: Fixed a bug that allowed field values completely removed from a Bullhorn job would persist on the Matador-cached job object. This will begin to impact all syncs moving forward; jobs with this existing bad data will not be updated.

- Misc: Removed a hidden debugging tool. This tool, while known to some of our users, was complex to use and if misused, could cause irreversible changes to Bullhorn data. The tool is now available as separate download upon request. The tool's page is held by a temporary error screen explaining its removal for user experience purposes.

## 3.8.6

- Feature: Extended Salary/Pay Range to now Support customFloat1 - customFloat3 options. This is for users whose high/low salary values are not whole numbers (especially likely when the rate is per hour.)
- Bugfix: Resolved issue where the shortcode for the Job Info Bar would not show a users custom meta fields selections.

## 3.8.5

- Fixed issue with updater script that caused people who updated to 3.8.0 or later to not get automatic updates.

## 3.8.4

- Feature: Support for importing and displaying a Pay Range. This is in response to upcoming laws and regulations in various jurisdictions that will require hiring agencies that meet certain qualifications to publish "pay ranges" for each position. A full help document will be written to explain how to use this feature, but the cliffs' notes are:
-- New Settings Section "Salary Options" Under the Job Listings Tab
---- Formerly Job Structured Setting "Show 'Pay Rate' Data" was moved and renamed "Display Salary/Pay Rate". This will now add a Salary Transparency string to the Job Information Bar under the title automatically.
---- New Settings "Salary Range Low Field" and "Salary Range High Field" allow users to select which fields, from a list of two default and 8 custom number fields, to use for the two parts.
-- When imported, the following existing or new post meta fields will be made on the job object if supporting data was found on the remote job record:
---- salary_currency: the value of the Bullhorn setting or a custom text field with the salary's currency
---- salary, salary_low & salary_high: The raw number(s) from the imported data. salary_low can be 0 while salary and salary_high cannot be 0 and will be left unset if 0.
---- salary_formatted, salary_low_formatted, salary_high_formatted: a localized formatted string of text containing the value with currency symbols and number/decimal separators. salary_formatted is formatted value of the Bullhorn salary field, unless it was blank and a high or low value was present, which would be used instead in that order.
---- salaryUnit: The text string that represents the unit, ie: Annually, Per Hour, etc.
---- salary_string: This is a string of text that dynamically combines the pieces we imported into a succient summary of the salary or salary range, eg: "$100,000 USD per year" or $97,500 - $105,000 USD per year", etc.
-- The following WordPress filters were added to customize the behavior of the above features:
---- matador_bullhorn_import_bullhorn_salary_currency_field will allow you to assign a custom text field to your job import that will designate the currency of the pay rate. This is optional, but helpful for users offering roles paid in separate currencies. Default is the value of the default currency in Bullhorn settings.
---- matador_bullhorn_import_salary_range_separator filter will allow you to change the characters or text that separate two numbers in a range. Default is an n-dash, or -.
---- matador_bullhorn_import_salary_unit_separator filter will allow you to change the characters or text that separate the last pay rate with the pay unit. Default is a space, eg, the space between 'USD' and 'per year' in the string '$100,000 USD per year'.
---- matador_bullhorn_import_salary_string filter will allow you to further customize the text string that makes up a salary statement. Default is the string we construct and it is passed an array of arguments with all the imported salary parts.
---- matador_structured_data_include_salary filter can be passed true or false to hide salary fields from the external structured data (used by Google, others to aggregate job data). It defaults to the settings option "Display Salary/Pay Rate". If you are required by local law or regulation to show pay rate, Google may not present your jobs if this is not provided.
---- matador_template_job_info_show_pay filter can be passed true or false to show or hide the Salary/Salary Range text in the Job Info Bar. The Job Info Bar is getting a little crowded, we'll admit, but it is the most consistent way we can include this by default without breaking users' layouts. It defaults to the settings option "Display Salary/Pay Rate".
- Feature: Bullhorn's newly implemented isWorkFromHome field will now be used to flag "Remote" or "Work From Home Jobs" in addition to the legacy behavior of matching certain values from the onSite field.
- Feature: New "Information Form Field" to simplify passing instructions via settings fields.
- Bugfix: Fixed issue that could cause the job importer to crash if the user has modified their Bullhorn field mappings to expose and then manually set or manipulate the publishing status. While this was introduced to Matador Jobs to prevent a crash of our importer, users who leverage Bullhorn customization to create non-standard records may be subject to unexpected and undesired outcomes. For example, while this fix will prevent an importer crash, it will drastically increase the amount of data imported in each job sync due to the missing dateLastPublished value. For best results with not only Matador but all Bullhorn Marketplace Partners, consider using as standard of an implementation as you can.
- Bugfix: Fixed an issue that could cause recruiter emails to fail when a Published Response User is not set during Publishing. This is related to the prior patch note and carries the same warnings.
- Bugfix: Fixed an issue preventing the assumed behavior of the "Sync This Job" button to not work as intended. The intent of this function was that a manual per-job sync would always fully download and overwrite the job data, but it was honoring dateLastPublished/dateLastModified rules intended for only the bulk sync. The button will now work as expected.
- Bugfix: Added action so extensions that extend "Sync All Applications" can use it more reliably.
- Bugfix: Fixed issue introduced in 3.8.0 that impacted certain sites using Persistent Object Caching with load balancers.
- Bugfix: Related to the 3.8.2 bugfix "When a certain of combination of settings were selected, the recommended value for careerPortalDomainRoot was incorrect", we fixed that in 3 of the 4 places it occurred, but not the fourth! So trying again for 4/4.

## 3.8.3

- Bugfix: Fixed poorly formed if...then condition related to Analytics reporting.

## 3.8.2

- Bugfix: When a certain of combination of settings were selected, the recommended value for careerPortalDomainRoot was incorrect. When presented to users, the careerPortalDomainRoot value will be right moving forward.
- Bugfix: A "nice to have" feature disabled in 3.8.1 due to causing new installations of 3.8.0 to fail was fixed and restored. The recommended value for careerPortalDomainRoot will now be displayed under the "Job Listings Slug" option and under the "Disable CareerPortalDomainRoot Check" option in the Bullhorn Connection Assistant.
- Bugfix: In order to ensure daily analytics do not send more than intended, Matador now tracks analytics calls via an explicit option instead of a transient. We observed that some sites with aggressive or buggy persistent object caching could send Analytics hourly, which is not the intent.
- Bugfix: Fixed issue where blank/empty values could be saved to the application data when a checkbox field type was used. When a checkboxes field type is used in the application, an empty value used in form submissions for validation purposes but would persist and be saved into the application data. While often not an issue in and of itself, when syncing an application to Bullhorn, this empty value could result in an `IMPROPERLY_STRUCTURED_ASSOCIATION` API error when being submitted to `HAS_ONE` or `HAS_MANY` field types. This bugfix will prevent the empty checkbox from being saved in the first place while also fix data before API submission to avoid future `IMPROPERLY_STRUCTURED_ASSOCIATION` API errors.

## 3.8.1

- Bugfix: Temporarily removed the "nice to have" feature of 3.8.0 which displays the expected/desired value for the careerPortalDomainRoot in certain settings screens which, due to how this is added to the settings screens, could cause the initial installation of Matador Jobs on fresh WordPress websites to crash. Per our investigation, this only impacted users installing Matador Jobs on a fresh installation of WordPress where the "pretty permalinks" options were not yet set. No active jobs sites were impacted, as the nature of this bug would never have impacted them.

## 3.8.0

Matador Jobs 3.8.0 contains changes in 318 commits changing 104 files and over 14,000 lines of code revised or added. It is a large update with many quality-of-life changes that will make Matador Jobs more reliable and easier to use for all our users.

This will be the last major version of Matador Jobs to support PHP 5.6 and WordPress versions prior to 5.8. When released early to mid next year, our next version will require PHP 7.4 or higher and WordPress 5.8 or higher.

### Connectivity & Stability

Highlights:

- **New Sync (Beta)**: This release includes a beta release of our updated sync routine. The sync routine was redesigned to pause prior to triggering "long processor killer" triggers at the web host and resume, picking up where it left off, over and over again as needed, to ensure a complete sync consistently occurs. Some users, especially those with more than 2000 active openings, would see syncs fail due to "long process killers." While this new sync routine is very reliable, we have opted to make it optional until 3.9.0. Opt-in to the new sync by adding this developer flag to your site `add_filter( 'matador_experimental_sync', '__return_true' );`.

- **CareerPortalDomainRoot Detection**: Several Bullhorn systems, including Bullhorn Automation (formerly Herefish) and Bullhorn Publish to Indeed will generate a web address (URL) for the job based on the value in Bullhorn of the careerPortalDomainRoot setting. Matador users who use Matador as their primary job board (or portal) should notify Bullhorn to update this setting. Now, Matador will read the value of careerPortalDomainRoot in Bullhorn and let you know if there is a mismatch. Further, this detection will not trigger on common local, staging, development, or test environments and can be disabled.

- **Added "Cookie Bug" Warning**: Long time Matador users will know about the "Cookie Bug." This is a bug in the Bullhorn authentication system that allows a logged-in user's cookie to hijack the Matador Jobs authentication with Bullhorn and authorize as that user, not the API user. This has serious potential consequences including job syncs bringing in the wrong jobs and the site being unable to auto reconnect in the event of a downtime. Now Matador can detect when a "Cookie Bug" has occurred and will warn the user.

- **Added Matador Unsafe Password Warning**: Matador Job's auto reconnect routine cannot reconnect when the API User Password has certain "unsafe" characters. Valid Bullhorn passwords can still cause an issue, so Matador will now detect if the password would not allow for an automatic reconnection.

More:

- Fixed an issue where the "Test Auto Reconnect" routine would result in a disconnection fail following changes to Bullhorn's API.
- DISABLE_WP_CRON warnings will now not display as admin notices. Many managed WP platforms have moved to disable WP_CRON and replace it with system cron. This is a good thing! Unfortunately, this also turned our formerly helpful heads-up into an annoying notice for many users.
- The Administrator Disconnected Site Warning Email will now only send after several attempts have been made to reconnect. This, in combination with the existing 24-hour timeout, should minimize the occurrence of admin warning emails when the software can reconnect naturally. The recent higher occurrence of Disconnection Notices has been due to a high frequency of 429 Too Many Requests errors on the Bullhorn API, which means there is a "traffic jam" on their system.
- The Administrator Disconnected Site Warning Email has two changes. First, the subject line formerly had the "Site Name" but will now have the "Site URL". Second, a line is added to the content of the email with the "Site Name" and "Site URL". These two changes will help site operators differentiate between disconnections of live/production sites and disconnections of local, test, staging, or development sites, and how much urgency they need to apply to the email notification.
- Fixed a bug that caused logging options to not save on "lite" versions of Matador Jobs.

### Marketing/SEO

Highlights:

- **Experience and Education Updates**: Google for Jobs Search and other systems that consume Job Structured Data/LD+JSON have new expectations for Experience and Education details. Matador will now serve the updated schema.

- **Employment Types Detection**: Matador will now map more user values to the default Job Structured Data/LD+JSON employment types. We still encourage you to review the values you are passing from Bullhorn into Matador Jobs for employment type and ensure they are mapping to Job Structured Data/LD+JSON expected values, especially if your primary language is not English.

- **Integration with All in One SEO (AIOSEO) Plugin**: Matador will now integrate its Job Structured Data/LD+JSON features into All in One SEO plugin. This happens automatically when the AIOSEO plugin is included. AIOSEO now joins RankMath and Yoast SEO in the list of 3rd-party SEO plugins that Matador seamlessly integrates with.

More:

- Matador Jobs can now detect visits by the 'Googlebot', aka Google Indexing systems, on jobs. All visits are added to your Matador log file, or if you have Google Indexing API active, you can log only visits after an Indexing API call.
- Added a validation to the Job Structured Data/LD+JSON inclusion to validate that we indeed have valid JSON. This prevents issues with page validation (ie: from Google Search Console) if the JSON is invalid. Invalid JSON is sometimes created when customization developer filters are improperly used.
- Fixed issue where JSON+LD was being loaded on certain jobs archive/job listing pages, resulting in possible issues with page validation (ie: from Google Search Console).
- Updates to Yoast SEO integration to reflect changes to their plugin.
- Fixed bug on RankMath SEO integration causing the Job Structured Data/LD+JSON to be included in the wrong part of the graph. As of discovery of this error, page validation tools (ie: from Google Search Console) still considered the old (wrong) implementation valid.

### Privacy

Highlights:

- **Terms of Service Consent Field**: A Terms of Service consent field was added to Application forms. It behaves similarly to the existing Privacy Policy consent field. This gives users the ability to have separate Privacy Policy and Terms of Service consents, which is recommended for adhearance with the ever-changing data security and privacy regulations. This update includes the following:
    - New checkbox form field for Terms of Service with basic text description. *International users please send us a literal translation for the field and we will update translations for your language.*
    - New admin settings "Require User to Accept Terms of Service" and "Terms of Service Page". When the "require" setting is toggled on, Matador will add a form field in the application footer that requires applicants to check a box acknowledging the website Terms of Service. If a page is selected in the "page" setting, a link to the WordPress page with the Terms of Service will be included.
    - If your Bullhorn install includes the Candidate Consents object, a new consent will be added for "Accepted Terms of Service" with the justification of "Contract Necessity". The description will be "Candidate accepted Terms of Service." followed by a log of their IP address at time of submission.

- **Discontinuing Recognition of "Do Not Track"**: Matador Jobs Pro will no longer consider your site users' web browser "Do Not Track" setting when determining whether to load Matador's Source Tracking features. This browser-level setting is largely ignored by the big trackers and was intended to only apply to 3rd party, and not 1st party like Matador's, trackers. We recommend our users review the documentation on Matador Traffic Source Tracking features to ensure compliance with local laws and regulations.

More:

- The settings section "Application Privacy Settings" is renamed to "Consents, Privacy, and Data Security Settings" to better communicate the expanded purpose of the section.
- The description text for the Privacy Policy consent saved to the Bullhorn Candidate Consents object will now read "Candidate accepted Privacy Policy." followed by a log of their IP address at time of submission. Previously, the description was not clear, listing applied jobs.
- Removed links to the applicant's submitted files in the application transcript, which was often used as the body text of a recruiter email notification. This makes it easier for those wishing to not distribute those files when considering local privacy law compliance.
- Remove legacy method for candidate IP address and candidate Privacy Policy Acceptance tracking. Released in 3.4.0, most users never took advantage of the feature Matador included in our code to track the time and date of a Privacy Policy acceptance for a candidate. This is partly due to how complicated it was to set up, requiring no less than 6 developer filters and 4 customText and customDate fields set up in Bullhorn. With 3.7.0 and later 3.8.0, Matador now tracks this data automatically with no setup required in the Bullhorn Candidate Consents Object, and thus we are removing the legacy features in favor of the new, easier to use, replacement.

### Templating/Theming

Features:

- **New Shortcode [matador_portal]**: A new shortcode `[matador_portal]` is introduced. This shortcode will help users of "Classic Editor" and "page builders" other than the WordPress block editor to streamline access to a standard "job portal" like page with a single shortcode. [See more here.]()

- **New Shortcode `[matador_general_application_link]`**: A new shortcode `[matador_general_application_link]` and associated template functions `matador_{get}_general_application_link()` and `matador_{get}_general_application_url()` will provide a simple button link to the "General Application". This must be used in coordination with a new setting "General Application Page" to determine the destination. The purpose is to provide mostly developers an easy way to link to the General Application page, or page that contains an application not assigned to a specific job, while leaving the user space to update or change it at a later time.

- **New option for Taxonomy "method", "search"**: The matador_taxonomy() function (and associated shortcode) now accepts a new value for the 'method' argument: search. When passed 'search' the link will be to the jobs listing page (as set in settings) or jobs archive with the taxonomy argument appended as if it were a search term. If used on the jobs listing page, this will reset the search, so on the jobs listing page you will still want to use 'method=filter'. This makes it easy to include the list of taxonomy terms in your design without requiring you to have a taxonomy archive page prepared.

More:

- Updated default stylesheet to better display the `[matador_search]` and `matador_search()` shortcode/function responsiveness on small screens. The changes were designed to be minimal so as not to impact user stylesheets but make it less necessary for user stylesheet overrides to be even necessary in the first place.
- Reverted a bugfix from 3.7.7 and created a new one that changed behavior around Job Sorting on Taxonomy Archive pages. Our fix was actually too aggressive, and caused sorting rules to be not applied in some instances where they were desired. We reviewed the initial bug report after reverting the flawed patch and came up with a solution that is more reliable.
- Fixed issue where the [matador_types] and [matador_locations] alias shortcodes, when used with no passed arguments, would result in an "Illegal String Offset" PHP error. This was caused by a WordPress quirk where no arguments passed to a shortcode passes an empty string into the shortcode callback function instead of an empty array. Funnily enough, once again, we have major release with a fix for a bug that has technically existed since launch of Matador! THREE IN A ROW!

### Job Import

Highlights:

- **New Sync*: See notes on the new sync in the "Connectivity and Reliability" section of this Changelog.

More:

- Matador will now gracefully handle data that comes over the Bullhorn API as multiple values when only a single value was expected. In some cases, it will combine provided values, in others it will use only the first provided value. The reason for this change was because we found users enabled the "allow multiple values" setting in Bullhorn for standard fields that should not, in our opinion, have multiple values, like Job Title. We recommend users do not "allow multiple values" on standard Bullhorn fields, even though Matador can now handle these.
- Fixed an issue causing `dateLastModified` and/or `dateLastPublished` values to be saved in the WordPress database with timezone offset, which caused issues with "last updated" related syncing for sites in a GMT+ timezone (east of Prime Meridian).
- `dateEnd` and all `customDate` job properties from Bullhorn will now properly save as a MySQL-formatted Date & Time object. Previously, dates like these were saved to the database as Unix timestamps, which many third-party templating systems could not format easily.
- An extremely rare issue could occur when concurrent Bullhorn calls interrupt the other and, if the timing was right, result in some or all jobs being removed from the site until the next uninterrupted sync. Changes to the syncing code were added to ensure that the interrupted sync fails gracefully, instead of destructively, when this occurs. Thank you to Lara at MCM Staffing for bringing our attention to this bug.

### Applications/Submissions

Features:

- **New Company and Occupation Form Fields**: Added `companyName` or "Your Current Company" and `occupation` or "Your Current Occupation" form fields to the core form offering. Include them by passing them to the fields argument of the [matador_application] shortcode or via the `matador_default_application_fields` filters.

- **New Cover Letter and "Files" Form Fields**: Added `letter` or "Cover Letter" and `files` or "Other Files (Multiple)" form fields to the core form offering. Include them by passing them to the fields argument of the [matador_application] shortcode or via the `matador_default_application_fields` filters. Letter will save into Bullhorn as a "cover letter" while "Files", which we imagine can be repurposed to allow for submission of portfolios or examples of work and/or answers to assessments, will be saved into Bullhorn as "other" type files.

- **Select Candidate "Owner" Setting**: Prior to this release, the "owner" in Bullhorn of a new candidate would be the API User. Certain agencies would prefer to set the "owner" based on the Job's "ownership" and a new setting will allow for this. Select from 'API User', 'Job's "Owner"', or 'Job's "Published Contact Recruiter"'.

- **Existing Candidate's Name Not Updated**: Matador will no longer update a Candidate's name after an application where a matching candidate record was found. Assumption shall be that a Candidate's name was correct on initial application. A few rare situations occurred where bad user input on a subsequent application changed a record in an unexpected way. On that note, if a candidate makes submission with a misspelled first name or nickname instead of legal name, a change will now need to be made by the contacting recruiter.

- **Removed Email Validation**: With this update, all email address validation is removed from the plugin. Our email address validation was too strong and based on an outdated international standard (RFC2822) which didn't allow for certain international characters in the email address or name as well as certain internationalized URLs after the `@` symbol. New email address standards (RFC6854) are now so relaxed that it is consensus among developers that there is no reliable way to validate the format of an email address without creating false negatives. Further, assuming that risk is deemed worthwhile, even a properly structured email address that passes validation does not a guarantee that an email box even exists at that address. For those reasons we will no longer validate email addresses.

More:

- Form processing used to reject all empty() values during processing, which included `false` and zero numbers. We've encountered use cases where saving those as-is are necessary. As a result, form processing will now accept zeros and `false` while still properly rejecting null and empty values.
- Fixed a bug that could occur when a custom form field passes a string to a field that expects an array of values. Matador will now verify the string value and convert it to a single-member array containing that string.
- Fixed an error being caused by changes to the Bullhorn API that now enforce previously unenforced length limits to certain fields. User input that exceeds the limits will now be truncated at the character limit.
- Added handling for changes to the Bullhorn API (or its resume processor) that now return `HTTP 500 Internal Server Error` errors instead of the former `HTTP 400 Bad Request` errors when a resume is submitted that cannot be processed.
- Standardized the methods Matador checks the uploaded file size and extension across various systems (client side validation, server-side validation, etc). Now, in order to change the allowed file types and max uploaded file size, a change only needs to be made in one place.
- Matador can now set the "File Type" of files saved into Bullhorn. Previously, when a form accepted multiple files, all would be saved as "Resume."
- To make accessing submitted files easier, a new dialogue box was added to the Submission record with links to the files and, if processed, the raw data from the resume processor.
- Improved handling of Field Labels in the Submission transcript (which is saved to the `post_content` field of the WordPress Submissions post type). The transcript is used both as a backup for the application data in the event of an issue and also as default content in generated emails for recruiters and applicant email confirmations. The field labels will now more consistently draw their values from the application structure as modified by the user's custom code or the Advanced Applications extension.
- Added developer filter `matador_application_transcript_include_field` to be used to remove items from the application transcript. This might include confidential applicant demographics data and other sensitive information that shouldn't be readily accessible or sent via email.
- Removed links to the applicant's submitted files in the application transcript, which was often used as the body text of a recruiter email notification. This makes it easier for those wishing to not distribute those files when considering local privacy law compliance.
- Submissions (Applications) were showing as available for inclusion in the WordPress menu builder even though they would not load on the site front end. This was unintentional and has been changed; submissions will not be available as options for WordPress menu builder items.

### Notifications/Emails

*Note: some items that also belong in this category were previously included in the Privacy and Submissions sections.*

Highlights:

- **Recruiter Notifications Bullhorn Deeplink**: Recruiter Notification emails will now include a deeplink into Bullhorn if the email setting is set to "send email after the candidate sync".

More:

- Added filter `matador_email_additional_headers` to allow developers to add additional headers to Matador-generated emails.
- Added developer filter `matador_email_allowed_html_tags` to give users granular ability to extend which HTML tags are allowed in Matador emails. The use case, notably, is from Matador user Nils with WebReact who explained that custom XML tags readable by MSExchange and Outlook can add interactivity to emails on that platform but the XML tags were being stripped by Matador's security routine. Now a user like Nils can teach Matador that those XML tags are safe to allow in the email.

### General

- **Added WP-CLI command `wp matador sync`**: Our first WP-CLI commands are live! This first command, `wp matador sync` runs the full sync process from WP-CLI. This can be used on webhosts with system cron options and WP-CLI to disable Matador's sync and rely on a custom sync scheudle. Future updates will expand WP-CLI commands.

- **Added Analytics:** Matador will now report simple annonymous analytics when certain actions occur, including plugin activation, upgrade, and connection to Bullhorn. The purpose for these analytics is to help us understand our users' needs and provide more reliable support. As per our terms of service, we will also share some of these analytics with Bullhorn. Bullhorn likes to know who is using Matador, and accounts marked as Matador users will recieve an enhanced support experience, so everyone wins!

- **Update to Software Licensing and Automatic Updates**: Completely overhauled Matador's handling of Licensing and software updates, fixing many bugs and adding features and utility:
  - Previously Matador would not deactivate a url from a settings change. This would result in users needing to manually deactivate URLs from MatadorJobs.com. Now, a button allows manual deactivation and changing the key triggers automatic deactivation, making it much easier for site owners to authorize production sites after development.
  - Matador respects more wildcard Staging and Development URLs, and will honor `WP_ENVIRONMENT_TYPE` variables when considering whether to consume an activation against your license.
  - Matador will check your activation every four hours and detect if an external deactivation was made, which helps keep sites working as expected.
  - Matador plugins should now play nice with WordPress Automatic Plugin Updates (since WordPress 5.5).
  - When attempting a site activation, Matador will provide more detailed descriptions of issues, including where helpful, a link to MatadorJobs.com to resolve the issue.

More:

- Fixed issue causing PHP 5.6 incompatibility. We strongly recommend our users run sites powered by PHP 7.4 or later, however.
- Fixed issues causing PHP 8.1 incompatibility. Code written for the Traffic/Source feature issues a `PHP NOTICE` but fixing it will make the code not valid for PHP 5.6. This will updated prior to Matador Jobs 3.9.0 or 4.0.0 which will require PHP 7.4 or later for Matador Jobs.
- Revised some use of PHP's DateTime class to use PHP's DateTimeImmutable instead, which prevents some rare cases where dates could be changed in unexpected ways.
- To further support extension development, some functions were converted to static functions.
- Refactored how third-party plugin/theme support is included in the codebase, properly isolating it into separate files for ease of maintenance and code readability.
- Updated dependence jQuery.Validation from 1.17.0 to 1.19.5
- Updated dependency mustache/mustache from 2.13.0 to 2.14.2

## 3.7.8

- Fixed bug introduced by code that shouldn't've been included in 3.7.7!

## 3.7.7

Temporary

- Added code to handle and recover from a Bullhorn API error while we work with Bullhorn to get the issue fixed.
- Added code to temporary override the setting "Submit Applicants to Bullhorn" setting from "Immediately" to "In the Background" when it was set to "Immediately". This will assist sites in catching from application processing backlogs associated with the above mentioned API error. That said, in the future, this option will be fully removed as the change in cadence from hourly to every-10-minutes syncs with 3.7.0 has made the purpose for this setting unnecessary.

Enhancements:

- Added handling for Consent Management permissions errors. This includes a 24-hour time out to allow for continued processing of applications affected by consents permissions issues and an email warning to administrators.
- Matador Source Tracking can now support the MatadorTraffic Javascript class file in a deferred loading routine (eg: like by a plugin, caching tool).
- Added filter `matador_campaign_tracking_inline_script` to completely override the default inline script that instantiates the MatadorTraffic class in the event of use cases where the instantiation of MatadorTraffic needs to be modified completely (async loading, compression being noteworthy examples).
- Added filters `matador_bullhorn_candidate_find_candidate_request_params` and `matador_bullhorn_candidate_find_candidate_request_query` to allow for modifying the candidate find routine. Useful if you want to limit candidate find to certain statuses, among other things.
- Added filter `matador_application_validator_errors` to make it easier to change a number of the error strings at once (previously, you could change them only one at a time via `matador_application_validator_error_{ $key }`. Now you can do both.
- Added "NA" to empty parts of the Candidate Source string. This is to reduce confusion around the parts of the source when parts are unavailable (ie: campaign, which is not available from URL-detected source data.

Bugfixes:

- True/false values for the JSON+LD directApply value now are strings, fixing issues where they were boolean and failing validation from Google Search Console & JSON+LD Validator.
- Fixed error in an error handler in class-bullhorn-connection.php. Ironic, right?
- Added error handling for when a description or publicDescription is returned as an array.
- Added alternate method to encode email subject lines into UTF-8, no longer requiring the `mb_string` PHP library. Installation of `mb_string` is still highly recommended.
- Fixed error causing "Recount Terms" button to trigger an infinite loop.
- A bug, which dates back to version 3.0.0 (almost 4 years ago), was discovered and fixed. Custom job sort order rules would be imporperly applied to all WordPress queries on taxonomy archive pages. This most obviously resulted in menus not showing properly, but anything on a taxonomy archive page that required a WordPress query was impacted.
- Added error handling for occurrences of a job with stale ClientCorporation data values, ie: ClientCorporation is deleted in Bullhorn but job is still assigned to the deleted ClientCorporation.

Internationalization:

- Added first drafts of German (Germany) and French (France) translations.
- Fixed bug causing three strings part of the client-side form validation scripts to show default untranslated strings even though valid translations were provided.

## 3.7.6

Bugfixes:

- Reverted 3.7.5 change "Added information about the careerPortalDomainRoot Bullhorn setting in Matador Settings, to help notify users about the process to setup your Matador Jobs board to be used for Bullhorn and other Bullhorn partner's job feeds (ie: "Also Publish to Indeed")." as it was causing some sites to break on update. We do not know the cause and will investigate and restore the enhancement at a later date.

## 3.7.5

Enhancements:

- New Support for Google for Jobs Search 'directApply'. Beginning on 2021-07-13, Google began using the 'directApply' property to identify jobs which can be applied to directly, which they define as via a simple one-step application on the website. This will be presented to all Matador Jobs Pro users with the "Use Matador Application Processing" setting turned on. If your implementation meets these conditions but has further steps that may fail to meet Google's expectation for a direct application, you should disable this by adding follow line of code added to your theme functions, matador functions, or site plugin: `add_filter('matador_bullhorn_import_save_job_jsonld_direct_apply', '__return_false' );`
- New filter `matador_get_the_job_meta_taxonomy_args` to modify how the taxonomy term(s) are displayed when called by `matador_{get_}the_job_meta()` or `matador_{get_}the_job_info()`. This is most helpful to those wishing to remove links from the job info bar, which relies on matador_get_the_job_meta() during generation.
- Added new default form field "files". This works nearly identically to the original "resume", "letter", and "file" form fields, except this one can accept multiple files.
- Additional styles and rearranged columns to Admin views Submissions (Applications).
- Added a "Sync to Bullhorn" button on the "edit" screen of a Submission (Application) that is not synced to Bullhorn.
- Added a file header to top of each log file when a new daily log file is created with relevant environment information.
- Added information about the careerPortalDomainRoot Bullhorn setting in Matador Settings, to help notify users about the process to setup your Matador Jobs board to be used for Bullhorn and other Bullhorn partner's job feeds (ie: "Also Publish to Indeed").
- Added search form pre-processing to remove unused search options from the resultant querystring. Eg: If a form had a "keyword", "locations", and "category" options and the user only entered a keyword, the url would look like this in the past: `{jobs-url}?matador_s=keyword&matador-locations=&matador-categories=`. Now, the URL will now look like this (with unused search terms omitted) `{jobs-url}?matador_s=keyword`.

Bugfixes:

- Recently, the reliability of the Bullhorn API has been less, such that occasional HTTP 429 Too Many Requests are returned. While we can't fix this, we can acknowledge that Matador misinterpreted this sometimes as a "no jobs found" instead of a "can't connect", and carried on. When no jobs are found, all existing jobs are deleted. Now, Matador will properly understand the difference a legitimate "no jobs found" vs an empty response due to a 429 HTTP Response Code.
- Fixed an issue introduced in 3.7.0 where Matador was doing a pre-sync routine check for Bullhorn API credentials but was checking for OAuth Access and Refresh Tokens instead. These could be missing when a natural disconnection occurs but recovered from in a reconnection routine. Unfortunately this bug prevented some disconnections from being recovered from even if a recovery was possible. This bugfix will now again allow more automatic reconnection routines to run ensuring great uptime.
- Fixed an issue where names with apostrophes, for example "O'Shea" would have security escaping added during form processing, resulting in something like "O\'Shea", but not removed prior to database save. We took a stab at this issue in 3.7.0, but we were "fixing" when the data was coming out of the database and right before communication with Bullhorn, when we should've and could've addressed this earlier at initial data processing. The bug meant non-Bullhorn actions, like email notices and messaging pings, had the improperly escaped data. Now that the initial database save will have these escaping slashes removed, all behaviors that use the data will be without awkward slashes.
- Added character limits to phone numbers on the Candidate object, due to some extremely long phone numbers returned by the resume processor causing sync issues with Bullhorn.
- Fixed issue where the "Sync Now" button for Submissions (Applications) was missing when the "Submit Applications to Bullhorn" setting was set to "Disable". This allows users to now batch sync and/or sync submissions one-by-one manually.
- Fixed issue where string or integer zero values were being replaced by default non-zero values in Matador Settings screens. This was specifically causing the "Applications Sync" and "Error Logging" settings to not seem to save in their zero value states of off when accessing the settings. While the settings were properly set, the user interface implied otherwise, causing confusion.
- For users of the Advanced Applications extension, a rare situation could occur where an applicant identified themselves with a skill, category, etc, that was cached to the site but removed from the Bullhorn account before the cache could update and which could cause the application to fail when being submitted repeatedly. Protections were added to check for this and carry on if this issue is encountered.
- Fixed issue where the list of available Matador Jobs logs files could be generated before a delete routine is run. This creates a unique moment which can be confusing to users where they may click on a log file link that has been deleted and get a 404 error. Now expired files will be removed BEFORE a list of logs is made and presented to the user. Further, when no log files are available, Matador will present a message stating that explicitly.
- For users with especially large numbers of jobs, a no cache/hard sync was subject to a "race condition" bug that would result in no cache/hard syncs not working as intended. Additional protections were put into place to ensure no cache/hard job syncs work as intended. That said, if your site has enough roles for this to have occurred, we see multiple more opportunities for optimization on its way as lessons learned from this bugfix.
- Fixed issue where search forms that enabled Multiple Select for the taxonomies would return a 404 page when the "All" option was selected. After 3.5 years of Matador, this day one bug has existed because prior to this month, no one has ever used multiple select option for the search form!

## 3.7.4

- Enhancement: Allow for HTTP 201 and 202 codes in "successful" Bullhorn API calls
- Bugfix: Fixed issue resulting in the `firstname` and `lastname` variables not being passed the applicant and recruiter email templates.
- I18N: Updated Dutch (Netherlands) translations.

## 3.7.3

- Fixed bug causing applications made via a page redirect to not be added as a submission to the jobs they applied to.
- Fixed bug created in the 3.7.2 bugfix that addressed the emails failing to send. This bug, ironically, resulted in emails being sent twice. Hopefully now, emails will only go out once and of course when expected.
- Added error handling for when a Bullhorn API request is given a `429: Too Many Requests` error. A user had this occur when a Matador Jobs call and another tool made concurrent API requests. Matador didn't handle the error properly and jobs were temporarily deleted from the user's site until restored. We will be doing more work in this area at a later time, but at least with this fix future occurrences would not have the jobs  deleted and the sync would fail gracefully.
- Added filter `matador_resume_or_cv` to allow filtering of the value output by the "Resume or CV" setting option. Thanks to Jen D. at Stevenson & White for the idea.

## 3.7.2

- Tested up to WordPress 5.7.0.
- Feature: `matador_the_job_posted_date()` and `matador_get_the_job_posted_date()` now have alias functions without `posted_`. Our template function design goal was to have intuitive function names based on WordPress core template functions wherever possible, and this case broke the rule. While the old functions will be officially deprecated with this change, they will not be removed.
- Enhancement: the extension abstraction architecture to allow implementing classes to have a fully optional ID constant. Single-use (custom) or 3rd-party extension plugins now do not need to define class constant ID at all. Previously, it was still required but needed to be set to 0 to avoid loading the extension updater callbacks.
- Enhancement: New filter `matador_the_jobs_link` to filter the output of `matador_the_jobs_link()` and `matador_get_the_jobs_link()`. Use case includes to append a URL anchor ie: `#jobs` to pass instructions to javascript or scroll directly to jobs.
- Bugfix: Fixes an issue that caused the 3.7.0 settings option to show/hide Matador Jobs CSS to not be available to users of the WPJM integration, resulting in some of their site's CSS that relied on base Matador styles to present poorly.
- Bugfix: Fixes an issue affecting Recruiter Notification Emails failing to send when "Send on Candidate Save" was set to true.
- Bugfix: Fixes a translation error in the nl_NL translation file.

## 3.7.1

- Fixes bug that caused applications to sync slower than intended, which could've caused sites with large application volume to get behind or sites with a backlog of applications to sync to not catch up quickly.
- Fixes bug that caused the new 3.7.0 "Load Matador Settings" setting to not be auto-set, resulting in some user's sites to stop loading the CSS after a first settings save following a 3.7.0 update.
- Fixed bug that caused a 3.4.0 setting to display as "no value" when it had an "off" value.

## 3.7.0

Features:

- Expanded triggers for Remote job handling. Added "On Site", "WFH", "Work From Home", "Telecommute", and "Remote." Complete lists includes original two "No Preference" and "On-Site".
- Added `isRemote` job meta value when remote job trigger is active. Value defaults to "Remote". Is otherwise not set.
- Added remote flag to default Job Information bar after location and before employment type.
- Added setting to enable remote term for Locations taxonomy. Term defaults to "Remote".
- Added `matador-job-remote` class to `<article>` tags generated by matador template helpers when the job is remote.
- Added filter `matador_import_location_remote_term_name` to override the default "Remote" value for `isRemote` and the Location taxonomy term.
- Added setting Location Taxonomy Term to select address part for Location Taxonomy term value. Previously, this was possible only with developer filter, and it was the most commonly used developer filter by a long shot.
- With addition of the two new settings above, some reordered of settings in the "Job Listings General" section was necessary.
- Added 'ID' field to the search form. When a value is provided in the ID field of a search form, searches will be performed against the list of external (Bullhorn) IDs. To use, add it to your fields argument in the `matador_search()` function or to the fields parameter in the `[matador_search]` shortcode. Thanks to Ryan L. of
- Added 'label' parameter to the `[matador_taxonomy]` shortcode and `matador_taxonomy()` functions. This will add an <h4> with the label before any 'list' type calls or include the label in the <label> block for 'select' type calls.
- Added a psuedo job meta field called "age". It presents the age of the job using relative, human-friendly terms. Examples include, "5 days ago," "Yesterday," "12 hours ago," and "just now." You can access this wherever a job field is called or call it directly via the matador_{get_}the_job_relative_age() functions.
- The developer filter `matador_the_job_relative_age` will allow developers to customize the output of the job relative age relative function.
- Template function matador_pagination() will now default to the global $wp_query when its first argument is omitted, simplifying its use.
- New setting to enable user to disable most Matador styles, ensuring easier styling for a template developer.
- Duplicate protection now checks all email fields (`email`, `email2`, and `email3`) against the candidate during duplicate prevention checks. Formerly would only check primary email. Thanks to Brian S from Rainmaker for the feature request!
- Duplicate protection is now more forgiving in how it compares names. Prior to this release, 'smith', 'SMITH', and 'Smith' would all be considered distinct and result in new records, even if the email matched. Now capitalization and some punctuation is normalized prior to compare, resulting in more reliable results. Thanks to Sheila M from FlexPro for feedback that improved this feature.
- New form fields `Occupation` and `Company` are available to all users. Inputs from forms with these fields will be added to relavant fields in the Candidate object during sync.
- Added a filter `matador_application_content_line_label` to enable developers to modify the presentation of the application form response "content" block. See Application_Handler::get_bullhorn_fields_from_form().
- Added a developer filter `matador_email_application_notifications_include_attachments` to remove resumes from the attachments of application and recruiter emails. Thanks to Eddy L. and Abderrahman G. at Manpower Group for pointing out this obvious omission!
- Candidate Certifications and Candidate Owners are now supported for users of the All Access Extension - Advanced Applications or those who customize their application form oject.
- Added "Recount Terms" button to Matador Jobs taxonomy pages. This will help users repair issues caused by interrupted syncs.
- Added "Full Sync" action. Will sync all jobs regardless of their cached state.
- Added "Delete All Synced" applications button to delete all synced applications and their associated files from the website.
- Added a feature we call Migration Detection. When migrating from one URL to another, ie: when going from "staging" to "live",  Matador is no longer able connect to Bullhorn, and moving forward, Matador will disconnect the site from Bullhorn, and provide information to the user on how to reconnect.
- Added a once-every-four-hours WP Cron health check. As Matador Jobs requires WP Cron to function properly, it is important to notify our users when it will not work as intended.
- If your WP Cron task is more than 24 hours late, we will send you an email and add an admin notice.
- Added a Matador WP Cron queueing system; two Matador-releated WP Cron tasks that activate at once will now enter queue to prevent one from interrupting the other's connection to Bullhorn.
- Increased frequency of Matador Jobs WP Cron from once per hour to once per 20 minutes.
- Added filter `matador_bullhorn_import_get_remote_jobs_limit` to modify the number of jobs fetched per batch in a Bullhorn Import remote fetch. It is set to 20 after vigorous testing about two years ago where more of our users were still running PHP 5.6 or less. 20 is safe, but sites that can support higher numbers can utilize a larger number. Our intent is to reconfigure our overall sync process in an upcoming release to make the sync more efficient without a need for modifying this number, however.
- In version 3.3.0, in order to ensure faster load times for Matador administration screens, wherever possible, we made all external calls to Bullhorn in the background by using WP Cron. TStarting with this version, tasks that relied on Cron for speed will begin working again when WP Cron is disabled.
- Improved the new install setup process with a welcoming Admin Notice.
- Adds support for new APAC Australia Bullhorn Datacenter in the Bullhorn Connection Assistant.
- Added ability to define Bullhorn API Credentials in constants in WordPress Config files. This will improve security and reliability of the API Connection.
- Added Matador Extension Interface and Traits to assist developers in quickly creating custom extensions with reusable code.
- Added filters matador_initialized and matador_loaded to assist developers in controlling load ordering.
- Added filter `matador_enable_styles` to completely disable loading any Matador stylesheets.
- Scripts and Styles will now load a minified version when the WordPress WP_DEBUG or SCRIPT_DEBUG constants are not set or set to false. Further, when either are set to true, Script/Style versions will also be served with a clock-based version, helping to bust cache while you're developing!
- Improved JobPosting structured data when RankMath SEO plugin is installed.
- Made utm_source and utm_medium optional in Matador source tracking. Previously, the feature required both a utm_source and utm_campaign value to track any utm_* parameters, and the ommission of either of those two would ignore all utm_* parameters. While it is a best practice to use both, they should not be both required. Thanks to Ryan L. at for the report and helping us work out the necessary fix.
- RSS, RSS2, and Atom feeds are removed by default for jobs. The standard feed format by WordPress doesn't scoop up enough information about a job for the feed to be of any value. All can be restored with a simple remove_action call, or they can be one restored one-by-one with the `matador_jobs_listing_disabled_feeds` filter.

Bugfixes:

- Fixed and issue causing the "Sync This Job" button to not appear for all users. This was missing on some sites due to deprecation handling of a related feature. Should now appear and work for all users.
- Fixed an issue where the argument `class` was not working for `matador_application()` and `[matador_application]`.
- Fixed an issue where passing "magic" name fields to the `required` arguement for the `matador_application()` and the `[matador_application]` shortcode would assign the required field handling to the fields. Thanks to Eddy L. at ManpowerGroup for the bug report.
- Fixed a bug affecting a rarely used feature. If an additional Matador Jobs taxonomy is created with the key name matching an address field, the value from the address field will be populated into the taxonomy. The feature now works as intended.
- Fixed a bug causing the single name field name processing to not properly remove double spaces, which could cause unexpected issues in several related systems.
- Fixed an admin error warning for the [matador_job_field] shortcode that incorrectly instructed users to provide a "field" argument when the expectation was for a "name" argument.
- Fixed an issue that caused the "thank you" message to be missing when using "Append Confirmation" or "Generate Confirmation" options when the shortcode was used.
- Fixed an issue that caused the sync status and links to Bullhorn to not show on the application sync log header as intended.
- Fixed issue where the testing page for Google Indexing API required "Adminstrator" when other Matador Jobs settings/configuration pages required only the capability of managing options. This affected a small number of sites configured to grant more granular administrative actions to types of users. Thanks to Richard J at Oxygen Digital for the bug report.
- Fixed the sort by Bullhorn ID in the job listings page in admin.
- Added expiries to some transients. This will aid WordPress in managing database size. Some transients intended to be permanent are now cleared on plugin deactivation.
- Rewrote the developer templating function matador_the_job_bullhorn_id() and matador_get_the_job_bullhorn_id() to fix a bug where the function would always return a zero (0). The functions cast the output as an integer value, as is expected, but used to find the value by calling the matador_the_job_meta() function, which through a filter, prepending an octothorpe symbol (`#`) which caused the integer casting to always result in a zero. A new internal function was added to ensure that when we want just the number, the octothorpe isn't added and the security feature for casting the value as an integer doesn't cause unexpect behavior.
- Fixed an issue where if a remote call to Bullhorn produced no job results, Matador sync would stop, and not complete job delete actions for expired jobs.
- Fixed a bug causing Candidate Application Confirmation emails to not send in specific uncommon situations.
- Fixed a bug causing the Candidate Application Failed email to not send in all situations it should.

Internationalization:

- Fixed a handful of errors related to out-of-order arguments for contextual translation strings in the Campaign Tracking tool code, which made them untranslatable. All strings in this code will now be translatable.
- Fixed a handful of missing text domain errors preventing the translation of some strings related to the Google Indexing API help page.
- Fixed a misspelled text domain resulting in an error string being unable to be translated.
- All line breaks removed from translatable strings. This made it confusing and at times impossible to complete some translations for longer strings. We initially put these in the code to make it more readable from our side without realizing how much more difficult it would make translations. Sorry!

## 3.6.4

Features:

- Extending a feature added in 3.6.0, if a job ID is accessed directly via either external ID scheme (ie:  /jobs-page/1234 or /jobs-page/?xid=1234) and the job does not exist on the site, a sync to Bullhorn will be fired off. This is to address issues related to Bullhorn-based real-time XML feeds that present a Matador URL prior to the resource being created in Matador. In some cases, either a user, but more commonly a 3rd party aggregator, would try to access the resource, but be returned a 404 Error: Not Found. Now, if a job posting is not found, this will trigger a sync and ideally will result in the resource becoming available.
- Added filter 'matador_the_jobs_description_allowed_protocols' to allow the permitted HTTP protocols in imported job descriptions to be extended beyond WordPress's core allowed HTTP protocols. This can be used to expose your site to exploitation and should be used with absolute caution, however can be used to allow data:// and svg:// protocols in descriptions.

Bugfixes:

- Fixes issue causing employmentType in Structured Data (used by Google for Jobs Search) to not present properly in certain cases, especially when the Bullhorn data is customized. Thanks to Nishi B. from Beach Head for the bug report.
- Fixed a backward compatibility issue affecting some users of PHP 5.6.x. We apologize for the issue. Please note, PHP 5.6.x is no longer receiving security updates and is 50% slower than PHP 7.2, the current minimum supported version of PHP. Matador will continue to support PHP 5.6.x but new features will not load for users of less than PHP 7.2.
- Fixed issue affecting iOS Safari during Matador Campaign tracking load. In iOS Safari, window.external is not defined, which threw a Javascript error
- Fix issue where some API calls on certain server configurations would fail due to an extraneous forward-slash.

## 3.6.3

Features:

- Adds automatic detection of the "ALLOW_PRIVATE" entitlement on the candidate object. Application syncs that encounter a Private candidate will check if the API user can modify them, if not falling back to old Private Candidate routines, if so allowing the sync to carry on as normal.
- The "Sync this Job" button is automatically removed for sites that utilize developer filters that disable adding/updating jobs on a sync.

Bugfixes:

- Improved the behavior of "Sync This Job" button. Will now always sync/overwrite job data regardless of whether job was recently updated at Bullhorn.
- Improvements to existing Private Candidate application handling (when "ALLOW_PRIVATE" is false). Thank you to Nishi B for the heads up.
- Fixed an issue affecting some web hosts, including Windows-based web hosts, when loading a 3rd-party code library. Thank you Tony S for the tip.
- Fixed issue where the consent object's "name" wasn't being properly auto-detected on some user's sites. Thank you Nishi B for bringing this to our attention.
- Fixed two uncommon issues encountered when importing options for checkboxes or select fields from a Bullhorn data source (generally when using Advanced Applications Extension). These were caused when type mismatches were created during conversion of data to/from arrays in PHP/Matador and JSON/Bullhorn.
- Fixed a "typo" in a settings option. A form setting description referencing a Bullhorn job order field name was incorrect even though the setting label and setting values were as intended.

## 3.6.2

Bugfixes:

- Fixed an issue where the Matador Application form may not have always denied a form submission when Google reCAPTCHA was not filled out, resulting in an on-screen error message for applicants. Thank you to Doug B for the help finding this one.
- Fixed a backward compatibility handler for versions 3.0.0 and 3.4.0. A filter introduced in those versions for developers to use to customize emails was deprecated in 3.6.0's big email-related code rewrite, but was given special handling for backward-compatibility into the 3.6.0 release. It was, unfortunately, not working as intended, resulting in some sites using the older developer filters to fail. Thank you to Nishi B for pointing this out.
- Fixed an issue where the content-type header for email was not being unset after a Matador email was sent. Though this was very unlikely to have caused any issues for users, its possible some email sent by non-Matador plugins that would've sent after a Matador email would've been affected. Now the content-type filter will be removed after a Matador email sends.
- Fixed an issue where Matador's Javascript wouldn't load in some rare cases. To ensure the lightest impact to load times, Matador Javascript is only loaded when needed. A rare case was discovered where the Javascript would not be loaded for taxonomy (i.e.: category, location) drop-down menus if the page also didn't use the [matador_jobs] shortcode or function or didn't have an application. Now the javascript will load during any appearance of the drop-down.

Internationalization:

- Fixed misspelled text domain for a translatable string, meaning it is now able to translated.

Inclusive Language:

Some phrases and terms used by developers have roots in speech that was originally oppressive or exclusive in nature. Not only are these phrases rooted in world in which we, Jeremy & Paul, do not support, but in fact they are less descriptive for a layperson than using more accurate phrases. In an effort to do our small part in righting these historical wrongs and improving the clarity in which we communicate, we are working to remove instances of this language from our projects. The following changes made it into this release:

- All uses of the term "API Redirect Whitelist" (as a noun) is now to "Allowed API Redirect List"
- All uses of the term "whitelist" (as a verb) is now "register".
- You willl now see phrases like "you need to register your uri to your Allowed API Redirect List" instead of "you need to whitelist your redirect URI" or "your redirect URI is not on the whitelist."

Note 1: We'd like to thank our partners at Bullhorn for supporting this change as they undergo similar updates to their own documentation.
Note 2: Our efforts to replace insensitive language in our project with inclusive alternatives is a work in progress. We will continue to make these changes in upcoming releases.

## 3.6.1

Bugfixes:

- Fixed issue on PHP 7.3 & 7.4 where Matador would cause a NOTICE error, which if WP_DEBUG was set to true, would print an error to screen and interrupt Matador. Please make sure your WP_DEBUG is set to false in production (live) as a general best practice and apply updates in a staging environment. Thank you to Samantha S for the tip.
- Removed duplicated code files in Matador Jobs Lite due to build process error.

## 3.6.0

Features:

- Added support for Bullhorn's "Consent" Tab (customObject). If "Require Applicant to Agree to Privacy Policy" setting is on and Matador can detect the presence of the Consent custom object on the Candidate object, Matador will add consent data during Candidate create, update, and submission. In most cases, you will need to make no changes to your site to take advantage of this feature provided the object has been configured on your Bullhorn account. (Note: due to a bug, this feature may not have worked fully until 3.6.3)
- Added Schema/JSON+LD support for "Work from Home" jobs. Basic support is enabled automatically when "onSite" is set to "No Preference" or "Off-Site". If your company uses other terms to refer to "Work From Home" in your Bullhorn, you can identify these via the filter 'matador_bullhorn_import_telecommute_types'. Advanced support requires further configuration. Schema/JSON+LD support for "Work From Home" will result in job searches for the same country (or state) of the hiring organization (employer). If you'd like to narrow or widen this, you can assign custom fields in your Bullhorn Job Listing and Matador will import these. They are "type" and "value", where type may be, "COUNTRY" and value will be "USA". Use filter 'matador_bullhorn_import_location_requirements_fields' to assign these.
- Added alternate URL schemes to support other integrations. Jobs can now be found by appending the remote job id (ie: Bullhorn ID) to the jobs base URL. IE: if jobs exist at your-site.com/gigs/ and you have a job ID on Bullhorn of 1234, then your-site.com/gigs/1234 will redirect to its human-friendly URL, eg: your-site.com/gigs/job-name-1234. This is to better support 3rd party integrations, eg: with Indeed. Jobs can now also be found by appending a query string to the jobs base URL with the argument of 'xid'. IE: if jobs exist on your-site.com/gigs/ and you have a job ID on Bullhorn of 1234, then your-site.com/gigs/?xid=1234 will redirect to its human-friendly URL, eg: your-site.com/gigs/job-name-1234. For forward compatability with future support of additional job boards, you can include an additional argument of 'xsource' to verify the external source, ie: your-site.com/gigs/?xid=1234&xsource=bullhorn.
- Completely new Email-related codebase. Settings allowing you to set the default "from name" and "from email" for Matador-generated emails. New "Default Recruiter" email setting. Allows you to determine a recipient for the recruiter email when the job has no assigned users and/or the application isn't tied to a job. Mustache Templating added to email templates, to simplify templates.
- A number of improvements to the sync routine of Matador Jobs. Jobs are now not updated unless they've been updated since the last sync, improving performance by up to 70%!
- Matador's JSON+LD support is now properly merged with Yoast SEO's (WPSEO) plugin's use of the single graph.
- Added "Single Job Refresh" action to the job. Visit the job page in WordPress Admin and click on the button to refresh it immediately from its Bullhorn record without requiring a full job sync.
- Added the whitelist URI to the Connection Assistant tool, so it can be referenced without doing a reset.

Bugfixes:

- In the default template to output a select or multiselect field (via shortcode or function) for a taxonomy (eg: category, location) the field was named improperly when the multiselect option was set, resulting in the field values not being formatted properly and search results from the subsequent form submission were incorrect. This is fixed so that when a multiselect flag is set, the selected options will now properly pass values to the POST or GET request. Thank you to Emily B. of Integrity Locums for the bug report.
- Fixed an issue in Matador on PHP 7.3 where a matador_jobs()/[matador_jobs] function/shortcode argument was handled during processing in such a way that an error was raised PHP 7.3.
- The matador_application()/[matador_application] function/shortcode would not recognize Bullhorn or WordPress id passed via querystring. This is an edge case implementation of Matador designed for third-party form systems, but we made sure we can support it as well.
- In a rare instance, a custom theme's style rules could make the hidden file input field still display but with graphical error. To ensure this doesn't happen, additional CSS rules were added to make this less likely to occur, but note that custom theme CSS can always override ours, and sometimes things unexpected occur.
- When certain SMTP or other mail sending plugins were used, they may have encountered errors with duplicates of the same email being in the "to" field. The email generating code will now remove duplicate email addresses in any given field (to, cc, bcc, etc).
- Fixed issue where certain PHP versions (7.3, 7.4) could throw an error during application processing and incorrectly reject an application form submission.

Developer:

- Add support for select option groups in custom form fields by nesting arrays of options within the options array. Only supported via customized fields, as Bullhorn does not provide data in this structure.
- Added template for hidden type application form fields.
- Added filter matador_bullhorn_candidate_get_candidate_fields to modify fields retrieved during an existing candidate edit. Please see documentation block for notes and warnings.
- Added action matador_import_before_save_job_location and replaced matador_save_job_address with matador_import_after_save_job_location to assist users in creating custom experiences with location data.

Internationalization:

- Added French (Canadian) Translations File

## 3.5.7 & 3.5.8

- No changes in this version, but a version number increment was created to correct an error we made in uploading the wrong version of Matador Jobs Lite to the WordPress.org Plugin Repository.

## 3.5.6

Bugfixes:

- Added 'Content-Type:application/json' headers to all Bullhorn calls, thus modifying our API calls to match the changes made in the Bullhorn API specification in mid-December 2019. This fully resolves the issue discussed in the 3.5.5 release.
- Fixed an issue causing unintended printing of the Job Info or Job Navigation blocks when using matador_get_the_description() and related functions. Unfortunately, some current users may rely on the unintended behavior that was fixed, so therefore the changes will not be applied until users complete an upgrade confirmation and/or when version 3.7.0 releases.
- Fixed an issue where the query results and pagination navigation for the shortcode and matador_get_jobs() function was not working when deployed onto the front page of a site. This was due, in part, to how WordPress handles pagination in general on the front page.
- Fixed an issue where a developer's public function (from template-functions.php) required an argument even though documentation said it was optional. Argument is now optional.
- Fixed an issue created in 3.5.0 where the 'backfill' argument of the [matador_jobs] shortcode/matador_get_jobs() function would not work as intended.

## 3.5.5

Bugfixes:

- Fixed an issue where application form fields of the select multiple type were not getting validation attributes during render, and thus being skipped by client-side validation.
- Fixed another issue around "skills" being parsed by the resume parser were still causing sync failures (see 3.5.4 release notes for earlier handling).
- Improved handling of errors around the Candidate update routine for when an application is submitted and Matador can find a matching candidate in the Bullhorn list.

Note:

- An issue of unknown origin, but possibly originating from the mid-December Bullhorn update, is causing all API calls that updating existing candidate records to fail. Matador is currently unable to update an existing candidate. This update contains improvements, however, to our error handling of errors of this type, as well as it gives Matador permission to skip the candidate update and finish the job/web submission and file uploads for the application.

## 3.5.4

Security:

- Improved sanitization for search query terms. No issue or exploit was found or used with malicious intent, but we felt we could be stronger.
- "Message" field in the application was once allowed to submit HTML, but now will strip HTML. This was previously permitted under the assumption that users would want to use the field for an HTML-resume. We properly escaped unsafe HTML, and no exploit was used by a hacker to break into a site. That said, this field was overall not being used for HTML resumes while spammers were able submit content with clickable URLs pointing to unsafe destinations, representing a security risk to recruiters who might click those links. So all HTML tags will be removed, and should a spammer submit an unsafe URL, the full url will be presented, making it easier to spot unsafe submissions. Should you need an HTML-accepting field, use a custom application fields to accomplish this, and make sure to use proper HTML escaping for your security. As always, be careful with URLs submitted by users.

Features:

- Added two new filters and replaced one via deprecation.

Bugfixes:

- Fixed an issue related to application processing where the setting for background processing was not working as intended. No users encountered any problems with this, however.
- Fixed an issue where a name submitted with multiple white spaces in the compound name input field could cause an issue with processing an application and fail during save and/or fail to find a valid existing record (thus creating a duplicate). Matador will now remove all instances of multiple whitespace and convert all to a single non-breaking space, which allows for our compound name processor to work as intended.
- Fixed an issue where an error would interrupt candidate save when certain resumes parsed by Bullhorn returned an unexpectedly formatted skills object. The skills object is now handled for all its possible combinations, and the candidate save can complete.
- Fixed an issue where security escaping was too strong for certain configurations of the search form, resulting in those forms not working as intended.
- WordPress Job Manager integration did not use Matador's JSON+LD integration, yet settings for it were still being offered to users of it. These are now removed to limit any confusion.
- WordPress Job Manager integration did not have access to new settings added in 3.5.0 around Matador's email notifications. They were added for those users.

Misc:

- Removed the WEST USA 50 cluster option from the datacenter options. Truth is, you can log in via any cluster, though some are indeed faster. Meanwhile, every attempt to log into West USA 50 failed. Since no users appear to be on West USA 50, we've never been able to test why. We are still investigating this and will restore the option when an appropriate fix is identified.
- Improved description of the settings options around Application Processing.
- Improved documentation blocks for the template-functions.php file, which is most used by theme and integration developers.

## 3.5.3

Bugfixes:

- In version 3.4.0, we included code to allow a user to build a custom form that let candidates select options from checkboxes or select/multiselect fields with values from one of Bullhorn's "to many" associations, eg: "category" or "skills". No users expressed interest in using the feature until recently. Upon finally having a real-world use case, we were able to work with our new users to fix some recently discovered bugs around this feature, and included them in this update.
- We recently learned that a Bullhorn user can set an existing candidate to a "private" status, which prevents Matador from updating the record or creating new Job Submissions. While we cannot override this protection granted by a "private status", we were able to create new error handling to properly notify a user when an applicant with a private status tried to apply to a position.
- A Matador application form generated dynamically (ie: inside a pop-up modal) requires a Javascript insertion of a hidden form field in order to associate the job the candidate is applying to. Previously, this hidden form field required the job's WordPress ID. Now, the association can also be made with the job's Bullhorn ID.
- We discovered and fixed and error that could result in recruiter notification emails failing to send when an "additional/backup email address" was not set.
- We were notified of an error where multiple comma-delimited taxonomy terms passed into the $$taxonomy argument for the [matador_jobs] shortcode or matador_jobs() function would not properly query the multiple taxonomy terms. Thanks to Eric C. of Visual Notion for bringing this to our attention.

Internationalization:

- We discovered and fixed an issue causing two text strings that should be translatable to be not translatable.
- We discovered and made translatable two text strings previously untranslatable.
- We updated the Netherlands Dutch translation file, following feedback from our users.

## 3.5.2

Bugfixes:

- Fixed javascript issue where a site that loads jQuery.validate() extensions will conflict with Matador's implementation of that library. Conflicts were resolved by name spacing the functions. Thank you to Lee H for the report.
- Fixed an issue where DOM manipulation could allow an application form to submit without the required acceptance of the Privacy Policy notice and fire an unrecoverable error during processing. In order to fix this, the offending user will now be returned to the form page to re-try. Thank you to Lee R for the report.
- Fixed an issue where an invalid email submitted in an application will be saved as an empty value to Bullhorn after a security cleans it.
- Fixed bug where admin notices reporting a sync failure would not be removed when a successful sync completes, and would stack up. Now only one will show if needed, and all will be removed upon a successful sync.
- Fixed an issue with the Matador Jobs shortcode and function where, in certain instances, an array key would be unset even though the function requires it later on. This was by design, so we added a check for the unset variable before we try to reference it.

Other:

- Fixed a spelling error in a form field label.

## 3.5.1

Features:

- New filter matador_data_source_status to allow a user to control the 'status' value of new candidates and job submissions. Settings currently allow you to set these as "New Lead" or "Job Submission", but using the filter you can use any number of values.

Bugfixes:

- Fixed a bug where a globally namespaced function was being called within a namespaced class causing an error in certain PHP versions.
- Fixed a bug where the Leads object (controlled by Leads All-Access Add-On) was not receiving data from the Candidate Source Tracking tool.
- Fixed a bug where Recruiter emails that had no post content were failing.
- Fixed a bug where CSS flex was being applied to the search form container and search form form object due to both having the same class name. Changed the class name of the Search Form enclosing <div> from 'matador-search-form' to 'matador-search-form-container'. The class name 'matador-search-form' was being used on both the <form> and wrapping <div> tag going back to release 3.0.0. Our new CSS in 3.5.0 for flex display of the search form was breaking on some sites. We closely considered how to fix this, as there is no fix without causing a "breaking" change. This is our solution, but please check your sites in case your CSS needs an update.

## 3.5.0

Tested Up To/Minimum Requirements Updates:

- Tested up to WordPress version 5.2.3
- Tested up to PHP version 7.2.18
- Now requires PHP version 7.0+

Major New Feature: Candidate Traffic Source Tracking

- Matador Jobs Pro now attempts to track and pass along campaign (traffic) data into the 'source' field of the Candidate and JobSubmission entities.
- When a user visits the site, Matador will attempt to create a cookie named matador_traffic that will store data from the referral or utm_* query string values.
- When referrer data is used, Matador will compare the referrer against a list of known social networks and search engines and designate the source as "social" or "organic" if appropriate.
- Additionally, when Matador builds a Job Application form, it will perform a similar set of checks and pass generate hidden form fields with the values.
- When saving an application, Matador will look for the presence of a cookie first, or hidden data from the form related to traffic second, and save in the application database record campaign data.
- When syncing an application to Bullhorn, Matador will append the 'source' field with campaign information.
    - Up until this point, your source would be "[WEBSITE NAME] Website". It will now look like "[WEBSITE NAME] (Google Jobs Apply/Organic/Google Jobs Apply)" or "[WEBSITE NAME] (Bing/Organic)" or "[WEBSITE NAME] (Email/April Newsletter)"
    - Bullhorn limits the source field to 200 characters for Candidates and 100 characters for JobSubmissions. To prevent syncing issues, Matador will truncate your source to that limit. If you use especially long campaign names/values, you could reach the limit easily.
    - Therefore, to give you more space to work with, Matador no longer appends ' Website' following your name.
    - If your website name is very long and causing your campaign data to be truncated often, you have two options:
        - Return true to 'matador_campaign_tracking_source_reset' to fully omit your website name, ie: "(Google Jobs Apply/Organic/Google Jobs Apply)".
        - Shorten your website name via the filter 'matador_data_source_description', ie: pass 'ACME' to the filter to change 'ACME Staffing and Recruiting' to 'ACME', a savings of 24 characters--almost 25% extra space for the JobSubmission source.
- Because UTM_* values can be set by anyone with limited knowledge of the internet, you may optionally create whitelist and check values against the whitelist at the time an application is saved so only pre-determined values can be passed to Bullhorn.
    - Return true to the 'matador_campaign_tracking_check_{$field}_against_whitelist' filter to turn on whitelisting for the field. Replace {$field} with the field you'd like to whitelist, ie: 'campaign'. You must also return an array of values to the 'matador_campaign_tracking_{$field}_whitelist' filter.
- A developer can further access the campaign data and include behaviors to save the items to customXY fields for a Candidate, add notes for the Candidate, or add comments to the JobSubmission. This is advanced and you should check with Pro Support for assistance.
- You may turn off this new feature by passing false to the filter 'matador_load_module_save_campaign_data_to_bullhorn'
- Because this feature does not add new cookies but does increase tracking of certain data of your users, you should update your Privacy Policy as is appropriate prior to updating Matador.

Features - Job & Job Imports

- Added the 'job_general_location' meta field as a new option for the 'matador_import_location_taxonomy_allowed_fields' which determines the value used in the Job Location taxonomy.
- Client Corporation data is now available for inclusion on job listings via a get_post_meta() call.
- Choose whether to determine the job category from the 'categories' in the Job Order (now intended by Bullhorn to be for internal use only) or the new 'published category' set during job publishing. Includes filters to override setting.
- Matador now adds two small bits of data to your job: Source and Source ID. One is a future looking feature, meant for a day that you can use other platforms in addition to Bullhorn on your Matador-powered website. The other is a copy of the job's remote source ID. Now, you can use filters to safely modify the Job ID's shown to the public (ie: adding 'BH' in front of them) without affecting Matador's ability to run. These are created with the job during import, so it will also help to prevent duplicate jobs issues caused when some job meta saves fail.
- Optimized an aspect of the import routine to reduce overall system memory use.
- Added a new routine to remove duplicate entries when they occur, often due to an error. Monitor your logs for notice of duplicates being found and removed, as this can be a sign of an issue elsewhere.
- Added arguments $wpid and $field to filter 'matador_import_meta_to_taxonomy_value' to extended its usefulness and functionality.

Features - Applications & Application Sync

- Application form validation now checks that uploaded files are under 1 mb / 1024 kb and are a valid extension.
- Applications from existing candidates can now trigger changes to the candidate's first name, middle name, name prefix or name suffix. This may occur if the candidate existed previously but a resume provided additional information.
- Added filters to support customizing the value saved Privacy Policy Acceptance fields, introduced in 3.4.0. By default, the values are Date/Time strings, but can now be updated to any string value, i.e.: "Yes", "True", or "1", using 'matador_submit_candidate_privacy_policy_field_value_on_create', 'matador_submit_candidate_privacy_policy_field_value_on_update', or 'matador_submit_candidate_privacy_policy_field_value'. Props to Scott R. for the feature request.
- Added 'Published Contact' as an option to the "Send Recruiter Email" setting.

Features - Template

- Added 'paginate' parameter to matador_jobs() and [matador_jobs] (and [matador_jobs_*]) shortcodes. It defaults to true to support backward compatibility. Pass "false", "off", or "no" to turn off page navigation when the job query can produce more results. (This may be considered a bugfix to some, depending on how you used the original shortcode.)
- To provide more intuitive parameters for our [matador_jobs_*] shortcodes, we renamed 'limit' to 'jobs_to_show' (to 'jobs_per_page' for the function) and 'minimum' to 'backfill'. Backward compatibility is in place to make sure old implementations will still work.
- Matador Search form fields are now wrapped in a <div>. Previously, taxonomy drop-downs were wrapped while buttons and text fields were not. This was incidental, a result of how taxonomy drop-downs were included. Now, all fields will be wrapped in a div allowing developers/designers greater control via CSS.

Bugfixes:

- Fixed an error where the Jobs Structured Data would not honor the setting '"Hiring Company" Data Source' in certain cases, resulting in the Hiring Company Name, and not the Agency Name, being included in the structured data in certain cases. Props to Phil V. for the bug report.
- Fixed issue where the new [matador_jobs_listing] and [matador_jobs_table] shortcut shortcodes were doing each other's behavior.
- Fixed an issue where the Bullhorn API would return a non-breaking warning when Matador updated an existing candidate in Bullhorn, which generally happens when an applicant applies for more than one job in the same 2-year period. This was not causing any issue at this time, but could in the future.
- Fixed issue where taxonomy drop-down menus with method set as "link" would fail to trigger page reload automatically.
- Fixed an issue where applications that accept data via a select or multi select, the email (and notes) on the submission displayed the form value, not the human-friendly form label.
- Fixed an issue where large resume file sizes (larger than 1mb) would cause a Bullhorn Candidate/Submission sync to fail. Now, sync will continue, but may fail completely later on if not enough user data was required by the form.
- Fixed an issue where job description would not properly display when using the [matador_jobs] shortcode or the matador_jobs() template function outside of a standard loop.
- Fixed an issue and generally refactored how uploads are stored on the server to fix issues when a user hosted on a Windows IIS server environment.
- Fixed an issue affecting the frequency of which local application data was automatically deleted.
- Fixed an issue causing some intended HTML to be escaped, causing a visual error, when using specific settings with some Matador Shortcodes.

Other:

- Added support for new Bullhorn regional data centers.
- Added styles for Matador Job Alerts Extension updates.

## 3.4.1

This release is a maintenance release to support final features included in WordPress 5.0, 5.0.1 and 5.0.2, as well as fixes bugs.

- Adjusted a few calls where wp_kses_post() was used when it wasn't necessary. Backward incompatible changes to WordPress 5.0.1 required this.
- Added filters matador_application_note_line_label and matador_application_note_line_item to modify how "note" lines are saved in the application.
- Moved JSON_LD injection from above the Job markup and into the <head>. May also have fixed some JSON LD reading/saving issues with Google.
- Added setting to allow user to define a page (ideally using shortcodes) as the jobs home page. Note: you cannot set the "Home" page as the jobs home page at this time without a possible issue around search results.
- Added tools to support handling issues some of our users were experiencing with enabling Google Indexing API.
- Update "tested up to" to 5.0.2

## 3.4.0

Big New Features:

Matador Jobs 3.4.0 is the biggest update to Matador yet. Its patch notes will be huge and confusing and incomplete. For this reason, please follow our blog and our help files to learn how to use the updated Matador! Here are the big deal updates:

- We now support the Google Indexing API. This matters, because it allows your site to directly notify Google whenever a new job is added or a job is removed. This is a partial support for this feature, as we'd like to soon support updates to jobs in this notification as well. To turn on Google Indexing for your jobs, you will need to get a Google Indexing API keyfile. Look in Settings -> Job Listings (tab) -> Jobs Structured Data (section) for the new settings, and a link to our help website on how to get this.
- Applications now can save the IP address of the applicant. Further, the IP as well as the date/time of the submission, can now be submitted to the candidate's record in Bullhorn as part of the candidate save. This is useful to track the most recent acceptance of terms of service and privacy policies, for example, as well as provide data points for internal analytics. See the more detailed patch notes on how to use this.
- Jobs now have a default "information" header, aka the "meta header" after the title and before the description. This will present (by default) the Job's location, type of job (ie: contract, permanent), and the Bullhorn Job ID. This is easy to customize with a little code, but styles are only applied for default setting. Existing users will need to enable this feature by turning on a setting in their settings.
- Jobs also now have a default set of navigation buttons at their end, after description. These are contextual, so will change based on your settings and depending on which page you're on. These are added to all jobs by default, so check your site to see you like the styles.
- A majority of the templates, template actions and hooks, and more have been simplified. Actions and hooks now have a second parameter called "context", which can be used to limit their scope. Where in the past, for example, the "jobs listing" template had two actions for 'before_jobs', 'matador_before_jobs' and 'matador_before_jobs_listing',now it just has one 'matador_before_jobs' with the passed 'context' of 'listing'. The action is the same for all templates, but it can be limited using the 'context' parameter. This will make customizing templates easier, but may cause issue with current custom templates and actions.
- Many, many new template functions were added to the global namespace for theme developers to access, making the customization much easier!
- New shortcut shortcodes `[matador_jobs_listing]`, `[matador_jobs_table]`, and `[matador_jobs_list]` to make it simpler to use them and provide more intuitive default settings.

Additional Features/Enhancements:

- When redirected to a job page after a successful application where a confirmation is shown (as opposed to a Thank You page), the application form will no longer show, which helps avoid confusion for the user.
- Applications now save the IP address of the computer that submitted the form.
- The IP address of the computer that submitted the form can now be submitted to the corresponding new or existing candidate record following a Candidate Submit routine by Matador. IP addresses are saved to both a "on submit" and "on update" field, and to tell Matador which custom fields on the Candidate record to use, assign them with the matador_submit_candidate_ip_field_on_create and matador_submit_candidate_ip_field_on_update filters, introduced in this version. While we recommend you use these filters to prevent any issues caused by changing these values accidentally, a free Extension was created to make an admin setting for this also if you are unable or uncomfortable writing a filter.
- If a site has the "Require Applicant to Agree to Privacy Policy" setting turned on, when Matador sends the application to Bullhorn, you can now designate a text or date custom field to save the date and time of that submission in order to track the initial and most recent acceptance of your Privacy Policy to their candidate record. Assign which fields to use with the matador_submit_candidate_privacy_policy_field_on_create and matador_submit_candidate_privacy_policy_field_on_update filters, introduced in this version. While we recommend you use these filters to prevent any issues caused by changing these values accidentally, a free Extension was created to make an admin setting for this also if you are unable or uncomfortable writing a filter. You may additionally customize the date format by using the matador_submit_candidate_privacy_policy_field_format, but this only applies when you are using a custom text, and not a custom date, type field.
- Form validation error messages can now be customized by a developer new matador_application_validation_error_{$error} filter. See `includes/class-scripts.php` for a list of errors that can be filtered.
- Option to modify the URL slug format of each job. Options are limited to three possibilities, but a filter was added to provide users methods to make more complex URL slugs. Paired with an additional field import, a user can even set the URL slug to be generated from a job custom field, among other things.
- Previously, jobs without an end date in Bullhorn would result the in the 'validThrough' field in the structured data--what Google for Jobs uses--to be blank. We found that this causes Google for Jobs to make that job a lower priority. Matador will now set a date one year from the 'job posted' for the 'validThrough' field. Note that if your firm offers ongoing positions, it is important you set an impossibly long job end date in Bullhorn to make sure your job always has a 'validThrough' date in the future.
- Added $data parameter to the 'matador_data_source_description' filter. This allows developers to access the object and any custom fields to use to modify the source. This object is different in each context, so filter functions should check for context prior to assuming object structure.
- Adds new field to job, called `job_general_location` which is customizable with the new `matador_import_job_general_location` filter. This is the field used by the default meta header.
- When an Application is deleted, either manually or automatically, prior to its delete, associated files (resumes, etc) are now also deleted. This should free up storage space on your server and close a possible privacy or security risk should server settings allow those files be available to the internet.
- Adds empty index.php files in Matador uploads folders to provide security for files when a server has Apache directory indexes turned on.
- Adds new actions 'matador_add_job', 'matador_update_job', 'matador_save_job', 'matador_transition_job', and 'matador_delete_job' to give developers easier access to changes in job posts to hook into.

Bugfixes:

- Fixed an issue where an appended Application Confirmation message would not show properly after a job application.
- Fixed an issue where pagination was not presented for shortcode-based jobs lists.
- Fixed an issue where an error was printed to screen, instead of logged to the logs, during a rare login-related issue with Bullhorn.
- Disabled "toggle" type admin settings will now show styles that communicate its disabled status.
- The deprecation notices were not showing properly for logged in users. They now will. Pay attention to them! Update you site accordingly.

Localization:

- Extended Localization options to all form validation error messages.

Deprecation:

- The pre-3.0.0 deprecated shortcodes will be removed from Matador in our next major version in January to March 2019. Please make sure you've fully migrated to the [matador_*] shortcodes.

## 3.3.7

Features:

- Added a bulk Application Sync button to the applications view. Will re-try all failed applications from the issue
  addressed in 3.3.6 and any failed applications for the last two weeks.
- Added a filter matador_application_batch_sync_allowed_statuses to allow you to extend the statuses included in a batch
  sync. This may come in handy in the future when we expand the statuses assigned to applications that fail.
- Added a filter matador_application_batch_sync_duration to allow you to extend of duration applied in a batch sync. If,
  for example, you want to apply a batch sync to jobs older than two weeks, you can do this via this filter.

Bugfixes:

- Fixed spelling/grammar error in the application processing overlay.
- Added escaping functions to prevent errors encountered during an application sync when Matador checks for existing
  candidates. Candidates with names that included a single quotation mark/apostrophe caused the search to be badly
  formatted and thus present an error, which in turn caused the application sync to fail altogether.

## 3.3.6

Features:

- Enabled sync re-try for applications with the status of "Unable to sync".
- Updated messaging around reasons that an application sync may fail.

Bugfixes:

- Updated the way a Bullhorn request was being made that was causing it to fail after the September 2018 Bullhorn ATS
  software upgrades.
- We are observing an issue on some Bullhorn users' accounts where a Bullhorn resume parse may return a badly structured
  candidate object that later results in a failure when Matador tries to create a candidate with that object. We have
  included a temporary work-around until we can help our partners at Bullhorn resolve this issue.
- Fixed an issue where a "Re-try Sync" routine on an application would result in an HTTP 430 error under certain caching
  circumstances.

Localization:

- Updated included Dutch (Netherlands) localization files.

## 3.3.5

Features:

- Added filters matador_import_job_description and matador_import_job_title to potentially override, append, or prepend
  a job title as it is imported from Bullhorn.
- Added filters matador_import_job_description_field and matador_import_job_title_field to use a non-standard field for
  job title or description. Standard fields are "title" and "description" or "public description".
- Updated the HTML tag filter on import so that job descriptions with images and videos will now import properly.

Bugfixes:

- Various changes were made around user-initiated syncs that fixed a few issues. Now, only one sync can occur at a time,
  which prevents a rare problem caused by two syncs running concurrently and creating duplicate jobs that Matador is not
  able to automatically expire. Also, now, each sync is performed fully in the background, which both allows an admin to
  continue other work on their site while the sync processes and also makes it so they're never presented with a browser
  timeout. Various notifications were added to explain these features so admins understand what is going on.
- Various display issues were fixed in the Application CSS to provide a better, more reliable base user experience.
- Fixed an issue that caused links to application pages, when linking to a custom page, to not work as intended (most
  often used in Lite installations).

UI:

- Added a toggle-type on/off switch to the UI for settings. Changed several settings where it was appropriate to this
  new style with the hope that it will make the experience better for users.

## 3.3.4

Bugfixes:

- Fixed an issue where the an anti-spam honeypot related function was named a protected function name causing issues in
  some versions of PHP, resulting in a failure when it should be valid.
- Improved Matador's error handling for invalid candidate object submissions to Bullhorn. At this time, there appears to
  be an error with Bullhorn's resume processor returning invalid candidate objects, which caused Matador to log an
  error. Unfortunately, Matador determined this was a recoverable error, which meant that it retried a failing process
  on each sync, a waste of system resources.
- Fixed a minor issue where the site name wasn't being accessed properly in Application email builder, which was used to
  generate Email Subjects when applicants applied in a form with no job assigned.
- Fixed an issue where a data attribute on the Apply button was being filtered by security features.
- Fixed an issue where an undefined privacy policy in WP 4.9.6 would result in a link being generated that had no url.
  Now the link isn't included if a privacy policy page is not set on WP 4.9.6+.
- Fixed an issue where rewrite rules were not being refreshed on upgrade/install of Matador Jobs.
- Fixed a minor issue where a hidden field in the application had two fields with the same ID attribute, which is
  improper HTML syntax, which may have caused some custom JS to function incorrectly.
- Fixed an issue where the the privacy_policy_opt_in was being appended to the "message" of the applicant confirmation
  email and in the "notes" of the Bullhorn Candidate record.

Developer:

- Filter 'matador_recruiter_email_header', introduced in 3.0.0, was deprecated and replaced with
  'matador_application_confirmation_recruiter_from' to best match the new naming conventions.
- Filter 'matador_recruiter_email_recipients', introduced in 3.0.0, was deprecated and replaced with
  'matador_application_confirmation_recruiter_recipients', to best match the new naming conventions and now accepts
  additional variable, $local_post_data.
- Filters 'matador_recruiter_email_subject' and 'matador_recruiter_email_subject_no_title', introduced in 3.0.0, were
  deprecated and replaced with 'matador_application_confirmation_recruiter_subject', to best match the new naming
  conventions and now accepts three inputs, $subject, $local_post_data, & $job_title.
- Filter 'matador_applicant_email_header', introduced in 3.0.0, was deprecated and replaced with
  'matador_application_confirmation_candidate_from' to best match the new naming conventions.
- Filter 'matador_applicant_email_recipients', introduced in 3.0.0, was deprecated and replaced with
  'matador_application_confirmation_candidate_recipients' to best match the new naming conventions and now accepts
  additional variable, $local_post_data.
- Filters 'matador_applicant_email_subject' and 'matador_applicant_email_subject_no_title', introduced in 3.0.0, were
  deprecated and replaced with 'matador_application_confirmation_candidate_subject', to best match the new naming
  conventions and now accepts three inputs, $subject, $local_post_data, & $job_title.

## 3.3.3

Bugfixes:

- Fixed an issue where the 'Sync Now' button on the Admin Job Listings Page didn't show if there were no jobs in the
  database, which is when we want and need that button the most.
- Fixed an issue where [matador_search] shortcode and matador_search() functions that included taxonomy fields were not
  working because the all option was passing a value of '_all' when the args were not set to ignore them.

Developer:

- Settings Sanitizer 'number_list' extracted from the Import by Client Extension and added to core.

## 3.3.2

Bugfixes:

- Fixed an issue where [matador_taxonomy] shortcode (and its shortcuts) or matador_taxonomy() function with the
  parameter 'method' is set to 'list' (which is the default) had poorly generated links that did not work.
- Fixed an issue where multiple versions of Matador, ie: Lite & Pro, would conflict with each other when both active in
  the same WordPress instance. Now, all versions can be activated, but whichever loads first in WordPress will be loaded
  until unneeded versions are deactivated.

## 3.3.1

Bugfixes:

- Fixed an issue where a site sending application notifications without having "AssignedUsers" or "Owners" checked could
  have applicants presented with an error.

## 3.3.0

Features:

- Added an anti-spam behavior to the Application form. You may need to update your settings by visiting Matador Jobs >
  Settings in your WordPress Admin, clicking on the Applications tab, scrolling down to "Use Anti-Spam Honey Pot", and
  setting it to "On".
- Added two features to prevent duplicate Application forms submissions.
    - First, applications will now have their submit button disabled after a user clicks the button and the client-side
      validation passes, allowing only one submission per click.
    - An overlay with a loading "spinner" will also be added over the form to give a strong visual indication to the user
      the form is processing. This may be styled with CSS.
- Added a 'hide_empty' and 'orderby' parameter for the [matador_taxonomy] shortcode and matador_taxonomy() function. Now
  you can choose to list categories, locations, etc even if they don't have jobs and you can choose how to order them,
  like, our favorite, by number of jobs in the taxonomy. This option now works on the alias versions of shortcode too:
  [matador_categories], [matador_locations], and [matador_types].
- Added a new allowed value for the [matador_search] shortcode and matador_search() function parameter 'fields'. It now
  accepts 'reset', and when passed, will add a Reset Search button to the output.

Bugfixes:

- Fixed an issue where the "show_all_option" parameter of the [matador_taxonomies] and matador_taxonomies() function was
  not always resulting in an "All Categories" like link added to the list.
- Fixed an issue where translatable strings were used in dynamic filter names and filter arguments in class
  Job_Taxonomies, which may have caused some sites using non-US English difficulty in customizing output.
- Fixed issue where templates moved/renamed in 3.2.0 were not given proper backward compatibility handling concerns that
  should've been in place before 3.2.0 was released. Apologies to all affected sites, and thanks to Andre, who reported
  the bug.
- Fixed an issue where if a site chose to leave the "Additional Emails to Notify" option blank for Application
  Notifications, the site Admin Email would be included. In the past, this behavior was default and correct, but not
  since 3.2.0's recruiter-based email notifications feature was released. Thanks to Jason and Rich for reporting the
  bug.
- Added a class .matador-screen-reader-text in CSS and applied it to all places where we add previously used the global
  class .screen-reader-text. This wasn't a per se 'bug', but it caused a lot of issues for sites whose themes did not
  implement the WordPress recommended class in the theme, resulting in sites that had extra text in awkward places and
  confused users trying to figure out how to remove it. That said, your theme should implement and use classes like
  .screen-reader-text to help make your sites more welcoming to users who are blind or hard of hearing, just from now
  on, we'll assume you don't.

UI:

- Matador developers are developers, so sometimes we don't explain things very well. We got feedback that the new
  settings around structured data in 3.1.0 were confusing and didn't make sense. We changed the order of the settings,
  revised or rewrote their descriptions, and hopefully made everything much easier to understand.

Accessibility:

- Added Screen Reader content to the [matador_search] and [matador_taxonomy] shortcodes and the matador_search() and
  matador_taxonomy() functions to improve readability.

Developer:

- Added a filter named 'matador_rewrites_taxonomy_has_front', which when returned false will disable the inclusion of
  the jobs slug before the taxonomy slug.
- Added filters named 'matador_rewrites_taxonomy' and 'matador_rewrites_taxonomy_$key', which allows modification of the
  'rewrites' array in the taxonomy declaration. Replaces deprecated filter 'matador_taxonomies_rewrites_$key'.
- Added a filter named 'matador_taxonomy_labels', which allows for manipulation of the 'labels' array in a taxonomy
  declaration. Does not replace 'matador_taxonomy_labels_$key'.
- Added a filter named 'matador_taxonomy_args', which allows modification of the whole $args array in a taxonomy
  declaration. Does not replace 'matador_taxonomy_args_$key'.
- Filter 'matador_bullhorn_source_description', introduced in 3.2.1, was renamed to 'matador_data_source_description'
  and is now applied to three variables, up from the original 1. A 2nd argument for the filter, which is optional,
  was clarified in documentation as the 'entity'. Warning: There is no deprecation handling for this change.
- Added an action and filter that run before the Application Handler begins processing raw data. The action,
  'matador_application_handler_start' fires immediately after nonce is verified and can be used to do further before
  processing verifications, like check a captcha or an anti-spam honeypot. The new filter,
  'matador_application_handler_start_ignored_fields' lets developers add fields that might have been added to the form
  for processing in the the aforementioned action be added to the ignored fields list, which ensures the processor's
  catch-all at the end of the form processor doesn't pick them up and include them in the job submission as a 'note'.
- Added a filter named 'matador_get_template_print_name_comment', which, when passed a true value, prints an HTML
  comment before the output of the template with the template's path. This will help developers determine which template
  is being loaded by Matador for easier template overrides.
- Added a filter named 'matador_locate_template_additional_directories'. This allows extension developers to add their
  template directories to be checked by Matador's template loader. The template loader checks these directories after it
  failed to find a template in core, so this won't override a core template.
- Added a filter named 'matador_locate_template_replace_default'. This allows extension developers to replace a core
  template with their own without taking away the important ability to override a template in the user's theme.
- Rewrote and simplified actions, filters, and the templates for the [matador_taxonomy] shortcode and matador_taxonomy()
  function. Templates were broken into parts for easier use and customization. Some actions/filters were deprecated in
  favor of new, more robust options. Deprecation handling was added for sites that implemented these old actions and
  filters.
- Rewrote and simplified actions, filters, and the templates for the [matador_search] shortcode and matador_search()
  function. Template was broken into parts for easier use and customization. Actions/filters were added to allow for
  easier customization.

Misc:

- Based on feedback acquired from a Bullhorn support ticket, modified the text of the Bullhorn Support email generator
  in the connection assistant "Callback URI" step to now include the ClientID. This is in case a Bullhorn account has
  more than one set of API credentials.

## 3.2.1

Features:

- Modified how "Notes" items are labeled when saved from an Application. Now should use the registered field's label
  instead of a label generated from the form field key.

Bugfixes:

- Fixed an issue discovered that caused "Messages" and custom fields to not be saved to the Bullhorn "Notes" for the
  candidate.

## 3.2.0

Features:

- New Template Helper matador_get_job_terms for getting a array of terms from 1 or all Matador taxonomies.
- New Template Helper matador_get_job_terms_list for getting a formatted string of terms from a job's taxonomy in
  various formats. Uses a new template 'job-terms-list.php' and introduces 6 new actions (matador_job_terms_list_before,
  matador_job_terms_list_before_terms, matador_job_terms_list_before_each, matador_job_terms_list_after_each,
  matador_job_terms_list_after_terms, and matador_job_terms_list_after) plus one new filter
  (matador_job_terms_list_separator ) to support customization.
- Added filter 'matador_bullhorn_source_description' to allow users to customize how Matador lists the "Source" of the
  job submission.
- Added filter 'matador_recruiter_email_subject_no_title' to allow for adjusting of subject sent to recruiter if not
  linked to a job.
- Improved the behavior of matador_is_current_term() to also return true when on a taxonomy archive page.
- New Template file for Admin Notifications when Bullhorn Connection needs user intervention.

Bugfixes:

- Fixed a major issue where certain candidate and recruiter notifications were not being sent when they should've.
- Added code to prevent conflicts when a vendor library is loaded by another plugin or theme after Matador loads. This
  changes makes existing conflict prevention methods more robust and fool-proof.
- Fixed bug where, when called directly, matador_the_job_field could throw an error if certain optional arguments were
  not passed.
- Fixed a bug where, in the default jobs-taxonomies-lists.php template, a class for the term markup was being made with
  the title and not slug, creating invalid HTML and not useful classes.
- Fixed a bug where, in Settings, a checkbox type settings wouldn't save when all checkboxes are unchecked.
- Fixed a bug where, when both a Candidate and Recruiter email were being sent the Recruiter email listed the job twice.

UI:

- Added the Bullhorn Bull icon to the "Manual Sync" button in settings, providing a visual cue to users that this action
  communicates with Bullhorn.
- Removed check marks next to checkboxes. Because that didn't make any sense.
- Revised wording around the "Classify Applicants" setting and added a long description explaining its impact on a
  Candidate and Job Submission, hoping to add further clarity to how the setting affects the workflow of various users'
  firms.

Misc:

- Added a (hopefully temporary) advisory to the Authorize step of the Connection Assistant to warn users of a known
  issue when logging in for the first time. In the future, we hope to resolve this issue with our Bullhorn partners.
- Moved templates for emails from /templates/ into /templates/emails. Renamed the templates. Some clients with
  customized email templates may want to double check if this impacted them, but given these templates were only
  available for all for less than two weeks, we feel safe making this adjustment now.
- Refined error logging messages during certain Bullhorn login attempts.
- Fixed spelling error on an Application Form Field
- Fixed spelling/grammar errors & formatting in Readme

## 3.1.0

Notice:

- This update will require a manual install. All Plus and Pro subscriptions and Pro Lifetime purchasers will receive a
  free manual upgrade by either Paul or Jeremy. The reason for this is that our plugin folder name will change to
  reflect a change-of-name for Matador Jobs Lite on WordPress.org. The folder name for "Lite" will now be 'matador-jobs'
  and the folder name for Matador Jobs Pro will be 'matador-jobs-pro'.

Features:

- Added new settings to support GDPR compliance, specifically the ability to require an acknowledgement of a Privacy
  Statement upon application, and the ability for admins to force the erasure of local candidate data. We will defer to
  Bullhorn's GDPR compliance tools to assist with final export of user data and erasure/anonymization.
- Jobs import now includes the email address of the "Job Owner" and "Assigned Users", and site admins can designate
  email notifications be sent to both the owner and/or the assigned users.
- Added numerous improvements and features to the Bullhorn API Assistant Wizard, including: a Client ID validator, a
  better Redirect URI validator, a fix to an issue caused by site transfers (like from staging to live) where the site
  wouldn't check for a new whitelisted Redirect URI until a cache expired up to 24 hours later, a check that determines
  if "Pretty Permalinks" were set, which is required for Authorization and caused some users confusion on fresh
  installs, a "skip assistant" option for advanced users which skips the Wizard and goes straight to the summary, and
  more.
- Added more interactive buttons in many UIs. A button now activates sync from the jobs listing page, a button now links
  to the Bullhorn job (for logged in users) from the job page, and a button links to the Bullhorn candidate (for logged
  in users) from the applicant page after the applicant is synced (and provided they are not deleted immediately).
- Added options surrounding structured data. Specifically, allows a site operator to choose whether to show base pay or
  not, and whether to use company data from Bullhorn or website data (name/url) for the Hiring Organization. The site
  operator may also now disable structured data, for instance in the case they want to run a low-profile board for
  internal uses.
- Added an admin notice when Matador cannot write its uploads folders (which prevents saving of uploaded files from
  applicants and data logging).
- Various performance improvements, including a rewrite of our settings page that speeds up Matador-related page loads
  by up to 3x faster.
- Added filter to allow for better messaging when an application sync status is null (possible in outside integrations
  like WPJM)
- Added filter 'matador_bullhorn_doing_jobs_sync' to allow for safe targeting of local and automatic post saves.
- Added action 'matador_bullhorn_import_save_new_job' to allow for actions based only on initial import of job.
- Added actions 'matador_bullhorn_before_import' and 'matador_bullhorn_after_import' to trigger behaviors around the
  import function.
- Various security hardening improvements.

Bug Fixes:

- Fixed a stubborn bug that was introduced in 3.0.3 that prevented automatic updates of Matador Jobs Pro.
- Improvements to Application Sync to prevent "Re-try" messages.
- Adjusted structured data (JSON+LD) to better match the spec.
- Fixed issue introduced in 3.0.4 where structured data (JSON+LD) saved during local changes (ie: in WordPress) was
  causing an error during remote change routines.

UI:

- A 're-check' button on Redirect URI step in Connection Assistant to reload the page and re-run the check, where
  formally users needed to reload the page.

## 3.0.5

Features:

- Ability to disable SSL Verify for sites with self-signed SSL.
- Added filter to modify the "WHERE" clause in Bullhorn Job Queries
- Better Errors and Logging around auto reconnect.
- Better Logging Messages around Application Sync.
- Enhancement: Resume fields, when included in the shortcode or via the default form defined in the settings will now be
  a required field with client-side validation.
- All application form fields defined in the 'matador_application_fields_structure' filter given an attribute of
  'required' will be required by client-side validation.
- Refactored the Jobs Output function into two parts to allow for alternate processing possibilities.
- Matador now processes Resumes into HTML to support new Bullhorn 'NOVO' UI

Bugfixes:

- Fixed incorrectly named actions in default Matador Taxonomies template.
- Fixed an issue for users that upgraded from a 2.x.x version of the lite plugin regarding ClientCorporation IDs.

## 3.0.4

UI:

- Fixed text color of status labels in connection assistant
 
## 3.0.3

Features:

- Added more allowed html tags from the job description import, including: <h1> through <h6>, and the list item tags.
- Added basic sorting functionality to the job listings, including new settings options, extendable via filters.

Bugfixes:

- Fixed an issue where the "Published - Submitted" option in the import settings wasn't working
- Fixed a persistent issue related to a 3.0.2 bugfix for template helpers related to job meta.

Internationalization:

- A partial translation of Matador to Netherlands Dutch was added to the languages directory.

## 3.0.2

Features:

- Added new filters into taxonomies-list
- Added argument to filter call in taxonomy labels
- Added an explicit timeout to API requests

Bugfixes:

- Matador Application form's <form> element had an empty class attribute
- Shortcodes and Template Helpers for job meta fields were not working as intended
- Fixed an issue where custom additional taxonomies formatted incorrectly caused the load to fail completely.
- Fixed issue causing some sites to fail upgrade from 2.X versions of Matador Jobs Lite
- Fixed issue where, when using the main query's template, matador search terms would not be applied to search results.
- Fixed issue where case sensitive field names in the [matador_application] shortcode caused fields to not display.
  Allow the fields attribute to be more forgiving in general to formatting.
- Fixed issue where the "show_all_option" for the taxonomy shortcode wouldn't properly work before a list.

UI:

- Improved the text label for "No Taxonomy Entries Found"

## 3.0.1

Features:

- Add a feature to prevent loading of deprecated shortcodes if main shortcodes are not loaded.
- Revised load order of the plugin for better extension development.

Bugfixes:

- Users exiting the connection assistant from the "Prepare" step initial screen will no longer be advanced to the next
  step upon return.
- Fixed issue where Matador Jobs Lite/Just Jobs would fail when looking for the premium versions' updater class.
- Fixed issue where All-Access and Pro extensions were not properly getting their update information.
- Fixed issue where Bullhorn Import failed if a standard taxonomy is unset by a developer (is in WPJM extension).

UI:

- Improved text prompts in Connection Assistant.

## 3.0.0

- While '3.0.0' in name, this update is a completely new version that rewrote the entire plugin. See matadorjobs.com
  for a full list of features. This will be a breaking change for users of the former WordPress.org plugin.

## 2.5.0

- Added warning for users of plugin, informing them of the 3.0+ plus release being available now for download on
  matadorjobs.com and warning that the release is breaking change and to not allow updates. Our intent is to leave this
  warning in place for a minimum of 60 days.

## 2.4.0
Added retries to the CV upload to re-attempt CV parsing failures (a known Bullhorn issue - "Convert failed, resume mirror status: -1 - Rex has not been initialized").
Increased the timeout for CV parsing to 2 mins
Added error email option
Added lots of extra checks for bad data back to Bullhorn API
Enabled a copy of the CV to be inserted into the description as HTML.
Numerous other bug-fixes and extra filters.

## 2.3.0
Added option to disable auto syncing.
Added option to not filter the jobs by isPublic location setting.
Other small fixes.
More short code support.

## 2.2.2
Some fixes for PHP errors.
Added more content to job post meta.
Added option select which field to show in CV form.
More short code support.

## 2.2.0
Fixed an error in the options name that was breaking the CV upload redirect to the thank you page.
Fixed calls to non static functions.
Added shortcodes for "b2wp_resume_form", "b2wp_application", "b2wp_shortapp" for compatibility.

## 2.1.4
Fixed typo.

## 2.1.2
Improved the messages on the settings page.
Protected the country code.

## 2.1.1
Fixed a bug when syncing.

## 2.1
Fixed the country fetch.
Handle running the plugin without being linked to bullhorn.

## 2.0
Merged CV upload.
Removed 3rd party file upload code and replaced with native WordPress version.
Added support to CV upload to parse skill list.
Added support to CV upload to link to a joblisting.
Added translations to all strings I could find.
Added filter to allow settings override.
Added option to select to use the CV upload form or just link to a page with an application form.
Added Microdata to the job detail pages to help with SEO ranking.
Lots of code tidy and refactoring to get the code close the WordPress Standards.
Added support for multiple URL's to one Bullhorn Account.

## 1.x.x
As forked from "Bullpen"
