<?php

function pmai_is_acf_update_allowed( $cur_meta_key, $options ){

	if ($options['update_acf_logic'] == 'full_update') return apply_filters('pmai_is_acf_update_allowed', true, $cur_meta_key, $options);	

	global $acf;

	if ($acf and version_compare($acf->settings['version'], '5.0.0') >= 0){

		// Update only these ACF, leave the rest alone
		if ($options['update_all_data'] == 'no' and $options['is_update_acf'] and $options['update_acf_logic'] == 'only'){			

			$is_acf_update_allowed = false;

			if (! empty($options['acf_list']) and is_array($options['acf_list'])){
				foreach ($options['acf_list'] as $key => $acf_field) {				
					$field_name = trim(array_shift(explode(" ", $acf_field)), "[]");												
					if ( $cur_meta_key == $field_name or $cur_meta_key == "_" . $field_name or preg_match('%'.$field_name.'%_[0-9]{1,}_', $cur_meta_key) or strpos($cur_meta_key, '_' . $field_name . '_') === 0 or preg_match('%.*_[0-9]{1,}_'.$field_name.'$%', $cur_meta_key)){
						$is_acf_update_allowed = true;					
						break;
					}				
				}								
			}		
			
			return apply_filters('pmai_is_acf_update_allowed', $is_acf_update_allowed, $cur_meta_key, $options);		

		}

		// Leave these ACF alone, update all other ACF
		if ($options['update_all_data'] == 'no' and $options['is_update_acf'] and $options['update_acf_logic'] == 'all_except'){
			
			if (! empty($options['acf_list']) and is_array($options['acf_list'])){
				foreach ($options['acf_list'] as $key => $acf_field) {
					$field_name = trim(array_shift(explode(" ", $acf_field)), "[]");
					if ( $cur_meta_key == $field_name or $cur_meta_key == "_" . $field_name or preg_match('%'.$field_name.'%_[0-9]{1,}_', $cur_meta_key) or strpos($cur_meta_key, '_' . $field_name . '_') === 0 or preg_match('%.*_[0-9]{1,}_'.$field_name.'$%', $cur_meta_key)){
						return apply_filters('pmai_is_acf_update_allowed', false, $cur_meta_key, $options);
						break;
					}
				}
			}		
		}

		// Update only mapped ACF fields
		if ($options['update_all_data'] == 'no' and $options['is_update_acf'] and $options['update_acf_logic'] == 'mapped'){
				
			$mapped_acf = $options['acf'];

			if ( ! empty($mapped_acf)){			
				foreach ($mapped_acf as $acf_group_id => $is_mapped) {				
					if ( ! $is_mapped ) continue;				
					$acf_fields = get_posts(array('posts_per_page' => -1, 'post_type' => 'acf-field', 'post_parent' => $acf_group_id, 'post_status' => 'publish'));
					if ( ! empty($acf_fields) ){
						foreach ($acf_fields as $field) {
							if ( $cur_meta_key == $field->post_excerpt or $cur_meta_key == "_" . $field->post_excerpt or strpos($cur_meta_key, $field->post_excerpt . '_') === 0 or strpos($cur_meta_key, '_' . $field->post_excerpt . '_') === 0){
								return apply_filters('pmai_is_acf_update_allowed', true, $cur_meta_key, $options);
								break;
							}
						}				
					}
				}			
			}

			return apply_filters('pmai_is_acf_update_allowed', false, $cur_meta_key, $options);	
		}

		return apply_filters('pmai_is_acf_update_allowed', true, $cur_meta_key, $options);
		
	}
	else{

		// Update only these ACF, leave the rest alone
		if ($options['update_all_data'] == 'no' and $options['is_update_acf'] and $options['update_acf_logic'] == 'only'){
			
			if (! empty($options['acf_list']) and is_array($options['acf_list'])){
				foreach ($options['acf_list'] as $key => $acf_field) {
					$field_parts = explode('---', $acf_field);					
					$parts_temp = explode(" ", $field_parts[0]);
					$field_name = trim(array_shift($parts_temp), "[]");				
					if (!empty($field_parts[1])){
						$sub_field_name = trim($field_parts[1], "[]");
						if (preg_match('%^_{0,1}'.$field_name.'_[0-9]{1,}_'.$sub_field_name.'$%', $cur_meta_key)){
							return apply_filters('pmai_is_acf_update_allowed', true, $cur_meta_key, $options);
							break;
						}
					}
					elseif ( preg_match('%^_{0,1}'.$field_name.'$%', $cur_meta_key) ){
						return apply_filters('pmai_is_acf_update_allowed', true, $cur_meta_key, $options);
						break;
					}				
				}
				return apply_filters('pmai_is_acf_update_allowed', false, $cur_meta_key, $options);
			}					

		}

		// Leave these ACF alone, update all other ACF
		if ($options['update_all_data'] == 'no' and $options['is_update_acf'] and $options['update_acf_logic'] == 'all_except'){
			
			if (! empty($options['acf_list']) and is_array($options['acf_list'])){
				foreach ($options['acf_list'] as $key => $acf_field) {
					$field_parts = explode('---', $acf_field);
					$field_name = trim(array_shift(explode(" ", $field_parts[0])), "[]");
					if (!empty($field_parts[1])){
						$sub_field_name = trim($field_parts[1], "[]");
						if (preg_match('%^_{0,1}'.$field_name.'_[0-9]{1,}_'.$sub_field_name.'$%', $cur_meta_key)){
							return apply_filters('pmai_is_acf_update_allowed', false, $cur_meta_key, $options);
							break;
						}
					}
					elseif ( preg_match('%^_{0,1}'.$field_name.'$%', $cur_meta_key) ){
						return apply_filters('pmai_is_acf_update_allowed', false, $cur_meta_key, $options);
						break;
					}
				}
			}		
		}

		// Update only mapped ACF fields
		if ($options['update_all_data'] == 'no' and $options['is_update_acf'] and $options['update_acf_logic'] == 'mapped'){
				
			$mapped_acf = $options['acf'];

			if ( ! empty($mapped_acf)){			
				
				$all_acf_fields = array();

				foreach ($mapped_acf as $acf_group_id => $is_mapped) {				
					if ( ! $is_mapped ) continue;
					$acf_fields = get_post_meta($acf_group_id, '');
					if (!empty($acf_fields)){
						foreach ($acf_fields as $meta_key => $cur_meta_val){
							
							if (strpos($meta_key, 'field_') !== 0) continue;

							$field = (!empty($cur_meta_val[0])) ? unserialize($cur_meta_val[0]) : array();

							if ( ! in_array($field['name'], $all_acf_fields) ) $all_acf_fields[] = $field['name'];

							if (!empty($field['sub_fields'])){
								foreach ($field['sub_fields'] as $sub_field) {
									if ( ! in_array($sub_field['name'], $all_acf_fields) ) $all_acf_fields[] = $sub_field['name'];		
								}
							}
						}
					}
				}
				if ( in_array($cur_meta_key, $all_acf_fields)){
					foreach ($mapped_acf as $acf_group_id => $is_mapped) {				
						if ( ! $is_mapped ) continue;
						$acf_fields = get_post_meta($acf_group_id, '');
						if (!empty($acf_fields)){
							foreach ($acf_fields as $meta_key => $cur_meta_val){
								
								if (strpos($meta_key, 'field_') !== 0) continue;
								
								$field = (!empty($cur_meta_val[0])) ? unserialize($cur_meta_val[0]) : array();

								if ( preg_match('%^_{0,1}'.$field['name'].'$%', $cur_meta_key) ){
									return apply_filters('pmai_is_acf_update_allowed', true, $cur_meta_key, $options);
									break;
								}

								if (!empty($field['sub_fields'])){
									foreach ($field['sub_fields'] as $sub_field) {
										if (preg_match('%^_{0,1}'.$field['name'].'_[0-9]{1,}_'.$sub_field['name'].'$%', $cur_meta_key)){
											return apply_filters('pmai_is_acf_update_allowed', true, $cur_meta_key, $options);
											break;
										}
									}
								}
							}
						}
					}
					return apply_filters('pmai_is_acf_update_allowed', false, $cur_meta_key, $options);
				}			
			}
		}

		return apply_filters('pmai_is_acf_update_allowed', true, $cur_meta_key, $options);		

	}
	
}

?>