Search code examples
wordpresswoocommercehook-woocommerceordersdokan

WooCommerce show vendor store-name (Dokan) in admin order details overview


We want to show the vendor(s) from a order in the Admin order detail overview. We use some parts from the code below to display the vendor for each product in the invoice. Now we want to display which vendor are in the order actually for admin overview.

  • If only items from one vendor is in the order => result: => Vendor(s): Vendor A
  • If items from different vendors are in the order => result: => Vendor(s): Vendor A, Vendor B, Vendor C

This is what we have so far:

add_action( 'woocommerce_admin_order_data_after_billing_address', 'get_dokan_vendor_shop_name_from_order_test', 10, 1 );


function get_dokan_vendor_shop_name_from_order_test( $product_id ) {
    if( empty($product_id) ) return;
    $seller = get_post_field( 'post_author', $product_id );
    $author = get_user_by( 'id', $seller );
    $vendor = dokan()->vendor->get( $seller );
    $store_info = dokan_get_store_info( $author->ID );
    
    echo '<h4>' . __('TEST 1 - Vendor in order') . ' (' . $vendor->get_shop_name() . ')</h4>';

    
    if ( ! empty( $store_info['store_name'] ) ) {
        return $vendor->get_shop_name();
        
    echo '<h4>' . __('TEST 2 - Vendor in order') . ' (' . $vendor->get_shop_name() . ')</h4>';

        
    } else {
        return;
    }
}


UPDATE

With the new information, this is what we have so far: It displays the vendor but if a order has 2 items from vendor A, then it displays Vendor A three times.

enter image description here

So we now just have problems with the output. The vendor order infos are now available but the output is not the way we want that.

function action_woocommerce_admin_order_data_after_billing_address( $order ) {
    // Loop through order items
    foreach ( $order->get_items() as $item ) {
        // Get product object
        $product = $item->get_product();
        
        // Seller
        $seller = $product->post->post_author;
        
        // Author
        $author = get_user_by( 'id', $seller );
        
        // Store info
        $store_info = dokan_get_store_info( $author->ID );
        
        // Vendor
        $vendor = dokan()->vendor->get( $seller );
        
        // Output Vendor in order - TEST 1
        echo '<h4>' . __('TEST 2 - Vendor in order') . ' (' . $vendor->get_shop_name() . ')</h4>';

    }
        // Output Vendor in order - TEST 2
        echo '<h4>' . __('TEST 2 - Vendor in order') . ' (' . $vendor->get_shop_name() . ')</h4>';

    
}
add_action( 'woocommerce_admin_order_data_after_billing_address', 'action_woocommerce_admin_order_data_after_billing_address', 10, 1 );

Solution

  • I don't use the dokan plugin, but the woocommerce_admin_order_data_after_billing_address hook contains the order object as passed variable, not the $product_id.

    So you can obtain the items by loop through the order object, etc.. I believe this should suffice

    function action_woocommerce_admin_order_data_after_billing_address( $order ) {
        // Empty array
        $shop_names = array();
    
        // Output
        echo '<h4>' . __( 'Vendor in order: ', 'woocommerce' ) . '</h4>';
        
        // Loop through order items
        foreach ( $order->get_items() as $item ) {
            // Get product object
            $product = $item->get_product();
            
            // Author id
            $author_id = $product->post->post_author;
            
            // Shopname
            $vendor = dokan()->vendor->get( $author_id );
            $shop_name = $vendor->get_shop_name();
            
            // OR JUST USE THIS FOR SHOPNAME
            // Shop name
            // $shop_name = dokan()->vendor->get( $author_id )->get_shop_name();
            
            // NOT in array
            if ( ! in_array( $shop_name, $shop_names ) ) {
                // Push to array
                $shop_names[] = $shop_name;
    
                // Output
                echo '<p>' . $shop_name . '</p>';
            }
        }
    }
    add_action( 'woocommerce_admin_order_data_after_billing_address', 'action_woocommerce_admin_order_data_after_billing_address', 10, 1 );