function soya_get_prev_post_terms($post_id)
{
    // $_SESSION['soya'] = $post_id;
    $post_terms_before = wp_get_post_terms($post_id, 'soya-range');
    //$_SESSION['post_terms'] = $post_term_before;
    //retrieve meta keys before just before updating
    $before_post_meta_keys = [];
    $parent_terms_keys = [];
    $child_terms_parent_keys = [];
    foreach ($post_terms_before as $term) {
        $term_id = $term->term_id;
        $term_slug = $term->slug;
        if (soya_is_term_child($term_id)) {
            $term_parent_id = soya_get_term_parent_id($term_id);
            $term_parent_range = soya_loop_term_depth($term_parent_id);
            $child_term_depth = soya_get_term_custom_field($term_id, 'soya_depth_meta');
            $term_parent_range['slug'] = $term_slug;
            $term_parent_range['depth'] = $child_term_depth;
            $child_terms_parent_keys[] = $term_parent_range;
        } else {
            $term_parent_range = soya_loop_term_depth($term_id);
            $parent_terms_keys[] = $term_parent_range;
        }
    }
    // form the meta keys
    if (isset($child_terms_parent_keys)) {
        foreach ($child_terms_parent_keys as $term_parent_range) {
            $term_depth = $term_parent_range['depth'];
            $term_slug = $term_parent_range['slug'];
            for ($i = 1; $i <= $term_depth; $i++) {
                unset($term_parent_range['slug']);
                unset($term_parent_range['depth']);
                foreach ($term_parent_range as $key => $label) {
                    $before_post_meta_keys[] = $i . '-' . $term_slug . '-' . $key;
                }
            }
        }
    }
    if (isset($parent_terms_keys)) {
        foreach ($parent_terms_keys as $term_parent_range) {
            foreach ($term_parent_range as $key => $label) {
                $before_post_meta_keys[] = $key;
            }
        }
    }
    $_SESSION['post_terms'] = $before_post_meta_keys;
}
/**
 * When the post is saved, saves our custom data.
 *
 * @param int $post_id The ID of the post being saved.
 */
function soya_save_meta_box_data($post_id)
{
    /*
     * We need to verify this came from our screen and with proper authorization,
     * because the save_post action can be triggered at other times.
     */
    // Check if our nonce is set.
    if (!isset($_POST['soya_meta_box_nonce'])) {
        return;
    }
    // Verify that the nonce is valid.
    if (!wp_verify_nonce($_POST['soya_meta_box_nonce'], 'soya_meta_box')) {
        return;
    }
    // If this is an autosave, our form has not been submitted, so we don't want to do anything.
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    // Check the user's permissions.
    if (isset($_POST['soya_feature']) && 'page' == $_POST['soya_feature']) {
        if (!current_user_can('edit_page', $post_id)) {
            return;
        }
    } else {
        if (!current_user_can('edit_post', $post_id)) {
            return;
        }
    }
    /* OK, it's safe for us to save the data now. */
    // Make sure that it is set.
    // get post terms ids
    $post_terms_ids = soya_get_post_terms_ids($post_id);
    //set up all post terms ranges
    $parent_post_terms_ranges = [];
    $child_post_terms_ranges = [];
    if (isset($post_terms_ids)) {
        foreach ($post_terms_ids as $post_term_id) {
            if (soya_is_term_child($post_term_id)) {
                // We want only parents ranges and slugs.
                $child_term_parent_id = esc_attr(soya_get_term_parent_id($post_term_id));
                $post_term_range = soya_loop_term_depth($child_term_parent_id);
                $post_child_term = get_term($post_term_id, 'soya-range');
                // $post_term_depth = count($post_term_range);
                $post_term_depth = soya_get_term_custom_field($post_term_id, 'soya_depth_meta');
                $post_term_slug = $post_child_term->slug;
                $post_term_range['depth'] = $post_term_depth;
                $post_term_range['slug'] = $post_term_slug;
                $child_post_terms_ranges[] = $post_term_range;
            } else {
                $post_term_range = soya_loop_term_depth($post_term_id);
                $parent_post_terms_ranges[] = $post_term_range;
            }
        }
    }
    //get keys from post terms ranges
    $all_meta_keys = [];
    $index = '';
    //Iterate for parent meta keys
    if (isset($parent_post_terms_ranges)) {
        foreach ($parent_post_terms_ranges as $post_term_range) {
            foreach ($post_term_range as $key => $label) {
                $all_meta_keys[] = $key;
            }
        }
    }
    // Build meta keys for child terms
    if (isset($child_post_terms_ranges)) {
        //$index = '';
        // $slug = '';
        foreach ($child_post_terms_ranges as $index => $post_term_range) {
            //get Depth and slug for each child term
            $indexi = $post_term_range['depth'];
            $post_child_term_slug = $post_term_range['slug'];
            // loop through each term's depth and get indices for meta keys
            for ($i = 1; $i <= $indexi; $i++) {
                //remove slug and depth from range arrange
                unset($post_term_range['slug']);
                unset($post_term_range['depth']);
                foreach ($post_term_range as $key => $label) {
                    // if($key != 'slug'):
                    $all_meta_keys[] = $i . '-' . $post_child_term_slug . '-' . $key;
                    // check for added fixed meta fields and save them too
                    if (has_action('soya_add_extra_meta_fields_' . $post_child_term_slug)) {
                        $all_meta_keys[] = $i . '-' . 'fixed-cost-' . $post_child_term_slug;
                    }
                }
            }
        }
    }
    // Apply filters
    $all_meta_keys = apply_filters('soya_filter_meta_keys', $all_meta_keys, $post_terms_ids);
    // Sanitize user input.
    foreach ($all_meta_keys as $key) {
        //check for data
        if (isset($_POST[$key])) {
            $value = sanitize_text_field($_POST[$key]);
        }
        update_post_meta($post_id, $key, $value);
    }
    //Check if a meta key is relevant and delete them
    $before_post_update_post_meta_keys = $_SESSION['post_terms'];
    $unwanted_meta_keys = array_diff($before_post_update_post_meta_keys, $all_meta_keys);
    foreach ($unwanted_meta_keys as $meta_key) {
        delete_post_meta($post_id, $meta_key);
    }
    unset($_SESSION['post_terms']);
}