Visual Volta
Visual Volta

Reputation: 39

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

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?

Upvotes: 2

Views: 1299

Answers (1)

7uc1f3r
7uc1f3r

Reputation: 29650

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 );

Upvotes: 1

Related Questions