except id accessed by divi * - and finally filter the format step * (which is not triggered by admin output) * to prevent formating if accessed by divi * (so it will print the metadata instead) * */ /* * 1. this function will replace the date value by the one in acf format * for dates created by divi form builder * * 118 : ../../../../wordpress_docker/volumes/wp_volume/wp-content/plugins/advanced-custom-fields/includes/acf-value-functions.php * * we can either use filter 'acf/load_value' or 'acf/pre_load_value' * - 'acf/pre_load_value' : * it fires first, and will short-circuit the function to get the value * it is useful to force the acf_date value to be always the same, * otherwise acf uses some kind of cach system, * so the value would be evaluated once then it would always be the same on the page : maybe it's alright ? * - 'acf/load_value' : * using this filter, the value is cached, as explained above * - note : the first argument '$value' is actually a little misleading : * - in case of the second filter, * it is indeed tha value that has already been retrieve and that we can override * - but for the first filter, it is actually 'null', * and if returned it will let the function go on to try to retrieve the value * */ function try_get_acf_date($value, $post_id, $field) { $acf_date_class = Fbpatch::ACF_DATE_CLASS; if ($field['type'] !== 'date_picker') { return $value; } if (!str_contains($field['wrapper']['class'], $acf_date_class)) { return $value; } $acf_date = Fbpatch::get_acf_date($post_id, $field['key']); //error_log("acf_date: " . json_encode($acf_date)); if ($acf_date === false) { return $value; } return $acf_date; } add_filter('acf/load_value', __NAMESPACE__.'\try_get_acf_date', 10, 3); //add_filter('acf/pre_load_value', __NAMESPACE__.'\try_get_acf_date', 10, 3); /* * load a jquery script to create a hidden field with the acf 'Ymd' date format * jquery date picker : * 7509 : ../../../../wordpress_docker/volumes/wp-volumes/wp-content/plugins/divi-form-builder/includes/modules/FormField/FormField.php * */ function add_form_builder_dates_patch() { $handle = 'form_builder_dates_patch'; $url = Fbpatch::root_url() . '/js/dates.js'; $dependencies = array('jquery-ui-datepicker'); $version = null; $defer = false; wp_enqueue_script($handle, $url, $dependencies, $version, $defer); } add_action('wp_enqueue_scripts', __NAMESPACE__.'\add_form_builder_dates_patch', 22); /* * action about the submited post before inserting (we cannot modify it unfortunately) * - find any datepicker * - add class to their object to identify they are used by form builder * - save the date in acf format 'Ymd' in the options * * -> the date is output in edit form - 7505 : ../../../../wordpress_docker/volumes/wp_volume/wp-content/plugins/divi-form-builder/includes/modules/FormField/FormField.php * -> 845 : ../../../../wordpress_docker/volumes/wp_volume/wp-content/plugins/divi-form-builder/includes/DiviFormBuilder.php * */ function process_form_acf_dates($form_id, $post_array) { $acf_field_start = 'acf_date_hidden_for_'; $acf_date_fields = \FBPATCH\array_has_keys_starting_with($acf_field_start, $post_array); if (empty($acf_date_fields)) { return; } foreach ($acf_date_fields as $field) { $acf_date = $post_array[$field]; $acf_field = substr($field, strlen($acf_field_start)); $new_date_text = $post_array['meta_input'][$acf_field]; $acf_key = $post_array['meta_input']['_'.$acf_field]; \FBPATCH\add_date_to_acf_object_class($acf_key, $acf_date); Fbpatch::update_acf_date($post_array['ID'], $acf_key, $acf_date); } } add_action('df_before_insert_post', __NAMESPACE__.'\process_form_acf_dates', 10, 2); /* * to update a field object (so, globally) * using `acf_update_field` * -> 980 : ../../../../wordpress_docker/volumes/wp_volume/wp-content/plugins/advanced-custom-fields/includes/acf-field-functions.php * */ function add_date_to_acf_object_class($acf_id) { $field = get_field_object($acf_id); $field_class = $field['wrapper']['class']; $field_classes = explode(' ', $field_class); $class = Fbpatch::ACF_DATE_CLASS; $field_classes = array_filter($field_classes, function($value) { $class = Fbpatch::ACF_DATE_CLASS; if (strpos($value, $class) !== 0) { return $value; } }); $field_classes[] = $class; $implode_class = implode(' ', $field_classes); $field['wrapper']['class'] = $implode_class; acf_update_field($field); } /* * here i use it to check if there are hidden field for acf dates * */ function array_has_keys_starting_with($needle, &$haystack) { $keys = array(); foreach ($haystack as $key => $value) { if (strpos($key, $needle) === 0) { $keys[] = $key; } } return $keys; } ?>