=== Catalogue de formation Digiforma ===
Contributors: digiforma
Tags: Formation
Requires at least: 6.6
Tested up to: 7.0
Requires PHP: 8.2
Stable tag: 1.6.2
License: GPL2

Synchronize your training catalog and manage pre-registrations for inter, intra, and custom sessions directly from WordPress.

== Description ==
Automatically synchronize your Digiforma training catalog and allow your visitors to register directly from your WordPress site.

== Main Features ==

* Automatic synchronization of training programs, categories, sessions, and instructors from the Digiforma API
* Custom post type "digiforma" to manage your training programs
* Training category taxonomy to organize your programs
* Training sessions stored in program posts
* Secure registration forms for:
  * Pre-registrations for inter sessions (with session selection)
  * Requests for intra sessions (in-company training)
  * Requests for custom sessions (personalized training)
* Multi-layer anti-spam protection (honeypot, rate limiting, Akismet, temporal validation)
* Customizable templates for displaying archives and training details
* Appearance customization (colors, images, text) from WordPress administration
* Automatic cleanup of obsolete content
* Integrated SEO optimizations

== Installation ==

1. Install and activate the plugin from the WordPress repository
2. Go to Digiforma > Settings
3. Enter your Digiforma license key (obtained from app.digiforma.com)
4. Configure the form and thank-you pages
5. Click "Synchronize catalog" to import your training programs

== Usage ==

Use the [digiforma_form] shortcode to display the registration form.

Templates can be overridden in your theme to customize the display.

== Developer hooks ==

Themes and custom plugins can extend Digiforma with WordPress actions and filters.

=== Registration form (inter sessions) ===

* `digiforma_form_session_option_label` — Filter the label of one session in the dropdown.
  * Parameters: `$label` (string), `$session` (array), `$postId` (int)
  * Return: string (escaped again on output; do not include HTML)
* `digiforma_form_session_options` — Filter the full list of session options (`session id => label`).
  * Parameters: `$options` (array), `$postId` (int), `$sessions` (array)
  * Return: array

Example in a theme `functions.php`:

    add_filter( 'digiforma_form_session_option_label', function ( $label, $session, $post_id ) {
        $name = isset( $session['name'] ) ? (string) $session['name'] : '';
        return $name !== '' ? $name : $label;
    }, 10, 3 );

=== GraphQL client ===

* `digiforma_graphql_client` — Replace the Digiforma GraphQL client instance used on form submission.

=== Spam protection ===

* `digiforma_spam_min_submission_time` — Minimum seconds before a submission is accepted (int).
* `digiforma_spam_max_submission_time` — Maximum seconds before a submission is rejected (int).
* `digiforma_spam_suspicious_email_domains` — List of suspicious email domains (array).
* `digiforma_spam_suspicious_keywords` — List of suspicious keywords (array).
* `digiforma_spam_strict_referrer_check` — Enable strict referrer checking (bool).
* `digiforma_spam_require_javascript` — Require JavaScript to submit (bool).
* `digiforma_spam_score_threshold` — Spam score threshold (int).

=== Rate limiting ===

* `digiforma_rate_limit_max_attempts` — Maximum submission attempts (int).
* `digiforma_rate_limit_time_window` — Rate limit time window in seconds (int).

=== Templates ===

* `digiforma_render_single_in_block` — Return true to render the single formation template inside a block wrapper (bool).

Actions on archive and single templates include: `digiforma_archive_before`, `digiforma_archive_after`, `digiforma_archive_after_title`, `digiforma_archive_before_loop`, `digiforma_archive_after_loop`, `digiforma_archive_empty`, `digiforma_archive_loop_item_before`, `digiforma_archive_loop_item_after`, `digiforma_single_before`, `digiforma_single_after_header`, `digiforma_single_formation_page_after_video`, `digiforma_single_formation_page_after_sessions`, `digiforma_single_formation_page_after_content`.

=== Synchronization ===

* `digiforma_sync_programs_completed` — Fired after program sync (`$result`, `$forceUpdate`).
* `digiforma_sync_sessions_completed` — Fired after session sync (`$result`, `$forceUpdate`).
* `digiforma_sync_categories_completed` — Fired after category sync (`$result`, `$cleanupImmediately`).
* `digiforma_sync_instructors_completed` — Fired after instructor sync (`$result`, `$forceUpdate`).
* `digiforma_auto_sync_failed` — Fired when automatic sync fails (`$exception`).

=== Administration ===

* `digiforma/admin/before_main_page` — Before the main Digiforma settings page is rendered.
* `digiforma/admin/after_main_page_header` — After the main settings page header.

== Security ==

The plugin implements multiple layers of protection:
* CSRF protection with WordPress nonces
* Anti-bot honeypot
* Rate limiting by IP and email
* Advanced spam detection
* Complete validation and sanitization of all data

== External Services ==

This plugin connects to external services to provide its functionality. Below is detailed information about each service used.

=== Digiforma API ===

The extension synchronizes training content and manages registrations.

* **What the service is and what it is used for**: Digiforma is a training management platform that allows organizations to organize and manage their training catalog. The Digiforma plugin is used to:
  * Synchronize training programs, categories, training sessions, and instructors from Digiforma to WordPress.
  * Validate the license key during plugin configuration.
  * Submit pre-registration requests for training sessions (inter, intra, and custom sessions).

* **What data is sent and when**:
  * **During synchronization** (manual or automatic): The plugin sends authenticated queries containing the license key to retrieve training data. No personal user data is sent during synchronization.
  * **During license key validation**: The plugin sends a test query with the license key to verify API access.
  * **During form submission**: When a visitor submits a registration form, the plugin sends the following personal data to create a registration in Digiforma:
    * **For individuals**:
      * First name.
      * Last name.
      * Email.
      * Phone number.
      * Address.
      * Postal code.
      * City.
      * Country.
      * Optional: custom fields configured in Digiforma.
    * **For organizations**:
      * Company name.
      * Company email.
      * Phone number.
      * SIRET number.
      * Address.
      * Postal code.
      * City.
      * Country.
      * Optional: custom fields configured in Digiforma.
    * **Additional context**:
      * Training program ID.
      * Session ID (for inter sessions).
      * Number of learners.
      * Form type.

* **Service provider**: Digiforma
* **Terms of service** and **Privacy policy**: https://app.digiforma.com/tos

== Support ==

For any questions or issues, consult the plugin readme (Developer hooks section) or contact Digiforma support.


== Changelog ==

= [1.6.3] - 2026-07-07 =

* Create a filter for sessions name
* Change color picker
* Add required mention at the bottom of the form
* Fix remove programs that are no more in Digiforma
* Add field list on message error
* Fix SEO JSON and add Course Schema
* Use API config for base fields 
* Add all date for sessions in meta
* Fix reveiw rate on single header

= [1.6.2] - 2026-06-16 =

* Fix synchro for sessions
* Add hooks comments
* Fix line breaks errors

= [1.6.1] - 2026-05-29 =

* Add trainee in register form
* Create a second style for form with shortcode attribute style="catalog"
* Add a force sync button to force replace all meta un programms
* Adding hook after sync action

= [1.5.3] - 2026-05-04 =

* Fix rewrite achrive with front
* Fix responsive archive for IOS
* Add line breaks on single accessibility text  

= [1.5.2] - 2026-04-25 =

* Hotfix form open div
* Add line break in mentoring text

= [1.5.1] - 2026-04-14 =

* Hotfix single sidebar mobile

= [1.5.0] - 2026-04-09 =

* Add compatibility with FSE
* Fix bullets in the training card list
* Add advanced settings for fixed header
* Change single header meta design
* Add created-at / updated-at display
* Force permalink rules
* Change sidebar order on mobile

= [1.4.1] - 2026-03-24 =

* Hotfix for duplicate fields in forms

= [1.4.0] - 2026-03-20 =

* For the registration form: fetch fields from Digiforma
* Design changes for next sessions
* Fix price display
* Display comment for score in training detail page
* Add a minimal size for font
* Add support for half hour/day
* Do not display empty cards on training detail page


= [1.3.1] - 2026-02-18 =

* Add French translation
* Add missing translations for Spanish and German
* Edit labels for administration page to make it clearer
* Change color settings
* Add an error message when URL identifiers are the same
* Fix max capacity when set to false

= [1.2.2] - 2026-02-18 =

* Add French translation
* Add missing translations for Spanish and German
* Edit labels for administration page to make it clearer

= [1.2.1] =

* Initial release.
