fields` (a property of * `cmplz_tc_config`). Fields are grouped by step and section index and cover * the full wizard flow: company details (step 1), content/communication/ * liability/copyright/returns questions (step 2), document-page creation and * menu assignment (step 3), and the finish screen (step 4). * * Each field entry is a key → array pair where the key is the fieldname and * the array may contain: * - `step` (int) Wizard step this field belongs to. * - `section` (int) Section within the step (optional). * - `source` (string) Document type, e.g. 'terms-conditions'. * - `type` (string) Field type: 'text', 'textarea', 'email', 'url', * 'radio', 'select', 'number', 'multicheckbox'. * - `label` (string) Translated question label shown above the field. * - `options` (array) Key → translated-label pairs for radio/select/multicheckbox. * - `default` (mixed) Default value before the user answers. * - `required` (bool) Whether the field must be answered before continuing. * - `placeholder` (string) Input placeholder text. * - `tooltip` (string) Short help text shown inline next to the field. * - `help` (string) Longer explanatory text shown below the field. * - `comment` (string) Advisory note rendered beneath the field value. * - `condition` (array) Field-name → expected-value pairs that must all be met * for this field to be visible. * - `translatable` (bool) When true, the field value can differ per WPML/Polylang language. * - `callback` (string) Action suffix fired to render a custom step callback. * - `minimum` (int) Minimum allowed value for number fields. * * @package Complianz_Terms_Conditions * @subpackage Config * @author Complianz * @copyright 2023 Complianz.io * @license GPL-2.0-or-later * @link https://complianz.io * * @since 1.0.0 */ // Prevent direct file access outside of the WordPress bootstrap. defined( 'ABSPATH' ) || die( 'you do not have acces to this page!' ); /* * Field schema reference (all keys are optional unless noted): * * condition: If a question should be dynamically shown or hidden depending on * another answer. Use 'NOT answer' to hide when the answer is not set. * callback_condition: Whether the field should be shown or hidden based on an answer * on a different screen (calls action cmplz_$page_$callback). * required: Mandatory field — wizard cannot progress without an answer. * help: Help text displayed beneath the field. * * Full default shape: * "fieldname" => '', * "type" => 'text', * "required" => false, * 'default' => '', * 'label' => '', * 'table' => false, * 'callback_condition' => false, * 'condition' => false, * 'callback' => false, * 'placeholder' => '', * 'optional' => false, */ // ------------------------------------------------------------------------- // Step 1 — General: company identity, contact preferences, and legal links. // ------------------------------------------------------------------------- $this->fields = $this->fields + array( // Website or company owner name shown in the generated document. 'organisation_name' => array( 'step' => 1, 'section' => 1, 'source' => 'terms-conditions', 'type' => 'text', 'default' => '', 'placeholder' => __( 'Company or personal name', 'complianz-terms-conditions' ), 'label' => __( 'Who is the owner of the website?', 'complianz-terms-conditions' ), 'required' => true, ), // Full company address inserted into the generated document and withdrawal form. 'address_company' => array( 'step' => 1, 'section' => 1, 'source' => 'terms-conditions', 'placeholder' => __( 'Address, City and Zipcode', 'complianz-terms-conditions' ), 'type' => 'textarea', 'default' => '', 'label' => __( 'Address', 'complianz-terms-conditions' ), ), // Country/jurisdiction — pre-filled from the WordPress locale via callback_notices.php. 'country_company' => array( 'step' => 1, 'section' => 1, 'source' => 'terms-conditions', 'type' => 'select', 'options' => $this->countries, 'default' => '', 'label' => __( 'Jurisdiction', 'complianz-terms-conditions' ), 'required' => true, 'tooltip' => __( 'This setting is automatically pre-filled based on your WordPress language setting.', 'complianz-terms-conditions' ), ), // How the site owner prefers to receive contact from visitors. 'contact_company' => array( 'step' => 1, 'section' => 1, 'source' => 'terms-conditions', 'type' => 'radio', 'options' => array( 'manually' => __( 'I would like to add an email address to the terms & conditions', 'complianz-terms-conditions' ), 'webpage' => __( 'I would like to select an existing contact page', 'complianz-terms-conditions' ), 'refer_to_contact' => __( 'I would like to refer to a phone number published on the website', 'complianz-terms-conditions' ), ), 'default' => '', 'tooltip' => __( "An existing page would be a contact or an 'about us' page where your contact details are readily available, or a contact form is present.", 'complianz-terms-conditions' ), 'label' => __( 'How do you wish visitors to contact you?', 'complianz-terms-conditions' ), 'required' => true, ), // Shown only when contact_company = 'manually'; obfuscated on the front-end. 'email_company' => array( 'step' => 1, 'section' => 1, 'source' => 'terms-conditions', 'type' => 'email', 'default' => '', 'tooltip' => __( 'Your email address will be obfuscated on the front-end to prevent spidering.', 'complianz-terms-conditions' ), 'label' => __( 'What is the email address your visitors can use to contact you about the terms & conditions?', 'complianz-terms-conditions' ), 'condition' => array( 'contact_company' => 'manually', ), ), // Shown only when contact_company = 'webpage'; translatable for WPML/Polylang sites. 'page_company' => array( 'step' => 1, 'section' => 1, 'source' => 'terms-conditions', 'translatable' => true, 'default' => home_url( '/contact/' ), 'type' => 'url', 'label' => __( 'Add the URL for your contact details', 'complianz-terms-conditions' ), 'condition' => array( 'contact_company' => 'webpage', ), ), // Whether to include references to the Cookie Policy and Privacy Statement. // Can be empty and filled manually; pre-filled when Complianz GDPR is installed. 'legal_mention' => array( 'step' => 1, 'section' => 1, 'source' => 'terms-conditions', 'type' => 'radio', 'default' => 'yes', 'required' => true, 'label' => __( 'Do you want to refer to your cookie policy and privacy statement?', 'complianz-terms-conditions' ), 'comment' => __( "If you don't have the relevant documents, please have a look at Complianz - The Privacy Suite for WordPress.", 'complianz-terms-conditions' ) . cmplz_tc_read_more( 'https://complianz.io/pricing/?tc&step=1' ), 'options' => $this->yes_no, ), // Cookie Policy URL; shown when legal_mention = 'yes'. Pre-filled from Complianz GDPR. 'cookie_policy' => array( 'step' => 1, 'section' => 1, 'translatable' => true, 'source' => 'terms-conditions', 'type' => 'url', 'placeholder' => site_url( 'cookie-policy' ), 'label' => __( 'URL to your Cookie Policy', 'complianz-terms-conditions' ), 'comment' => __( 'Complianz GDPR/CCPA Cookie Consent can create one for you!', 'complianz-terms-conditions' ) . cmplz_tc_read_more( 'https://wordpress.org/plugins/complianz-gdpr/' ), 'condition' => array( 'legal_mention' => 'yes', ), ), // Privacy Statement URL; shown when legal_mention = 'yes'. Pre-filled from Complianz GDPR premium. 'privacy_policy' => array( 'step' => 1, 'section' => 1, 'translatable' => true, 'source' => 'terms-conditions', 'type' => 'url', 'placeholder' => site_url( 'privacy-statement' ), 'label' => __( 'URL to your Privacy Statement', 'complianz-terms-conditions' ), 'condition' => array( 'legal_mention' => 'yes', ), ), // Statutory disclosures URL (Impressum for DE/AT; company details page for other EU/UK). 'disclosure_company' => array( 'step' => 1, 'section' => 1, 'source' => 'terms-conditions', 'translatable' => true, 'type' => 'url', 'help' => __( 'For Germany and Austria, refer to your Impressum, for other EU countries and the UK select a page with your company or personal details.', 'complianz-terms-conditions' ) . cmplz_tc_read_more( 'https://complianz.io/definitions/what-are-statutory-and-regulatory-disclosures?tc&step=1' ), 'label' => __( 'Where can your visitors find your statutory and regulatory disclosures?', 'complianz-terms-conditions' ), ), ); // ------------------------------------------------------------------------- // Step 2, Section 1 — Questions: Content // ------------------------------------------------------------------------- $this->fields = $this->fields + array( // Whether the site operates a webshop; pre-filled when WooCommerce/EDD is active. 'webshop_content' => array( 'step' => 2, 'section' => 1, 'source' => 'terms-conditions', 'type' => 'radio', 'required' => true, 'label' => __( 'Are you running a webshop?', 'complianz-terms-conditions' ), 'options' => $this->yes_no, ), // Whether visitors can register an account on the site. 'account_content' => array( 'step' => 2, 'section' => 1, 'source' => 'terms-conditions', 'type' => 'radio', 'required' => true, 'default' => '', 'label' => __( 'Is there an option to register an account on your website for clients?', 'complianz-terms-conditions' ), 'tooltip' => __( 'This means any registration form or account creation for your customers or website visitors.', 'complianz-terms-conditions' ), 'options' => $this->yes_no, ), // Shown when account_content = 'yes'; adds an account-suspension/deletion paragraph. 'delete' => array( 'step' => 2, 'section' => 1, 'source' => 'terms-conditions', 'type' => 'radio', 'required' => true, 'default' => '', 'label' => __( 'Do you want to suspend or delete user accounts of visitors that breach the terms & conditions?', 'complianz-terms-conditions' ), 'tooltip' => __( 'Appends a paragraph to your terms & conditions enabling your to delete any account breaching this document.', 'complianz-terms-conditions' ), 'options' => $this->yes_no, 'condition' => array( 'account_content' => 'yes', ), ), // Whether the site participates in affiliate marketing programs. 'affiliate_content' => array( 'step' => 2, 'section' => 1, 'source' => 'terms-conditions', 'type' => 'radio', 'required' => true, 'default' => '', 'label' => __( 'Do you engage in affiliate marketing?', 'complianz-terms-conditions' ), 'tooltip' => __( 'Either by accepting affiliate commission through your webshop or engaging in other affiliate programs.', 'complianz-terms-conditions' ), 'options' => $this->yes_no, ), // Whether visitors can post user-generated content (reviews, forum posts, comments). 'forum_content' => array( 'step' => 2, 'section' => 1, 'source' => 'terms-conditions', 'type' => 'radio', 'required' => true, 'default' => '', 'label' => __( 'Is there an option for visitors to post their own content on your websites?', 'complianz-terms-conditions' ), 'tooltip' => __( 'Think about reviews, a forum, comments and other moderated and unmoderated content.', 'complianz-terms-conditions' ), 'options' => $this->yes_no, ), // Whether to add a WCAG/accessibility reference paragraph. 'accessibility_content' => array( 'step' => 2, 'section' => 1, 'source' => 'terms-conditions', 'type' => 'radio', 'required' => true, 'default' => '', 'label' => __( 'Do you want to include your efforts concerning accessibility?', 'complianz-terms-conditions' ), 'help' => __( 'Extend your document with a reference to your efforts toward accessibility.', 'complianz-terms-conditions' ) . cmplz_tc_read_more( 'https://complianz.io/definitions/what-is-wcag?tc&step=2§ion=1' ), 'options' => $this->yes_no, ), // Whether the site specifically targets minors; triggers the minimum_age field below. 'age_content' => array( 'step' => 2, 'section' => 1, 'source' => 'terms-conditions', 'type' => 'radio', 'required' => true, 'default' => '', 'label' => __( 'Is your website specifically targeted at minors?', 'complianz-terms-conditions' ), 'options' => $this->yes_no, ), // Shown when age_content = 'yes'; adds a legal-guardian consent paragraph. 'minimum_age' => array( 'step' => 2, 'section' => 1, 'source' => 'terms-conditions', 'type' => 'number', 'default' => 12, 'label' => __( 'What is the minimum appropriate age for your website? ', 'complianz-terms-conditions' ), 'tooltip' => __( 'This will ensure a paragraph explaining a legal guardian must review and agree to these terms & conditions', 'complianz-terms-conditions' ), 'condition' => array( 'age_content' => 'yes', ), ), // ----------------------------------------------------------------------- // Step 2, Section 2 — Questions: Communication // ----------------------------------------------------------------------- // Whether to add an electronic-communication paragraph (e.g. email is "in writing"). 'electronic_communication' => array( 'step' => 2, 'section' => 2, 'source' => 'terms-conditions', 'type' => 'radio', 'required' => true, 'default' => '', 'label' => __( 'Do you want to state that communication in writing is done electronically?', 'complianz-terms-conditions' ), 'tooltip' => __( 'This will contain a paragraph that communication in writing will be done electronically e.g., email and other digital communication tools.', 'complianz-terms-conditions' ), 'options' => $this->yes_no, ), // Whether the site sends marketing newsletters (excludes transactional email). 'newsletter_communication' => array( 'step' => 2, 'section' => 2, 'source' => 'terms-conditions', 'type' => 'radio', 'required' => true, 'default' => '', 'tooltip' => __( 'Order updates, customer service and other direct and specific communication with your clients or users should not be considered.', 'complianz-terms-conditions' ), 'label' => __( 'Do you send newsletters?', 'complianz-terms-conditions' ), 'options' => $this->yes_no, ), // Whether to include a force-majeure liability-exclusion paragraph. 'majeure_communication' => array( 'step' => 2, 'section' => 2, 'source' => 'terms-conditions', 'type' => 'radio', 'required' => true, 'default' => '', 'label' => __( 'Do you want to enable Force Majeure? ', 'complianz-terms-conditions' ), 'help' => __( 'Force majeure are occurrences beyond the reasonable control of a party and that will void liability', 'complianz-terms-conditions' ) . cmplz_tc_read_more( 'https://complianz.io/definition/what-is-force-majeure/?tc&step=2§ion=2' ), 'options' => $this->yes_no, ), // Whether changes to the T&C will be announced in writing before taking effect. 'notice_communication' => array( 'step' => 2, 'section' => 2, 'source' => 'terms-conditions', 'type' => 'radio', 'required' => true, 'default' => '', 'label' => __( 'Will you give a written notice of any changes or updates to the terms & conditions before these changes will become effective?', 'complianz-terms-conditions' ), 'options' => $this->yes_no, ), // Whether to limit the governing language to the current site language. 'language_communication' => array( 'step' => 2, 'section' => 2, 'source' => 'terms-conditions', 'type' => 'radio', 'required' => true, 'default' => 'yes', 'label' => __( 'Do you want to limit the interpretation of this document to your current language?', 'complianz-terms-conditions' ), 'options' => $this->yes_no, ), // Shown when language_communication = 'no'; lists all languages the document is available in. // Pre-filled from WPML/Polylang when a multilanguage plugin is active. 'multilanguage_communication' => array( 'step' => 2, 'section' => 2, 'source' => 'terms-conditions', 'type' => 'multicheckbox', 'required' => true, 'default' => '', 'condition' => array( 'language_communication' => 'no', ), 'label' => __( 'In which languages is this document available for interpretation?', 'complianz-terms-conditions' ), 'help' => __( 'This answer is pre-filled if a multilanguage plugin is available e.g. WPML or Polylang.', 'complianz-terms-conditions' ) . cmplz_tc_read_more( 'https://complianz.io/translating-terms-conditions/' ), 'options' => $this->languages, ), // ----------------------------------------------------------------------- // Step 2, Section 3 — Questions: Liability // ----------------------------------------------------------------------- // Whether the site offers professional advice; affects the disclaimer paragraph. 'sensitive_liability' => array( 'step' => 2, 'section' => 3, 'source' => 'terms-conditions', 'type' => 'radio', 'required' => true, 'default' => '', 'label' => __( 'Do you offer financial, legal or medical advice?', 'complianz-terms-conditions' ), 'tooltip' => __( "If you answer 'No', a paragraph will explain the content on your website does not constitute professional advice.", 'complianz-terms-conditions' ), 'options' => $this->yes_no, ), // Whether to cap liability at a fixed monetary amount. 'max_liability' => array( 'step' => 2, 'section' => 3, 'source' => 'terms-conditions', 'type' => 'radio', 'required' => true, 'default' => '', 'label' => __( 'Do you want to limit liability with a fixed amount?', 'complianz-terms-conditions' ), 'tooltip' => __( 'If you choose no, liability will be fixed to the amount paid by your customer.', 'complianz-terms-conditions' ), 'options' => $this->yes_no, ), // Shown when max_liability = 'yes'; the fixed liability cap (e.g. "$1000"). 'about_liability' => array( 'step' => 2, 'section' => 3, 'source' => 'terms-conditions', 'placeholder' => '$1000', 'type' => 'text', 'default' => '', 'label' => __( 'Regarding the previous question, fill in the fixed amount including the currency.', 'complianz-terms-conditions' ), 'condition' => array( 'max_liability' => 'yes', ), ), // ----------------------------------------------------------------------- // Step 2, Section 4 — Questions: Copyright // ----------------------------------------------------------------------- // Intellectual property licensing choice for original content on the site. 'about_copyright' => array( 'step' => 2, 'section' => 4, 'source' => 'terms-conditions', 'type' => 'radio', 'options' => array( 'allrights' => __( 'All rights reserved', 'complianz-terms-conditions' ), 'norights' => __( 'No rights are reserved', 'complianz-terms-conditions' ), 'ccattr' => __( 'Creative commons - Attribution', 'complianz-terms-conditions' ), 'ccsal' => __( 'Creative commons - Share a like', 'complianz-terms-conditions' ), 'ccnod' => __( 'Creative commons - No derivates', 'complianz-terms-conditions' ), 'ccnon' => __( 'Creative commons - Noncommercial', 'complianz-terms-conditions' ), 'ccnonsal' => __( 'Creative commons - Share a like Noncommercial', 'complianz-terms-conditions' ), ), 'default' => '', 'help' => __( 'Want to know more about Creative Commons?', 'complianz-terms-conditions' ) . cmplz_tc_read_more( 'https://complianz.io/definitions/what-is-creative-commons?tc&step=2§ion=4' ), 'label' => __( 'What do you want to do with any intellectual property claims?', 'complianz-terms-conditions' ), 'required' => true, ), // ----------------------------------------------------------------------- // Step 2, Section 5 — Questions: Returns // ----------------------------------------------------------------------- // Whether to add a returns/withdrawal-of-service section (mandatory for EU webshops). 'if_returns' => array( 'step' => 2, 'section' => 5, 'source' => 'terms-conditions', 'type' => 'radio', 'options' => $this->yes_no, 'default' => 'yes', 'tooltip' => __( 'This will append the conditions for returns and withdrawals, mandatory when selling to consumers in the EU. ', 'complianz-terms-conditions' ), 'label' => __( 'Do you offer returns of goods or the withdrawal of services?', 'complianz-terms-conditions' ), ), // Whether to use a custom withdrawal form instead of the auto-generated PDF. 'if_returns_custom' => array( 'step' => 2, 'section' => 5, 'source' => 'terms-conditions', 'type' => 'radio', 'options' => $this->yes_no, 'default' => 'no', 'tooltip' => __( 'We will add a standard, translatable form to this paragraph. To use your own, you can add the link below.', 'complianz-terms-conditions' ), 'label' => __( 'Do you want to use a custom withdrawal form?', 'complianz-terms-conditions' ), ), // URL of the custom withdrawal form PDF; shown when if_returns_custom = 'yes'. 'if_returns_custom_link' => array( 'step' => 2, 'section' => 5, 'source' => 'terms-conditions', 'default' => home_url( '/wp-content/uploads/custom-withdrawal-form.pdf' ), 'type' => 'url', 'label' => __( 'Add the URL for your custom withdrawal form', 'complianz-terms-conditions' ), 'condition' => array( 'if_returns_custom' => 'yes', ), ), // Refund period in days; EU legislation requires a minimum of 14 days. 'refund_period' => array( 'step' => 2, 'section' => 5, 'minimum' => 14, 'required' => true, 'source' => 'terms-conditions', 'type' => 'number', 'default' => 14, 'label' => __( 'What is your refund period in days?', 'complianz-terms-conditions' ), 'tooltip' => __( 'EU legislation requires you to offer a minimum of 14 days refund period.', 'complianz-terms-conditions' ), 'condition' => array( 'if_returns' => 'yes', ), ), // Type of contract closed through the website; determines which return clauses apply. 'about_returns' => array( 'step' => 2, 'section' => 5, 'source' => 'terms-conditions', 'type' => 'radio', 'options' => array( 'nuts_services' => __( 'Services and/or digital content.', 'complianz-terms-conditions' ), 'nuts_utilities' => __( 'Utilities - Gas, water and electricity.', 'complianz-terms-conditions' ), 'webshop' => __( 'Products and goods.', 'complianz-terms-conditions' ), 'multiples' => __( 'A contract relating to goods ordered by the consumer and delivered separately.', 'complianz-terms-conditions' ), 'subscription' => __( 'Subscription-based delivery of goods.', 'complianz-terms-conditions' ), ), 'default' => '', 'help' => cmplz_tc_read_more( 'https://complianz.io/definition/about-return-policies/' ), 'label' => __( 'Please choose the option that best describes the contract a consumer closes with you through the use of the website.', 'complianz-terms-conditions' ), 'condition' => array( 'if_returns' => 'yes', ), ), // Whether the seller offers to collect physical goods from the customer on withdrawal. 'product_returns' => array( 'step' => 2, 'section' => 5, 'source' => 'terms-conditions', 'type' => 'radio', 'options' => $this->yes_no, 'default' => '', 'label' => __( 'Do you want to offer your customer to collect the goods yourself in the event of withdrawal?', 'complianz-terms-conditions' ), 'condition' => array( 'about_returns' => 'webshop OR multiples OR subscription', ), ), // Who bears the cost of returning goods on withdrawal. 'costs_returns' => array( 'step' => 2, 'section' => 5, 'source' => 'terms-conditions', 'type' => 'radio', 'options' => array( 'seller' => __( 'We, the seller', 'complianz-terms-conditions' ), 'customer' => __( 'The customer', 'complianz-terms-conditions' ), // Special case: goods cannot be posted; a maximum return cost applies. 'maxcost' => __( 'The goods, by their nature, cannot normally be returned by post and a maximum cost of return applies ', 'complianz-terms-conditions' ), ), 'default' => '', 'label' => __( 'Who will bear the cost of returning the goods?', 'complianz-terms-conditions' ), 'condition' => array( 'about_returns' => 'webshop OR multiples OR subscription', ), ), // Shown when costs_returns = 'maxcost'; the maximum return cost including currency. 'max_amount_returned' => array( 'step' => 2, 'section' => 5, 'source' => 'terms-conditions', 'type' => 'text', 'default' => '', 'placeholder' => '$1000', 'label' => __( 'Regarding the previous question, fill in the maximum amount including the currency.', 'complianz-terms-conditions' ), 'condition' => array( 'costs_returns' => 'maxcost', 'if_returns' => 'yes', ), ), ); // ------------------------------------------------------------------------- // Step 3, Section 1 — Documents: Create document pages. // The 'callback' value triggers cmplz_tc_terms_conditions_add_pages action. // ------------------------------------------------------------------------- $this->fields = $this->fields + array( 'create_pages' => array( 'step' => 3, 'section' => 1, 'source' => 'terms-conditions', 'callback' => 'terms_conditions_add_pages', 'label' => '', ), ); // Step 3, Section 2 — Documents: Assign document pages to a navigation menu. // The 'callback' value triggers cmplz_tc_terms_conditions_add_pages_to_menu action. $this->fields = $this->fields + array( 'add_pages_to_menu' => array( 'step' => 3, 'section' => 2, 'source' => 'terms-conditions', 'callback' => 'terms_conditions_add_pages_to_menu', 'label' => '', ), ); // Step 4 — Finish: Completion screen with tips, tricks, and companion plugin cards. // The 'callback' value triggers the cmplz_tc_last_step action. $this->fields = $this->fields + array( 'finish_setup' => array( 'step' => 4, 'source' => 'terms-conditions', 'callback' => 'last_step', 'label' => '', ), );