page_id = 'fields';
$this->c_type = 'classic';
$this->section_id = 'billing';
$this->tabs = array(
'fields' => __('Checkout Fields', 'woo-checkout-field-editor-pro'),
//'block_fields' => __('Block 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']) ? sanitize_text_field(wp_unslash($_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');
$this->print_notices(__('Checkout fields successfully reset', 'woo-checkout-field-editor-pro'), 'updated');
}
public function render_page(){
$this->output_tabs();
$this->render_checkout_types();
$this->output_sections();
$this->output_content();
}
public function render_checkout_fields_heading_row(){
?>
+
get_current_section();
$action = isset($_POST['f_action']) ? sanitize_text_field(wp_unslash($_POST['f_action'])) : false;
if($action === 'new')
echo esc_html($this->save_or_update_field($section, $action));
if($action === 'edit')
echo esc_html($this->save_or_update_field($section, $action));
if(isset($_POST['save_fields']))
echo esc_html($this->save_fields($section));
if(isset($_POST['reset_fields']))
$this->reset_to_default();
$fields = THWCFD_Utils::get_fields($section);
?>
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']) ? sanitize_text_field(wp_unslash($_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);
THWCFD_Utils::setup_advanced_settings();
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']) ? sanitize_text_field(wp_unslash($_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);
THWCFD_Utils::setup_advanced_settings();
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(THWCFD_Utils::translate_dynamic_text($field['label'], 'label')) : $name;
$html .= ''. esc_html($label) .': '. wp_kses_post(wptexturize($value)) .'
';
}
}
}
if($html){
echo ''.wp_kses_post($prefix_html.$html).'
';
}
}
}
/******* TABS & SECTIONS *******/
/*******************************/
public function get_current_tab(){
return isset( $_GET['tab'] ) ? sanitize_key( $_GET['tab'] ) : 'fields';
}
public function get_current_c_type(){
return isset( $_GET['c_type'] ) ? sanitize_key( $_GET['c_type'] ) : 'classic';
}
public function get_current_section(){
$tab = $this->get_current_tab();
$c_type = $this->get_current_c_type();
$section = '';
if($tab === 'fields' && $c_type === 'classic'){
$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 '';
foreach( $this->tabs as $id => $label ){
$active = ( $current_tab == $id ) ? 'nav-tab-active' : '';
//$label = __($label, 'woo-checkout-field-editor-pro');
echo ''. esc_html($label).' ';
}
echo ' ';
}
public function render_checkout_types(){
$selected_checkout = $this->get_current_c_type();
$c_url = $this->get_admin_url($this->page_id, 'classic');
$b_url = $this->get_admin_url($this->page_id, 'block');
$tt_content = esc_html("You're on the Classic Checkout Field Editor right now. If your store is not using Classic Checkout, fields you add here won’t appear on the checkout page. Unsure which checkout type your store is using?", 'woo-checkout-field-editor-pro');
if ( !empty( $_GET['c_type'] ) && 'block' == sanitize_key($_GET['c_type'] )) {
$tt_content = esc_html("You're on the Block Checkout Field Editor right now. If your store is not using Block Checkout, fields you add here won’t appear on the checkout page. Unsure which checkout type your store is using?", 'woo-checkout-field-editor-pro');
}
?>
get_current_tab();
$current_section = $this->get_current_section();
if(empty($this->sections)){
return;
}
$array_keys = array_keys( $this->sections );
echo '';
foreach( $this->sections as $id => $label ){
// $label = __($label, 'woo-checkout-field-editor-pro');
$url = $this->get_admin_url($current_tab, $this->c_type, sanitize_title($id));
echo ''. esc_html($label) .' '. (end( $array_keys ) == $id ? '' : '|') .' ';
}
echo ' ';
// if($result){
// echo $result;
// }
}
public function get_admin_url($tab = false, $c_type = false, $section = false){
$url = 'admin.php?page=checkout_form_designer';
if($tab && !empty($tab)){
$url .= '&tab='. $tab;
}
if($c_type && !empty($c_type)){
$url .= '&c_type='. $c_type;
}
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;