WooCommerce 在管理订单详细信息概览中显示供应商商店名称 (Dokan)

时间:2021-01-26 12:34:39

标签: wordpress woocommerce hook-woocommerce orders dokan

我们希望在管理订单详细信息概览中显示订单中的供应商。我们使用下面代码中的一些部分来显示发票中每个产品的供应商。现在我们要显示订单中实际有哪些供应商以供管理员概览。

  • 如果订单中只有一个供应商的商品 => 结果:=> 供应商:供应商 A
  • 如果订单中的商品来自不同供应商 => 结果:=> 供应商:供应商 A、供应商 B、供应商 C

这是我们目前所拥有的:

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


更新

有了新的信息,这就是我们目前所拥有的:它显示了供应商,但如果一个订单有来自供应商 A 的 2 件商品,那么它会显示供应商 A 三次。

enter image description here

所以我们现在只有输出有问题。供应商订单信息现在可用,但输出不是我们想要的方式。

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

1 个答案:

答案 0 :(得分:1)

我不使用 dokan 插件,但 woocommerce_admin_order_data_after_billing_address 钩子包含 order 对象作为传递的变量,而不是 $product_id

所以你可以通过循环获取订单对象等。 我相信这应该足够了

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