# Purchase Order Number Field at Checkout

> Adds an optional "PO number" field to the classic checkout for business buyers and shows it on the order screen, in emails and on the customer's order page.

- Type: PHP
- Runs: Run everywhere
- Category: [WooCommerce](https://wpide.com/library/category/woocommerce/)
- Requires: WooCommerce
- Tags: woocommerce, checkout, b2b, fields
- Author: WPIDE Team
- Installs: 0
- Updated: 2026-10-28
- Page: https://wpide.com/library/woo-checkout-po-number/

## Code

```php
$wpide_po_required = false; // Require a PO number.

add_filter( 'woocommerce_checkout_fields', function ( $fields ) use ( $wpide_po_required ) {
    $fields['order']['wpide_po_number'] = array(
        'type'      => 'text',
        'label'     => 'Purchase order number',
        'required'  => $wpide_po_required,
        'priority'  => 1,
        'maxlength' => 40,
    );

    return $fields;
} );

add_action( 'woocommerce_checkout_create_order', function ( $order, $data ) {
    if ( ! empty( $data['wpide_po_number'] ) ) {
        $order->update_meta_data( '_wpide_po_number', sanitize_text_field( $data['wpide_po_number'] ) );
    }
}, 10, 2 );

add_action( 'woocommerce_admin_order_data_after_billing_address', function ( $order ) {
    $po = $order->get_meta( '_wpide_po_number' );

    if ( $po ) {
        printf( '<p><strong>PO number:</strong> %s</p>', esc_html( $po ) );
    }
} );

add_filter( 'woocommerce_email_order_meta_fields', function ( $fields, $sent_to_admin, $order ) {
    $po = $order->get_meta( '_wpide_po_number' );

    if ( $po ) {
        $fields['wpide_po_number'] = array( 'label' => 'PO number', 'value' => $po );
    }

    return $fields;
}, 10, 3 );

add_filter( 'woocommerce_get_order_item_totals', function ( $rows, $order ) {
    $po = $order->get_meta( '_wpide_po_number' );

    if ( $po ) {
        $rows['wpide_po_number'] = array( 'label' => 'PO number:', 'value' => esc_html( $po ) );
    }

    return $rows;
}, 10, 2 );
```

## Notes

Set $wpide_po_required to true to make the field mandatory; the value is saved as the order meta _wpide_po_number.

## How to use it

Install the free WPIDE plugin (https://wordpress.org/plugins/wpide/), find "Purchase Order Number Field at Checkout" in its snippet library and add it in one click; or create a new PHP snippet in WPIDE (or any code snippets plugin) and paste the code above. More snippets: https://wpide.com/library/
