=== Jobicy Remote Jobs Feed ===
Contributors: creatis
Tags: remote jobs, job board, employment, shortcode, gutenberg
Requires at least: 6.5
Tested up to: 7.1.3
Requires PHP: 7.4
Stable tag: 2.0.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Build customizable remote job boards with live filters, Gutenberg blocks, multiple layouts and theme-resistant styles.

== Description ==

Display current remote opportunities from Jobicy using [jobicy_jobs], the Jobicy Remote Jobs editor block, or the classic widget. Version 2.0 preserves the original shortcode and existing 1.x settings while adding 68 settings.

* List, responsive grid (1–4 columns), and compact layouts.
* Independent boards on the same page, each with its own filters and appearance.
* Keyword, location and category searches using the current public Jobicy Jobs API.
* Employment type, experience, salary availability, company exclusion and age filters within each returned API batch.
* Configurable search controls, automatic search or explicit submit, and reset.
* Previous/next navigation, load more, or show a full API batch. Cursor continuation loads further batches when available.
* Sort loaded jobs by date, job title or company. Counts describe loaded matching jobs, not an API-wide total.
* Toggle logos, company, location, employment, experience, category, salary, publication date and excerpts.
* Native accessible job dialogs with keyboard focus management and Escape, plus direct Jobicy links.
* Light, dark and system color schemes; configurable colors, fonts, radius, spacing, logo size and card padding.
* Unique jobicy-feed__ classes, scoped CSS, and an optional stronger guard against common aggressive theme rules.
* Global defaults with per-shortcode overrides, a shortcode builder, Gutenberg controls and a classic sidebar widget.
* Editable search, action and status labels; English and Russian translations, plus a POT translation template.
* Shared transient cache, request locks, stale-response fallback, rate-limit cooldown and cache clearing.
* Settings export/import with administrator permissions and nonce verification.
* Safe HTML descriptions, validated settings, escaped output and signed public board configuration.
* Server-rendered listings and canonical links work without JavaScript. Interactive controls require JavaScript.

== Installation ==

1. Upload the jobicy-jobs folder to /wp-content/plugins/, or install the release ZIP through Plugins > Add New > Upload Plugin.
2. Activate Jobicy Remote Jobs Feed.
3. Open Settings > Jobicy Jobs.
4. Insert [jobicy_jobs] or add the Jobicy Remote Jobs block.

== Shortcode examples ==

Default board:
[jobicy_jobs]

A curated engineering grid:
[jobicy_jobs count="30" geo="usa" industry="engineering" layout="grid" columns="3" page_size="9" filter_control="admin_defined"]

Dark, interactive board with manual search:
[jobicy_jobs title="Remote opportunities" color_scheme="dark" auto_search="0" pagination="more"]

Compact roles with published salaries:
[jobicy_jobs layout="compact" job_type="full-time,contract" salary_only="1" show_excerpt="0"]

All display, feed, appearance and label keys in the settings screen can be shortcode attributes. Use 0/1 for booleans. Aliases: count = jobs_count, tag = admin_tag, geo = admin_geo, industry = admin_industry. Cache, timeout and uninstall options remain administrator-only. See docs/SHORTCODES.md for every attribute and accepted value.

== Frequently Asked Questions ==

= Will version 2.0 preserve my settings? =
Yes. The jobicy_settings_options option and [jobicy_jobs] shortcode are preserved. Existing settings are merged with new defaults. The minimum WordPress version is now 6.5. Frontend markup intentionally changed: custom CSS targeting legacy job-title/jobicy-container classes must be updated to .jobicy-feed and .jobicy-feed__*.

= Can a theme still override the styles? =
The plugin uses prefixed classes and scoped rules. Extra style protection is enabled by default and also guards important controls/typography against common theme !important rules. Disable protect_styles for easier theme overrides. Arbitrary ID-heavy !important theme rules may still require a site-specific adjustment; this is scoped CSS, not Shadow DOM. Source description styles/classes/IDs are removed. The dialog uses the browser top layer.

= How much data can I display? =
The current public API accepts 1–200 jobs per batch and includes a rolling seven-day publication window. Cursor continuation loads subsequent batches when available. Local employment/experience/salary/company/age filters can leave a batch empty even if later batches match. Use Next/Load more to continue. The plugin does not import vacancies into WordPress posts, run scheduled synchronization or promise an API-wide result total. Show-entire-batch mode intentionally has no continuation controls.

= What does sorting mean? =
Sorting applies to the matching jobs already loaded on this board. Further cursor batches are fetched in the API's publication order and then incorporated into the loaded set. It is not a global oldest/title/company search across unseen API pages.

= Are the public filters secure with page caching? =
Read-only AJAX uses an HMAC-signed board configuration rather than an expiring user nonce, so cached pages keep working. Visitors can change only enabled search controls. Fixed feeds and server-configured employment/experience/salary restrictions cannot be bypassed by changing submitted fields. Administrative writes require manage_options and WordPress nonces.

= What if Jobicy is unavailable? =
The last successful response is used temporarily, with a visible saved-results notice. With no cache, the configured error message and retry action appear. A cooldown defers repeat failures and respects Retry-After. A stale cache containing cursor tokens is limited to 23 hours; the API may invalidate an older traversal. Reset the filters if a session expires.

= Can I change all text and colors? =
Primary labels and messages have editable settings. Other interface strings use the jobicy translation domain. Russian catalogs and a POT are included. Colors are configurable; blank optional colors follow the selected scheme. See docs/CUSTOMIZATION.md for CSS variables and developer hooks. Saved custom labels remain saved text when the site language changes.

= Is there an API key or paid account? =
No. This plugin uses the public API and canonical Jobicy application URLs. It does not send commercial API keys or trigger paid direct-link requests.

== External Services ==

This plugin contacts https://jobicy.com/api/jobs to fetch job listings and location/category taxonomies. The older /api/v2/remote-jobs path remains a Jobicy compatibility endpoint; new plugin requests use /api/jobs.

Requests send page size, enabled keyword/location/category criteria, an opaque continuation cursor when applicable, and a User-Agent containing the plugin version and the site's home URL. Jobicy also receives the web server's IP address. Requests are made by WordPress, not directly by a visitor's browser. Employer logos, when enabled, load from the URL supplied by Jobicy and expose the visitor's normal image request information to that host. No applicant details or WordPress user profiles are submitted. Imported job descriptions may reference external images. Jobicy attribution and source links are preserved.

* Documentation and fair use: https://jobicy.com/jobs-rss-feed
* Terms: https://jobicy.com/terms-and-conditions
* Privacy: https://jobicy.com/privacy-policy

== Changelog ==

= 2.0.0 =
* Rebuilt settings, shortcode rendering and frontend around independently configured boards.
* Added Gutenberg block, classic widget, shortcode builder and JSON settings portability.
* Added layouts, typography, color schemes, field visibility, labels and expanded filtering.
* Added pagination and cursor-based continuation using the current public Jobs API.
* Replaced generic CSS and duplicate IDs; added scoped theme protection and native dialogs.
* Added transient caching, stale fallback, cooldown, request locking and safe error states.
* Hardened input validation, source HTML sanitization, output escaping and public requests.
* Added English/Russian localization resources, documentation and regression checks.
* Verified WordPress 7.1.3 with PHP 8.4.27 in an isolated local installation.

= 1.0.6 =
* Refactored the plugin to enqueue external CSS and JS files instead of using inline styles and scripts.

= 1.0.5 =
* Initial public release after feedback.

= 1.0 =
* Initial release.

== Upgrade Notice ==

= 2.0.0 =
Major upgrade with expanded settings and independent job boards. Requires WordPress 6.5+. Existing options/shortcodes are preserved. Update custom CSS using legacy frontend classes and clear your page/CDN cache after upgrading.

