Ross
Ross

Reputation: 534

How to add ACF field to custom column on WooCommerce admin orders list

ACF is set up for post type on WooCommerce products. However, I am trying to add a custom column to WooCommerce orders list within Admin dashboard and add the products ACF field.

I have added the column to display after order_status, but I'm having problems getting the ACF field to display.

// ADD NEW COLUMN
add_filter( 'manage_edit-shop_order_columns', 'custom_shop_order_column', 20 );
function custom_shop_order_column($columns)
{
    $reordered_columns = array();
    foreach( $columns as $key => $column){
        $reordered_columns[$key] = $column;
        if( $key ==  'order_status' ){
            $reordered_columns['my-column'] = __( 'Location','theme_domain');
        }
    }
    return $reordered_columns;
}

Here, adding ACF to new colum.

// ADD ACF FIELD TO COLUMN
add_action( 'manage_shop_order_posts_custom_column' , 'custom_orders_list_column_content', 20, 2 );
function custom_orders_list_column_content( $column, $post_id )
{
     if ( 'Location' == $column_name ){
    $product_id = method_exists( $product, 'get_id' ) ? $product->get_id() : $product->id;
    echo get_field( 'location', $product_id );
        }
    return true;
}

Still learning and not sure how to do this, any advice?

Upvotes: 1

Views: 1649

Answers (1)

7uc1f3r
7uc1f3r

Reputation: 29614

An order generally consists of several products, therefore you cannot use $product_id directly, but you have to loop through the order items.

So you get:

/**
 * Add columns
 */
function filter_manage_edit_shop_order_columns( $columns ) {
    $reordered_columns = array();
    
    foreach ( $columns as $key => $column ) {
        $reordered_columns[$key] = $column;
        
        if ( $key ==  'order_status' ) {
            $reordered_columns['my-column'] = __( 'Location','theme_domain' );
        }
    }
    
    return $reordered_columns;
}
add_filter( 'manage_edit-shop_order_columns', 'filter_manage_edit_shop_order_columns', 10, 1 );

/**
 * Populate columns
 */
function filter_manage_shop_order_posts_custom_column( $column, $post_id ) {
    // Compare
    if ( $column == 'my-column' ) {
        // Get order
        $order = wc_get_order( $post_id );

        // Is a WC_Order
        if ( is_a( $order, 'WC_Order' ) ) {
            // Get items
            $items = $order->get_items();
            
            // Loop through
            foreach ( $items as $key => $item ) {
                // Product ID
                $product_id = $item->get_variation_id() > 0 ? $item->get_variation_id() : $item->get_product_id();
                
                // Get field
                $address = get_field( 'location', $product_id );
                
                // Output
                echo ($address) ? '<div>Address: ' . $address . '</div>' : '<div>Address: No address found!</div>';
            }
        }
    }
}
add_filter( 'manage_shop_order_posts_custom_column', 'filter_manage_shop_order_posts_custom_column', 10, 2 );

Upvotes: 3

Related Questions