• I am hooking to the acf/validate_save_post to validate the save post.

    // Validate the save post.
    $this->loader->add_action( 'acf/validate_save_post', $invoice_post_type, 'validate_save_post', 10, 0 );
    
    /**
         * Validate the save invoice post.
         */
        public function validate_save_post() {
            // Initialize the variable to check for the error in the post.
            $is_valid = true;
    
            // Invoice items repater and clone field keys.
            $ims_invoice_items_repeater_field_key             = 'field_5c4034030cff9';
            $ims_invoice_items_repeater_field_clone_field_key = 'field_5c443f4dd87de';
    
            // Field keys for items item.
            $ims_invoice_items_item_key            = $ims_invoice_items_repeater_field_clone_field_key . '_field_5c443eab22fe1';
            $ims_invoice_items_item_quantity_key   = $ims_invoice_items_repeater_field_clone_field_key . '_field_5c443eba22fe2';
            $ims_invoice_items_item_unit_price_key = $ims_invoice_items_repeater_field_clone_field_key . '_field_5c443ec622fe3';
            $ims_invoice_items_item_price_key      = $ims_invoice_items_repeater_field_clone_field_key . '_field_5c443edf22fe4';
            $ims_invoice_items_item_discount_key   = $ims_invoice_items_repeater_field_clone_field_key . '_field_5c443efd22fe5';
            $ims_invoice_items_item_amount_key     = $ims_invoice_items_repeater_field_clone_field_key . '_field_5c443f0a22fe6';
    
            // Field keys of invoice.
            $ims_invoice_sub_total_key = 'field_5c41b2ff17b09';
            $ims_invoice_discount_key  = 'field_5c41b31a17b0b';
            $ims_invoice_vat_key       = 'field_5c41b32617b0c';
            $ims_invoice_total_key     = 'field_5c41b33317b0d';
            $ims_invoice_paid_key      = 'field_5c41b33b17b0e';
            $ims_invoice_due_key       = 'field_5c41b34517b0f';
    
            // Get the items list.
            $ims_invoice_items = isset( $_POST['acf'][ $ims_invoice_items_repeater_field_key ] ) ? wp_unslash( $_POST['acf'][ $ims_invoice_items_repeater_field_key ] ) : array();
            // Initialize sub total.
            $calculated_sub_total = 0.0;
            // Stores items id, input key and quantitiy.
            $items_info = [];
            // Loop through each item and validate each item.
            foreach ( $ims_invoice_items as $key => $ims_invoice_item ) {
                // HTML Input key.
                $ims_invoice_items_unit_price_input = 'acf[' . $ims_invoice_items_repeater_field_key . '][' . $key . '][' . $ims_invoice_items_item_unit_price_key . ']';
                $ims_invoice_items_price_input      = 'acf[' . $ims_invoice_items_repeater_field_key . '][' . $key . '][' . $ims_invoice_items_item_price_key . ']';
                $ims_invoice_items_amount_input     = 'acf[' . $ims_invoice_items_repeater_field_key . '][' . $key . '][' . $ims_invoice_items_item_amount_key . ']';
                $ims_invoice_items_quantity_input   = 'acf[' . $ims_invoice_items_repeater_field_key . '][' . $key . '][' . $ims_invoice_items_item_quantity_key . ']';
    
                // Validate unit price.
                $ims_invoice_items_item_id    = $ims_invoice_items[ $key ][ $ims_invoice_items_item_key ];
                $ims_product_mrp              = round( floatval( get_field( 'ims_product_mrp', $ims_invoice_items_item_id ) ), 2 );
                $ims_invoice_items_unit_price = round( floatval( $ims_invoice_items[ $key ][ $ims_invoice_items_item_unit_price_key ] ), 2 );
                if ( $ims_product_mrp !== $ims_invoice_items_unit_price ) {
                    acf_add_validation_error( $ims_invoice_items_unit_price_input, 'Invalid unit price.' );
                    $is_valid = false;
                }
    
                // Validate price which is calculated in the client side.
                $ims_invoice_items_item_quantity = intval( $ims_invoice_items[ $key ][ $ims_invoice_items_item_quantity_key ] );
                $ims_invoice_items_item_price    = round( floatval( $ims_invoice_items[ $key ][ $ims_invoice_items_item_price_key ] ), 2 );
                $calculated_price                = round( $ims_invoice_items_item_quantity * $ims_product_mrp, 2 );
                if ( $calculated_price !== $ims_invoice_items_item_price ) {
                    acf_add_validation_error( $ims_invoice_items_price_input, 'Invalid price.' );
                    $is_valid = false;
                }
    
                // Add items id, input key and quantitiy.
                $items_info[] = array(
                    'id'       => $ims_invoice_items_item_id,
                    'input'    => $ims_invoice_items_quantity_input,
                    'quantity' => $ims_invoice_items_item_quantity,
                );
    
                // Validate amount which is calculated in the client side.
                $ims_invoice_items_item_discount = round( floatval( $ims_invoice_items[ $key ][ $ims_invoice_items_item_discount_key ] ), 2 );
                $ims_invoice_items_item_amount   = round( floatval( $ims_invoice_items[ $key ][ $ims_invoice_items_item_amount_key ] ), 2 );
                $calculated_amount               = round( $calculated_price - $calculated_price * $ims_invoice_items_item_discount / 100.0, 2 );
                // var_dump(array(
                //  'ims_invoice_items_item_quantity' => $ims_invoice_items_item_quantity,
                //  'ims_invoice_items_item_price' => $ims_invoice_items_item_price,
                //  'ims_product_mrp' => $ims_product_mrp,
                //  'ims_invoice_items_unit_price' => $ims_invoice_items_unit_price,
                //  'calculated_price' => $calculated_price,
                //  'ims_invoice_items_item_discount' => $ims_invoice_items_item_discount,
                //  'ims_invoice_items_item_amount' => $ims_invoice_items_item_amount,
                //  'calculated_amount' => $calculated_amount,
                // ));
                if ( $calculated_amount !== $ims_invoice_items_item_amount ) {
                    acf_add_validation_error( $ims_invoice_items_amount_input, 'Invalid amount.' );
                    $is_valid = false;
                } else {
                    $calculated_sub_total += $ims_invoice_items_item_amount;
                }
            }
    
            // var_dump( $items_info );
    
            $stored_items_info = [];
            if ( have_rows( 'ims_invoice_items' ) ) {
                while ( have_rows( 'ims_invoice_items' ) ) {
                    the_row();
                    $stored_items_info[] = array(
                        'id'       => get_sub_field( 'item_item' )->ID,
                        'quantity' => get_sub_field( 'item_quantity' ),
                    );
                }
            }
    
            $available_stock_arr = [];
            $index               = 0;
            foreach ( $items_info as $item_info ) {
                $item_id = $item_info['id'];
                if ( ! isset( $available_stock_arr[ $item_id ] ) ) {
                    $available_stock_arr[ $item_id ] = intval( get_field( 'ims_product_available_stock', $item_id ) );
                }
                // var_dump( $available_stock_arr);
    
                $item_quantity        = $item_info['quantity'];
                $stored_item_quantity = isset( $stored_items_info[ $index ]['quantity'] ) ? $stored_items_info[ $index ]['quantity'] : 0;
                $diff_quantity        = $item_quantity - $stored_item_quantity;
    
                // var_dump(array(
                //  'item_id' => $item_id,
                //  'item_quantity' => $item_quantity,
                //  'stored_item_quantity' => $stored_item_quantity,
                //  'diff_quantity' => $diff_quantity
                // ));
                if ( $diff_quantity > $available_stock_arr[ $item_id ] ) {
                    acf_add_validation_error( $item_info['input'], "Not enough stock. Only {$available_stock_arr[ $item_id ]} available." );
                    $is_valid = false;
                } else {
                    $available_stock_arr[ $item_id ] -= $diff_quantity;
                }
                ++$index;
    
            }
    
            // var_dump( $stored_items_info );
            // exit;
    
            // Validate sub total.
            $ims_invoice_sub_total = isset( $_POST['acf'][ $ims_invoice_sub_total_key ] ) ? sanitize_text_field( wp_unslash( $_POST['acf'][ $ims_invoice_sub_total_key ] ) ) : null;
            $ims_invoice_sub_total = round( floatval( $ims_invoice_sub_total ), 2 );
            if ( $calculated_sub_total !== $ims_invoice_sub_total ) {
                $ims_invoice_items_sub_total_input = 'acf[' . $ims_invoice_sub_total_key . ']';
                acf_add_validation_error( $ims_invoice_items_sub_total_input, 'Invalid sub total.' );
                $is_valid = false;
            }
    
            $ims_invoice_discount = isset( $_POST['acf'][ $ims_invoice_discount_key ] ) ? sanitize_text_field( wp_unslash( $_POST['acf'][ $ims_invoice_discount_key ] ) ) : null;
            $ims_invoice_discount = round( floatval( $ims_invoice_discount ), 2 );
    
            $ims_invoice_vat = isset( $_POST['acf'][ $ims_invoice_vat_key ] ) ? sanitize_text_field( wp_unslash( $_POST['acf'][ $ims_invoice_vat_key ] ) ) : null;
            $ims_invoice_vat = round( floatval( $ims_invoice_vat ), 2 );
    
            // Validate the total.
            $ims_invoice_total                  = isset( $_POST['acf'][ $ims_invoice_total_key ] ) ? sanitize_text_field( wp_unslash( $_POST['acf'][ $ims_invoice_total_key ] ) ) : null;
            $ims_invoice_total                  = round( floatval( $ims_invoice_total ), 2 );
            $calculated_sub_total_with_discount = $calculated_sub_total - $calculated_sub_total * $ims_invoice_discount / 100.0;
            $calculated_sub_total_with_vat      = $calculated_sub_total_with_discount + $calculated_sub_total_with_discount * $ims_invoice_vat / 100.0;
            $calculated_total                   = round( $calculated_sub_total_with_vat, 2 );
            if ( $calculated_total !== $ims_invoice_total ) {
                $ims_invoice_items_total_input = 'acf[' . $ims_invoice_total_key . ']';
                acf_add_validation_error( $ims_invoice_items_total_input, 'Invalid total.' );
                $is_valid = false;
            }
    
            // Validate the due.
            $ims_invoice_paid = isset( $_POST['acf'][ $ims_invoice_paid_key ] ) ? sanitize_text_field( wp_unslash( $_POST['acf'][ $ims_invoice_paid_key ] ) ) : null;
            $ims_invoice_paid = floatval( $ims_invoice_paid );
            $ims_invoice_due  = isset( $_POST['acf'][ $ims_invoice_due_key ] ) ? sanitize_text_field( wp_unslash( $_POST['acf'][ $ims_invoice_due_key ] ) ) : null;
            $ims_invoice_due  = floatval( $ims_invoice_due );
            $calculated_due   = round( $calculated_total - $ims_invoice_paid, 2 );
            // var_dump(array(
            //  'ims_invoice_paid' => $ims_invoice_paid,
            //  'calculated_sub_total' => $calculated_sub_total,
            //  'calculate_due' => $calculated_due,
            //  'ims_invoice_due' => $ims_invoice_due,
            // ));
            // exit;
    
            if ( $calculated_due !== $ims_invoice_due ) {
                $ims_invoice_items_due_input = 'acf[' . $ims_invoice_due_key . ']';
                acf_add_validation_error( $ims_invoice_items_due_input, 'Invalid due.' );
                $is_valid = false;
            }
    
            if ( $is_valid ) {
                // Update the available stock of the product.
                foreach ( $available_stock_arr as $id => $available_stock ) {
                    update_field( 'ims_product_available_stock', $available_stock, $id );
                }
            }
    
        }

    The code runs fine. The validation step is done perfectly. But the post is saved with null fields after validation.

    Here is the screenshot: https://i.stack.imgur.com/2KHN4.png

    But if I remove the following code from the function it works fine.

    if ( $is_valid ) {
                // Update the available stock of the product.
                foreach ( $available_stock_arr as $id => $available_stock ) {
                    update_field( 'ims_product_available_stock', $available_stock, $id );
                }
            }
  • The topic ‘Null data are being saved after validation of post in ACF’ is closed to new replies.