__('Support', 'ttt-ld'), 'faq' => __('FAQ', 'ttt-ld'), 'consent_form' => __('Toestemmingsformulier', 'ttt-ld'), 'scan_form' => __('Logopediescan', 'ttt-ld'), 'school_admin_dash' => __('Schooladministrator-dashboard', 'ttt-ld'), 'class_admin_dash' => __('Leraar-dashboard', 'ttt-ld'), 'spth_dash' => __('Logopedist-dashboard', 'ttt-ld'), ); $ttt_page_ids = get_option('ttt_page_ids'); if(!$ttt_page_ids) { /* insert the needed pages */ $ttt_page_ids = array(); if($is_wpml_active) { error_log('[ttt_activated] WPML active, going to insert needed pages for ALL the languages'); foreach($languages_keys as $language_key) { $sitepress->switch_lang($language_key); foreach($pages as $page_slug => $page_title) { $ml_page_path = ($language_key == 'nl' ? $page_slug : $language_key.'/'.$page_slug); if($existing_page = get_page_by_path($ml_page_path)) { //error_log('[MULTI]??? Existing page found for '.$ml_page_path); $ttt_page_ids[$language_key][$page_slug] = $existing_page->ID; update_post_meta($existing_page->ID, 'ttt_page', 1); update_post_meta($existing_page->ID, 'ttt_page_name', $page_slug); } else { $page_id = wp_insert_post(array( 'post_type' => 'page', 'post_status' => 'publish', 'post_title' => $page_title, 'meta_input' => array( 'ttt_page' => 1, 'ttt_page_name' => $page_slug, ) )); //error_log('[ttt_activated] '.$language_key.': page inserted for slug '.$page_slug.' at ID '.$page_id); $ttt_page_ids[$language_key][$page_slug] = $page_id; } } } error_log('[ttt_activated] final page struct: '.print_r($ttt_page_ids, true)); } else { foreach($pages as $page_slug => $page_title) { if($existing_page = get_page_by_path($page_slug)) { error_log('Existing page found for '.$page_slug); $ttt_page_ids[$page_slug] = $existing_page->ID; update_post_meta($existing_page->ID, 'ttt_page', 1); update_post_meta($existing_page->ID, 'ttt_page_name', $page_slug); } else { $page_id = wp_insert_post(array( 'post_type' => 'page', 'post_status' => 'publish', 'post_title' => $page_title, 'meta_input' => array( 'ttt_page' => 1, 'ttt_page_name' => $page_slug, ) )); $ttt_page_ids[$page_slug] = $page_id; } } } } /* else { error_log('[ttt_activated] Some existing pages already in DB'); $ttt_page_ids = get_option('ttt_page_ids'); if($is_wpml_active) { foreach($languages_keys as $language_key) { $sitepress->switch_lang($language_key); foreach($pages as $page_slug => $page_title) { $ml_page_path = ($language_key == 'nl' ? $page_slug : $language_key.'/'.$page_slug); if(!array_key_exists($page_slug, $ttt_page_ids[$language_key])) { error_log('Language '.$language_key.': Page does not exist: '.$page_slug); $page_id = wp_insert_post(array( 'post_type' => 'page', 'post_title' => $page_title, 'meta_input' => array( 'ttt_page' => 1, 'ttt_page_name' => $page_slug, ) )); $ttt_page_ids[$language_key][$page_slug] = $page_id; } } } } else { $ttt_page_ids = get_option('ttt_page_ids'); foreach($pages as $page_slug => $page_title) { if(!array_key_exists($page_slug, $ttt_page_ids)) { $page_id = wp_insert_post(array( 'post_type' => 'page', 'post_title' => $page_title, 'meta_input' => array( 'ttt_page' => 1, 'ttt_page_name' => $page_slug, ) )); $ttt_page_ids[$page_slug] = $page_id; } } } } */ update_option('ttt_page_ids', $ttt_page_ids); /* connect all translations by meta */ /* get NL main trids */ $nl_trids = array(); foreach($ttt_page_ids['nl'] as $nl_page_slug => $nl_page_id) { $parent_nl_info = apply_filters('wpml_element_language_details', null, ['element_id' => $nl_page_id, 'element_type' => 'page']); $nl_trids[$nl_page_slug] = $parent_nl_info->trid; } if(!empty($nl_trids)) { foreach(array_keys($pages) as $page_slug) { foreach($ttt_page_ids as $language_key => $pages) { if($language_key == 'nl') continue; /* loop the pages in this language */ foreach($pages as $page_slug => $page_id) { $nl_trid = $nl_trids[$page_slug]; /* connect to the NL translations */ do_action('wpml_set_element_language_details', array( 'element_id' => $page_id, 'element_type' => 'page', 'trid' => $nl_trid, 'language_code' => $language_key, 'source_language_code' => 'nl', )); } } } } } /* HOOK: custom location rule for field groups */ add_action('acf/init', 'acf_init_dashboard_location_type'); function acf_init_dashboard_location_type() { if(function_exists('acf_register_location_type')) { include_once('includes/class/acf-location-dashboard.php'); acf_register_location_type('TTT_ACF_Location_Dashboard'); } } /* HOOK: display the TTT page type in the page list */ add_filter('display_post_states', 'ttt_page_post_states', 10, 2); function ttt_page_post_states($states, $post) { if(get_post_type($post->ID) == 'page') { if(get_post_meta($post->ID, 'ttt_page', true) == 1) { $pages = array( 'support' => __('Support', 'ttt-ld'), 'faq' => __('FAQ', 'ttt-ld'), 'consent_form' => __('Toestemmingsformulier', 'ttt-ld'), 'scan_form' => __('Logopediescan', 'ttt-ld'), 'school_admin_dash' => __('Schooladministrator-dashboard', 'ttt-ld'), 'class_admin_dash' => __('Leraar-dashboard', 'ttt-ld'), 'spth_dash' => __('Logopedist-dashboard', 'ttt-ld'), ); if($ttt_page_name = get_post_meta($post->ID, 'ttt_page_name', true)) { if(array_key_exists($ttt_page_name, $pages)) $states[] = $pages[$ttt_page_name] . __('-pagina', 'ttt-ld'); } } } return $states; } /* HOOK: point dashboard pages to TTT templates based on type */ add_filter('template_include', 'load_ttt_page_templates'); function load_ttt_page_templates($template) { $post_id = get_the_ID(); if(get_post_type($post_id) == 'page') { $page_id = $post_id; if(get_post_meta($page_id, 'ttt_page', true) == 1) { $ttt_page_name = get_post_meta($page_id, 'ttt_page_name', true); switch($ttt_page_name) { case 'consent_form': $template = TTT_PATH . 'templates/consent-form/consent-form.php'; break; case 'scan_form': $template = TTT_PATH . 'templates/scan-form/scan-form.php'; break; case 'school_admin_dash': $template = TTT_PATH . 'templates/dashboard/school-admin/dashboard.php'; break; case 'class_admin_dash': $template = TTT_PATH . 'templates/dashboard/class-admin/dashboard.php'; break; case 'spth_dash': $template = TTT_PATH . 'templates/dashboard/speech-therapist/dashboard.php'; break; } } } return $template; } /* remove standard WordPress text field in favor of ACF for TTT-dashboard specific pages */ add_action('init', 'remove_default_editor_from_page', 999); function remove_default_editor_from_page() { if(!is_admin()) return; $post_id = filter_input( INPUT_GET, 'post', FILTER_SANITIZE_NUMBER_INT); if(get_post_type($post_id) == 'page') { $page_id = $post_id; if(get_post_meta($page_id, 'ttt_page', true) == 1) { remove_post_type_support('page', 'editor'); } } } /* HOOK: enqueue frontend scripts and styles */ add_action('wp_enqueue_scripts', 'ttt_enqueue_script'); function ttt_enqueue_script() { /* frontend > dashboards */ wp_register_style('ttt-dashboard-css', TTT_URL . 'assets/css/dashboard.css', false, TTT_VERSION); wp_enqueue_style('ttt-dashboard-css'); wp_register_style('ttt-consent-form-css', TTT_URL . 'assets/css/consent-form.css', false, TTT_VERSION); wp_enqueue_style('ttt-consent-form-css'); /* select2 */ wp_register_script('ttt-select2', '//cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js', array('jquery')); wp_enqueue_script('ttt-select2'); wp_register_style('ttt-select2-style', '//cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css'); wp_enqueue_style('ttt-select2-style'); /* (multi)datepicker */ wp_enqueue_script('jquery-ui-datepicker'); wp_register_script('jquery-multidatespicker-js', TTT_URL . 'assets/js/jquery-ui.multidatespicker.js', array('jquery')); wp_enqueue_script('jquery-multidatespicker-js'); /* datetimepicker */ wp_register_script('jquery-datetimepicker-js', TTT_URL . 'assets/js/jquery.datetimepicker.full.min.js', array('jquery')); wp_enqueue_script('jquery-datetimepicker-js'); wp_register_style('jquery-datetimepicker-css', TTT_URL . 'assets/css/jquery.datetimepicker.min.css', false, TTT_VERSION); wp_enqueue_style('jquery-datetimepicker-css'); wp_register_script('ttt-util-js', TTT_URL . 'assets/js/util.js', array('jquery', 'ttt-select2')); $localize_array = array( 'ajax_url' => admin_url('admin-ajax.php'), ); wp_localize_script('ttt-util-js', 'ttt_util_script_params', $localize_array); wp_enqueue_script('ttt-util-js'); wp_register_script('ttt-frontend-js', TTT_URL . 'assets/js/frontend.js', array('jquery', 'ttt-select2', 'ttt-util-js')); $localize_array = array( 'ajax_url' => admin_url('admin-ajax.php'), 'class_max_pref_dates' => (get_option('ttt-max_pref_test_dates') ?: 3), 'frontend_strings' => array( 'ajax_error_str' => __('Fout bij communicatie met de server. Probeer het opnieuw.', 'ttt-ld'), 'confirm_delete_pref_date' => __('Weet u zeker dat u deze datum wilt verwijderen?', 'ttt-ld'), 'pref_date_exists' => __('Deze datum is al toegevoegd!', 'ttt-ld'), 'msg_file_uploaded' => __('Bestand geüpload!', 'ttt-ld'), 'lbl_close' => __('Sluiten', 'ttt-ld'), 'lbl_open' => __('Openen', 'ttt-ld'), 'lbls_datepicker_daysmin' => array( _x('Z', 'Sunday', 'ttt-ld'), _x('M', 'Monday', 'ttt-ld'), _x('D', 'Tuesday', 'ttt-ld'), _x('W', 'Wednesday', 'ttt-ld'), _x('D', 'Thursday', 'ttt-ld'), _x('V', 'Friday', 'ttt-ld'), _x('Z', 'Saturday', 'ttt-ld'), ), 'lbl_datepicker_next' => __('>', 'ttt-ld'), 'lbl_datepicker_prev' => __('<', 'ttt-ld'), ), ); wp_localize_script('ttt-frontend-js', 'ttt_script_params', $localize_array); wp_enqueue_script('ttt-frontend-js'); if(is_page() && get_post_meta(get_the_ID(), 'ttt_page_name', true) == 'consent_form') { wp_enqueue_script('signature-pad-js', 'https://cdnjs.cloudflare.com/ajax/libs/signature_pad/1.3.5/signature_pad.min.js'); wp_register_script('ttt-consent-form-js', TTT_URL . 'assets/js/consentform.js', array('jquery', 'ttt-select2', 'signature-pad-js', 'ttt-util-js')); $localize_array = array( 'ajax_url' => admin_url('admin-ajax.php'), 'frontend_strings' => array( 'ajax_error_str' => __('Fout bij communicatie met de server. Probeer het opnieuw.', 'ttt-ld'), 'required_fields' => __('Vul de ontbrekende velden in.', 'ttt-ld'), 'no_signature' => __('Onderteken a.u.b. het formulier.', 'ttt-ld'), ), ); wp_localize_script('ttt-consent-form-js', 'ttt_form_script_params', $localize_array); wp_enqueue_script('ttt-consent-form-js'); } } /* HOOK: enqueue admin scripts and styles */ add_action('admin_enqueue_scripts', 'ttt_enqueue_scripts_admin'); function ttt_enqueue_scripts_admin() { wp_register_style('ttt-admin-css', TTT_URL . 'admin/css/plugin-admin.css', false, TTT_VERSION); wp_enqueue_style('ttt-admin-css'); wp_register_script('ttt-admin-js', TTT_URL . 'admin/js/plugin-admin.js', array('jquery')); $localize_array = array( 'ajax_url' => admin_url('admin-ajax.php'), /* translateable strings */ 'msg_cf_delete_student_from_class' => __('Weet je zeker dat je deze leerling uit deze groep wilt verwijderen?', 'ttt-ld'), 'msg_cf_delete_student_consent' => __('Weet je zeker dat je het toestemmingsformulier voor deze leerling wilt verwijderen?', 'ttt-ld'), 'msg_student_consent_deleted' => __('Toestemmingsformulier verwijderd!', 'ttt-ld'), ); wp_localize_script('ttt-admin-js', 'ttt_admin_script_params', $localize_array); wp_enqueue_script('ttt-admin-js'); } /* HOOK: register admin settings */ add_action('admin_init', 'ttt_register_settings'); function ttt_register_settings() { register_setting('ttt-settings-group', 'ttt_sender_name'); register_setting('ttt-settings-group', 'ttt_sender_email'); register_setting('ttt-settings-group', 'ttt_sender_replyto'); register_setting('ttt-settings-group', 'ttt-max_pref_test_dates'); register_setting('ttt-settings-group', 'ttt-enabled_roles'); /* form settings */ register_setting('ttt-settings-consentform-group', 'ttt-online-form-headertext'); register_setting('ttt-settings-consentform-group', 'ttt-online-form-footertext'); register_setting('ttt-settings-consentform-group', 'ttt-online-form-title'); register_setting('ttt-settings-consentform-group', 'ttt-consent-form-headertext'); register_setting('ttt-settings-consentform-group', 'ttt-consent-form-footertext'); register_setting('ttt-settings-consentform-group', 'ttt-consent-form-title'); register_setting('ttt-settings-consentform-group', 'ttt-max_consent_uploadsize'); register_setting('ttt-settings-consentform-group', 'ttt-result-form-headertext'); register_setting('ttt-settings-consentform-group', 'ttt-result-form-footertext'); register_setting('ttt-settings-consentform-group', 'ttt-result-form-title'); register_setting('ttt-settings-consentform-group', 'ttt-result-form-class-headertext'); register_setting('ttt-settings-consentform-group', 'ttt-result-form-class-title'); /* updated results form settings */ register_setting('ttt-settings-consentform-group', 'ttt-color_not-indicated'); register_setting('ttt-settings-consentform-group', 'ttt-color_further-research-required'); register_setting('ttt-settings-consentform-group', 'ttt-color_indicated'); /* batch */ $score_items = array('language_apprehension', 'auditive_memory', 'vocabulary', 'sentence_phrasing', 'articulation'); foreach($score_items as $score_item_key) { register_setting('ttt-settings-consentform-group', 'ttt-threshold_'.$score_item_key.'_red'); register_setting('ttt-settings-consentform-group', 'ttt-threshold_'.$score_item_key.'_orange'); } } /* HOOK: register admin settings page */ add_action('admin_menu', 'ttt_settings_optionspage'); function ttt_settings_optionspage() { add_menu_page( __('Instellingen', 'ttt-ld').' '.TTT_NAME, TTT_NAME, 'manage_options', 'ttt-settings', 'ttt_settingspage_render', 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI1LjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCA1MCA1MC42IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MCA1MC42OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO2ZpbGw6IzAwMjEyRTt9Cgkuc3Qxe2ZpbGw6IzAwMjEyRTt9Cjwvc3R5bGU+CjxnPgoJPHBhdGggaWQ9IkNvbWJpbmVkLVNoYXBlIiBjbGFzcz0ic3QwIiBkPSJNNDAuNyw0NWMtNC4zLDMuNS05LjcsNS42LTE1LjcsNS42Yy02LjEsMC0xMS43LTIuMi0xNi4xLTUuOWw4LjUtOC42CgkJYzIuMSwxLjUsNC43LDIuNCw3LjUsMi40YzIuNiwwLDUtMC44LDcuMS0yLjFMNDAuNyw0NXogTTQzLjYsNDIuMmwtOC41LTguNmMxLjgtMi4zLDIuOS01LjIsMi45LTguM2MwLTYuOS01LjMtMTIuNi0xMi0xMy4xVjAKCQljMTMuMywwLjUsMjQsMTEuNiwyNCwyNS4zQzUwLDMxLjgsNDcuNiwzNy43LDQzLjYsNDIuMnogTTYuMSw0MS44QzIuMywzNy40LDAsMzEuNiwwLDI1LjNjMC0xMyw5LjYtMjMuNiwyMi0yNS4xdjEyLjMKCQljLTUuNywxLjQtMTAsNi42LTEwLDEyLjhjMCwzLDEsNS43LDIuNiw3LjlMNi4xLDQxLjh6Ii8+CjwvZz4KPGc+Cgk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNMTguMSwxNy45YzAsMCwxLDAsMC45LDIuOWMtMC4yLDQtMS41LDkuMywyLjEsMTJjMCwwLDMsMS41LDUuMiwwLjRzMi44LTQuNSwwLjYtOS4yCgkJQzI0LjksMjAsMTguNSwxNy43LDE4LjEsMTcuOXoiLz4KCTxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0yOS4zLDE1LjljMCwwLDAuOSwwLjktMS42LDMuMXMtOS4yLDYuNy04LjMsMTEuN2MwLDAsMC4yLDEuOSwyLjksMi42czcuMi0wLjQsOS4xLTYKCQlDMzMuMSwyMi42LDI5LjksMTYsMjkuMywxNS45eiIvPgoJPHBhdGggY2xhc3M9InN0MSIgZD0iTTMwLjUsMzIuMWMwLDAtMC42LDAuNi0yLjEsMC45Yy0xLjMsMC4yLTMuNiwxLjQtMy42LDEuNGwtMS4xLDAuM2MwLDAtMC41LDAuMi0wLjEtMC4yCgkJYzAuNC0wLjQsMS41LTAuOCwxLjUtMC44czEuMy0wLjksMy4xLTEuM2MxLjUtMC4zLDEuNi0wLjUsMS42LTAuNVMzMS4yLDMxLjEsMzAuNSwzMi4xeiIvPgo8L2c+Cjwvc3ZnPg==', 2 ); add_submenu_page( 'ttt-settings', TTT_NAME.' '.__('activiteit', 'ttt-ld'), __('Activiteit', 'ttt-ld'), 'manage_options', 'ttt-activity', 'ttt_activitypage_render', 20 ); add_submenu_page( 'ttt-settings', TTT_NAME.' '.__('toestemmingsformulier', 'ttt-ld'), __('Formulieren', 'ttt-ld'), 'manage_options', 'ttt-consent', 'ttt_consentformpage_render', 20 ); } /* HOOK: register plugin action link */ add_filter('plugin_action_links_'.plugin_basename(__FILE__), 'ttt_add_action_links'); function ttt_add_action_links($links) { $plugin_action_links = array( ''.__('Instellingen', 'ttt-ld').'', ); return array_merge($links, $plugin_action_links); } add_filter('use_block_editor_for_post', '__return_false', 10);