phpwoocommercesave

Custom Field data entry not saved to Woocommerce database


I have the following code provided to me from a plugin developer, but they are not very responsive and don't seem to test properly using latest 8.x PHP

I've been able to get things to work except when someone enters data into one of the custom fields or updates the data which is pulled back from the database, it doesn't save the change.

Background:

I don't have the developer skills to know if the 'save' portion of this code is up to date or even makes sense. Can anyone assist in understanding if the code needs to change?

/**
* Add Custom Tab in add product page.
* @Version 3.3.0
*/
function add_custom_product_data_tabs( $tabs ) {   
    $tabs['image_details'] = array(
        'label'    => __( 'Image Details', 'your-text-domain' ),       
        'target'   => 'custom_tab_product_data',
        'class'    => array(),
        'priority' => 100,   
    );   
    return $tabs;
}
add_filter( 'mvx_product_data_tabs', 'add_custom_product_data_tabs' );

// Now, to add content inside the custom tab, use the following code.
function add_custom_product_data_content( $pro_class_obj, $product, $post ) {  
    // Retrieve the values from the database
    $file_size = get_post_meta( $product->get_id(), 'file_size', true );
    $image_dimensions = get_post_meta( $product->get_id(), 'image_dimensions', true );  
    ?>   
    <div role="tabpanel" class="tab-pane fade" id="custom_tab_product_data"><!-- just make sure tabpanel id should replace with your added tab target -->       
        <div class="row-padding">           
            <div class="form-group">               
                <label class="control-label col-sm-3 col-md-3">File Size (i.e. 2MB):</label>               
                <div class="col-md-6 col-sm-9">                   
                    <input type="text" name="file_size" class="form-control" value="<?php echo esc_attr( $file_size ); ?>" />               
                </div>           
            </div>
            <div class="form-group">               
                <label class="control-label col-sm-3 col-md-3">Image Dimensions (i.e. 800x600):</label>               
                <div class="col-md-6 col-sm-9">                   
                    <input type="text" name="image_dimensions" class="form-control" value="<?php echo esc_attr( $image_dimensions ); ?>" />               
                </div>           
            </div>       
        </div>   
    </div>   
    <?php
}
add_action( 'mvx_product_tabs_content', 'add_custom_product_data_content', 10, 3 );

// Save the custom field values when the product is saved
function save_custom_product_data( $post_id ) {
    // Check if the custom fields values are set and save them
        if ( isset( $_POST['file_size'] ) ) {
        $file_size = sanitize_text_field( $_POST['file_size'] );
        update_post_meta( $post_id, 'file_size', $file_size );
    
        // Log the post_id and file_size value
        $logger = wc_get_logger();
        $context = array( 'source' => 'custom-fields' );
        $logger->info( 'Post ID: ' . $post_id . ' - File Size: ' . $file_size, $context );
    }

    if ( isset( $_POST['image_dimensions'] ) ) {
        $image_dimensions = sanitize_text_field( $_POST['image_dimensions'] );
        update_post_meta( $post_id, 'image_dimensions', $image_dimensions );

        // Log the post_id and image_dimensions value
        $logger = wc_get_logger();
        $context = array( 'source' => 'custom-fields' );
        $logger->info( 'Post ID: ' . $post_id . ' - Image Dimensions: ' . $image_dimensions, $context );
    }
}
add_action( 'woocommerce_process_product_meta', 'save_custom_product_data', 10, 1 );

tried ChatGPT for support and google, but to no avail.


Solution

  • The following additional code resolved the issue. The hook can be seen in the plugin code as well.

    The hook required is mvx_process_product_object:

    function save_custom_product_data( $product, $data ) {
        if ( isset( $_POST['file_size'] ) ) {
            update_post_meta( $product->get_id(), 'file_size', sanitize_text_field( $_POST['file_size'] ) );
        }
    
        if ( isset( $_POST['image_dimensions'] ) ) {
            update_post_meta( $product->get_id(), 'image_dimensions', sanitize_text_field( $_POST['image_dimensions'] ) );
        }
    
    }
    add_action( 'mvx_process_product_object', 'save_custom_product_data', 10, 2 );