Add custom field to product inventory tab and display value on single product page where meta ends

Viewed 193

I'm using the following code in my theme functions.php file to add a additional data field to the product inventory tab:

// Add Custom Field to woocommerce inventory tab for product
add_action('woocommerce_product_options_inventory_product_data', function() {
    woocommerce_wp_text_input([
            'id' => '_number_in_package',
            'label' => __('Number of Pages', 'txtdomain'),
            'type' => 'number',
    ]);
});

add_action('woocommerce_process_product_meta', function($post_id) {
    $product = wc_get_product($post_id);
    $num_package = isset($_POST['_number_in_package']) ? $_POST['_number_in_package'] : '';
    $product->update_meta_data('_number_in_package', sanitize_text_field($num_package));
    $product->save();
});

add_action('woocommerce_product_meta_start', function() {
    global $post;
    $product = wc_get_product($post->ID);
    $num_package = $product->get_meta('_number_in_package');
    if (!empty($num_package)) {
        printf('<div class="custom-sku">%s: %s</div>', __('Number of Pages', 'txtdomain'), $num_package);
    }
});

add_filter('woocommerce_product_data_tabs', function($tabs) {
    $tabs['additional_info'] = [
        'label' => __('Additional info', 'txtdomain'),
        'target' => 'additional_product_data',
        'class' => ['hide_if_external'],
        'priority' => 25
    ];
    return $tabs;
});

However, on the single product page, the custom field is added before category and ISBN. I want to place the custom field at the end after the product ISBN. Any advice?

1 Answers

Some comments/suggestions regarding your code attempt

  • To save fields you can use the woocommerce_admin_process_product_object hook, opposite the outdated woocommerce_process_product_meta hook
  • WooCommerce contains by default no ISBN field, but it looks like the woocommerce_product_meta_end hook will answer your question

So you get:

// Add custom field
function action_woocommerce_product_options_inventory_product_data() {
    woocommerce_wp_text_input( array(
        'id'            => '_number_in_package',
        'label'         => __( 'Number of Pages', 'woocommerce' ),
        'description'   => __( 'This is a custom field, you can write here anything you want.', 'woocommerce' ),
        'desc_tip'      => 'true',
        'type'          => 'number'
    ) );
}
add_action( 'woocommerce_product_options_inventory_product_data', 'action_woocommerce_product_options_inventory_product_data' );

// Save custom field
function action_woocommerce_admin_process_product_object( $product ) {
    // Isset
    if ( isset( $_POST['_number_in_package'] ) ) {        
        // Update
        $product->update_meta_data( '_number_in_package', sanitize_text_field( $_POST['_number_in_package'] ) );
    }
}
add_action( 'woocommerce_admin_process_product_object', 'action_woocommerce_admin_process_product_object', 10, 1 );

// Display on single product page
function action_woocommerce_product_meta_end() {
    global $product;
    
    // Is a WC product
    if ( is_a( $product, 'WC_Product' ) ) {
        // Get meta
        $number = $product->get_meta( '_number_in_package' );

        // NOT empty
        if ( ! empty ( $number ) ) {
            echo '<p>' . $number . '</p>';
        }
    }
}
add_action( 'woocommerce_product_meta_end', 'action_woocommerce_product_meta_end', 10 );
Related