WooCommerce показывает название магазина поставщика (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;
    }
}


ОБНОВЛЕНИЕ

С новой информацией это то, что у нас есть на данный момент: он отображает поставщика, но если в заказе есть 2 элемента от поставщика A, то он отображает поставщика A три раза.

введите описание изображения здесь

Так что теперь у нас просто проблемы с выводом. Информация о заказе поставщика теперь доступна, но результат не такой, как нам хотелось бы.

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

person Nik7    schedule 26.01.2021    source источник
comment
Я голосую за закрытие этого вопроса, потому что здесь он не по теме, можете попробовать задать его на wordpress stack exchange   -  person Graviton    schedule 26.01.2021
comment
Привет, извини, я не понимаю, почему здесь это не по теме?   -  person Nik7    schedule 26.01.2021


Ответы (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 );
person 7uc1f3r    schedule 26.01.2021