page_id = 'fields'; $this->section_id = 'billing'; $this->tabs = array( 'fields' => __('Checkout Fields', 'woo-checkout-field-editor-pro'), 'advanced_settings' => __('Advanced Settings', 'woo-checkout-field-editor-pro'), 'pro' => __('Premium Features', 'woo-checkout-field-editor-pro'), 'themehigh_plugins' => __('Other Free Plugins', 'woo-checkout-field-editor-pro'), ); $this->sections = array( 'billing' => __('Billing Fields', 'woo-checkout-field-editor-pro'), 'shipping' => __('Shipping Fields', 'woo-checkout-field-editor-pro'), 'additional' => __('Additional Fields', 'woo-checkout-field-editor-pro'), ); } public static function instance() { if(is_null(self::$_instance)){ self::$_instance = new self(); } return self::$_instance; } public function define_admin_hooks(){ // Show in order details page add_action('woocommerce_admin_order_data_after_order_details', array($this, 'order_data_after_order_details'), 20, 1); add_action('woocommerce_admin_order_data_after_billing_address', array($this, 'order_data_after_billing_address'), 20, 1); add_action('woocommerce_admin_order_data_after_shipping_address', array($this, 'order_data_after_shipping_address'), 20, 1); } public function init(){ $this->field_form = new THWCFD_Admin_Form_Field(); $this->field_form_props = $this->field_form->get_field_form_props(); $this->render_page(); } public function reset_to_default() { $nonse = isset($_REQUEST['thwcfd_security_manage_fields']) ? $_REQUEST['thwcfd_security_manage_fields'] : false; $capability = THWCFD_Utils::wcfd_capability(); if(!wp_verify_nonce($nonse, 'thwcfd_section_fields') || !current_user_can($capability)){ die(); } delete_option('wc_fields_billing'); delete_option('wc_fields_shipping'); delete_option('wc_fields_additional'); return $this->print_notices(__('Checkout fields successfully reset', 'woo-checkout-field-editor-pro'), 'updated', true); } public function render_page(){ $this->output_tabs(); $this->output_sections(); $this->output_content(); } public function render_checkout_fields_heading_row(){ ?> get_current_section(); $action = isset($_POST['f_action']) ? $_POST['f_action'] : false; if($action === 'new') echo $this->save_or_update_field($section, $action); if($action === 'edit') echo $this->save_or_update_field($section, $action); if(isset($_POST['save_fields'])) echo $this->save_fields($section); if(isset($_POST['reset_fields'])) echo $this->reset_to_default(); $fields = THWCFD_Utils::get_fields($section); ?>

render_actions_row($section); ?>render_checkout_fields_heading_row(); ?>render_checkout_fields_heading_row(); ?>render_actions_row($section); ?> $field ) : $type = isset($field['type']) ? $field['type'] : ''; $label = isset($field['label']) ? $field['label'] : ''; $placeholder = isset($field['placeholder']) ? $field['placeholder'] : ''; $validate = isset($field['validate']) ? $field['validate'] : ''; $required = isset($field['required']) && $field['required'] ? 1 : 0; $enabled = isset($field['enabled']) && $field['enabled'] ? 1 : 0; $custom = isset($field['custom']) && $field['custom'] ? 1 : 0; $validate = is_array($validate) ? implode(",", $validate) : ''; $required_status = $required ? '' : '-'; $enabled_status = $enabled ? '' : '-'; $props_json = htmlspecialchars($this->get_property_set_json($name, $field)); //$options_json = isset($field['options_json']) && $field['options_json'] ? htmlspecialchars($field['options_json']) : ''; $options_json = ''; if($type === 'select' || $type === 'radio' || $type === 'checkboxgroup' || $type === 'multiselect'){ $options = isset($field['options']) ? $field['options'] : ''; $options_json = THWCFD_Utils::prepare_options_json($options); } ?>
field_form->output_field_forms(); } public function get_property_set_json($name, $field){ $json = ''; if(is_array($field)){ foreach($field as $pname => $pvalue){ $pvalue = is_array($pvalue) ? implode(',', $pvalue) : $pvalue; $pvalue = is_string($pvalue) ? esc_attr($pvalue) : $pvalue; $field[$pname] = $pvalue; } $field['name'] = $name; $json = json_encode($field); } return $json; } private function save_or_update_field($section, $action) { $nonse = isset($_REQUEST['thwcfd_security_manage_field']) ? $_REQUEST['thwcfd_security_manage_field'] : false; $capability = THWCFD_Utils::wcfd_capability(); if(!wp_verify_nonce($nonse, 'thwcfd_field_form') || !current_user_can($capability)){ die(); } try { $result = false; $fields = THWCFD_Utils::get_fields($section); $field = $this->prepare_field_from_posted_data($_POST); $this->add_wpml_support($field); $name = isset($field['name']) ? $field['name'] : false; if($name){ if($action === 'new'){ $priority = THWCFD_Utils::prepare_field_priority($fields, false, true); $field['custom'] = 1; $field['priority'] = $priority; }else{ $oname = isset($_POST['i_oname']) ? sanitize_key($_POST['i_oname']) : false; if($name && $oname && $name !== $oname ){ unset($fields[$oname]); } } $fields[$name] = $field; } $result = THWCFD_Utils::update_fields($section, $fields); if($result == true) { $this->print_notices(__('Your changes were saved.', 'woo-checkout-field-editor-pro' ), 'updated'); }else { $this->print_notices(__('Your changes were not saved due to an error (or you made none!).', 'woo-checkout-field-editor-pro'), 'error'); } } catch (Exception $e) { $this->print_notices(__('Your changes were not saved due to an error.', 'woo-checkout-field-editor-pro'), 'error'); } } private function save_fields($section) { $nonse = isset($_REQUEST['thwcfd_security_manage_fields']) ? $_REQUEST['thwcfd_security_manage_fields'] : false; $capability = THWCFD_Utils::wcfd_capability(); if(!wp_verify_nonce($nonse, 'thwcfd_section_fields') || !current_user_can($capability)){ die(); } try { $f_names = !empty( $_POST['f_name'] ) ? $_POST['f_name'] : array(); $f_names = array_map('sanitize_key', $f_names); if(empty($f_names)){ $this->print_notices(__('Your changes were not saved due to no fields found.', 'woo-checkout-field-editor-pro'), 'error'); return; } $f_order = !empty( $_POST['f_order'] ) ? $_POST['f_order'] : array(); $f_order = array_map('absint', $f_order); $f_deleted = !empty( $_POST['f_deleted'] ) ? $_POST['f_deleted'] : array(); $f_deleted = array_map('absint', $f_deleted); $f_enabled = !empty( $_POST['f_enabled'] ) ? $_POST['f_enabled'] : array(); $f_enabled = array_map('absint', $f_enabled); $fields = THWCFD_Utils::get_fields($section); $max = max( array_map( 'absint', array_keys( $f_names ) ) ); for($i = 0; $i <= $max; $i++) { $name = $f_names[$i]; if(isset($fields[$name])){ $is_deleted = isset($f_deleted[$i]) && $f_deleted[$i] ? true : false; if($is_deleted){ unset($fields[$name]); continue; } $order = isset($f_order[$i]) ? $f_order[$i] : 0; $enabled = isset($f_enabled[$i]) ? $f_enabled[$i] : 0; $priority = THWCFD_Utils::prepare_field_priority($fields, $order, false); $field = $fields[$name]; $field['priority'] = $priority; $field['enabled'] = $enabled; $fields[$name] = $field; } } $fields = THWCFD_Utils::sort_fields($fields); $result = THWCFD_Utils::update_fields($section, $fields); if($result == true) { $this->print_notices(__('Your changes were saved.', 'woo-checkout-field-editor-pro'), 'updated'); }else { $this->print_notices(__('Your changes were not saved due to an error (or you made none!).', 'woo-checkout-field-editor-pro'), 'error'); } } catch (Exception $e) { $this->print_notices(__('Your changes were not saved due to an error.', 'woo-checkout-field-editor-pro'), 'error'); } } private function prepare_field_from_posted_data($posted){ $field_props = $this->field_form_props; $field = array(); foreach ($field_props as $pname => $prop) { $iname = 'i_'.$pname; $pvalue = ''; if($prop['type'] === 'checkbox'){ $pvalue = isset($posted[$iname]) && $posted[$iname] ? 1 : 0; }else if(isset($posted[$iname])){ //$pvalue = is_array($posted[$iname]) ? implode(',', $posted[$iname]) : trim(stripslashes($posted[$iname])); // $pvalue = is_array($posted[$iname]) ? $posted[$iname] : trim(stripslashes($posted[$iname])); if(($pname === 'type') || ($pname === 'name')){ $pvalue = !empty($posted[$iname]) ? sanitize_key($posted[$iname]) : ""; }else if(($pname === 'label')){ //$pvalue = !empty($posted[$iname]) ? htmlentities(stripslashes($posted[$iname])) : ""; $pvalue = !empty($posted[$iname]) ? wp_unslash(wp_filter_post_kses($posted[$iname])) : ""; }else if(($pname === 'validate')){ $pvalue = !empty($posted[$iname]) ? (array) $posted[$iname] : array(); $pvalue = array_map( 'sanitize_key', $pvalue ); }else if($pname === 'class'){ //$pvalue = is_string($pvalue) ? array_map('trim', explode(',', $pvalue)) : $pvalue; $pvalue = !empty($posted[$iname]) ? $posted[$iname] : ''; $pvalue = is_string($pvalue) ? preg_split('/(\s*,*\s*)*,+(\s*,*\s*)*/', $pvalue) : array(); $pvalue = array_map('sanitize_key', $pvalue); }else{ $pvalue = !empty($posted[$iname]) ? sanitize_text_field(wp_unslash($posted[$iname])) : ""; } } $field[$pname] = $pvalue; } $type = isset($field['type']) ? $field['type'] : ''; if(!$type){ $type = isset($posted['i_otype']) ? sanitize_key($posted['i_otype']) : ''; $field['type'] = $type; } $name = isset($field['name']) ? $field['name'] : ''; if(!$name){ $field['name'] = isset($posted['i_oname']) ? sanitize_key($posted['i_oname']) : ''; } if($type === 'select' || $type === 'multiselect'){ $field['validate'] = ''; }else if($type === 'radio'){ $field['validate'] = ''; $field['placeholder'] = ''; }else if($type === 'number'){ $field['validate'] = array('number'); }else if($type === 'checkbox'){ if(isset($posted['i_default'])){ $field['default'] = sanitize_text_field($posted['i_default']); }else{ $field['default'] = ''; } } if($type === 'select' || $type === 'radio' || $type === 'checkboxgroup' || $type === 'multiselect'){ $options_json = isset($posted['i_options_json']) ? trim(stripslashes($posted['i_options_json'])) : ''; $options_arr = THWCFD_Utils::prepare_options_array($options_json, $type); $keys = array_keys($options_arr); // $keys = array_map('sanitize_key', $keys); $keys = array_map('sanitize_text_field', $keys); $values = array_values($options_arr); $values = array_map('htmlspecialchars', $values); $options_arr = array_combine($keys, $values); $field['options'] = $options_arr; // // Sanitize default value same like option values // $default_value = isset($field['default']) ? $field['default'] : ''; // if($default_value){ // $field['default'] = sanitize_key($default_value); // } }else{ $field['options'] = ''; } $field['autocomplete'] = isset($posted['i_autocomplete']) ? sanitize_text_field($posted['i_autocomplete']) : ''; $field['priority'] = isset($posted['i_priority']) ? absint($posted['i_priority']) : ''; //$field['custom'] = isset($posted['i_custom']) ? $posted['i_custom'] : ''; $field['custom'] = isset($posted['i_custom']) && $posted['i_custom'] ? 1 : 0; return $field; } /******* Display & Update Field Values *******/ /*********************************************/ public function order_data_after_order_details($order){ $fields = THWCFD_Utils::get_fields('additional'); //$this->display_fields_in_admin_order($order, $fields, '

 

'); $this->display_fields_in_admin_order($order, $fields, ''); } public function order_data_after_billing_address($order){ $fields = THWCFD_Utils::get_fields('billing'); $this->display_fields_in_admin_order($order, $fields, ''); } public function order_data_after_shipping_address($order){ $fields = THWCFD_Utils::get_fields('shipping'); $this->display_fields_in_admin_order($order, $fields, ''); } public function display_fields_in_admin_order($order, $fields, $prefix_html = ''){ if(is_array($fields)){ $html = ''; $order_id = THWCFD_Utils::get_order_id($order); foreach($fields as $name => $field){ if(THWCFD_Utils::is_active_custom_field($field) && isset($field['show_in_order']) && $field['show_in_order'] && !THWCFD_Utils::is_wc_handle_custom_field($field)){ $order = wc_get_order( $order_id ); // $value = get_post_meta( $order_id, $key, true ); $value = $order->get_meta( $name, true ); if(!empty($value)){ $value = THWCFD_Utils::get_option_text($field, $value); $label = isset($field['label']) && $field['label'] ? esc_html($field['label'], 'woo-checkout-field-editor-pro') : $name; $html .= '

'. $label .':
'. wptexturize($value) .'

'; } } } if($html){ echo '
'.$prefix_html.$html.'
'; } } } /******* TABS & SECTIONS *******/ /*******************************/ public function get_current_tab(){ return isset( $_GET['tab'] ) ? sanitize_key( $_GET['tab'] ) : 'fields'; } public function get_current_section(){ $tab = $this->get_current_tab(); $section = ''; if($tab === 'fields'){ $section = isset( $_GET['section'] ) ? sanitize_key( $_GET['section'] ) : 'billing'; } return $section; } public function output_tabs(){ $current_tab = $this->get_current_tab(); if(empty($this->tabs)){ return; } echo ''; } public function output_sections() { $result = false; $current_tab = $this->get_current_tab(); $current_section = $this->get_current_section(); if(empty($this->sections)){ return; } $array_keys = array_keys( $this->sections ); echo ''; if($result){ echo $result; } } public function get_admin_url($tab = false, $section = false){ $url = 'admin.php?page=checkout_form_designer'; if($tab && !empty($tab)){ $url .= '&tab='. $tab; } if($section && !empty($section)){ $url .= '§ion='. $section; } return admin_url($url); } private function add_wpml_support($field){ $context = 'woo-checkout-field-editor-pro'; $label = isset($field['label']) ? $field['label'] : ''; if($label){ $name = 'Field label - ' . $label; do_action( 'wpml_register_single_string', 'woo-checkout-field-editor-pro', $name, $label ); } $placeholder = isset($field['placeholder']) ? $field['placeholder'] : ''; if($placeholder){ $name = 'Field placeholder - ' . $placeholder; do_action( 'wpml_register_single_string', 'woo-checkout-field-editor-pro', $name, $placeholder ); } $options = isset($field['options']) ? $field['options'] : ''; if($options){ if(is_array($options)){ $index = 0; foreach($options as $option_value => $option_text){ $name = 'Field option text - ' . $option_text; do_action( 'wpml_register_single_string', 'woo-checkout-field-editor-pro', $name, $option_text ); $index++; } } } } } endif;