Добавить общий вес заказа в список заказов администратора WooCommerce (совместимо с HPOS)

Раньше я использовал плагин, чтобы добавлять общий вес заказа к каждому заказу и отображать его на странице заказов в серверной части. Однако HPOS нарушил это, и я пытался написать код для его реализации снова. У меня есть Франкенштейн несколько фрагментов, которые я нашел, так как мои навыки PHP очень ограничены, и это все, что я понял, я просто не могу заставить его заполнять значения.

Я знаю, что многие из вас посмотрят на это и скажут себе: какой идиот, но, надеюсь, кто-нибудь сможет указать мне правильное направление.

add_filter( 'manage_woocommerce_page_wc-orders_columns', 'add_order_weight_column' );
function add_order_weight_column( $columns ) {
       $columns['total_weight'] = __( 'Weight', 'woocommerce' );
    return $columns;
}

add_action( 'manage_shop_order_posts_custom_column', 'populate_order_weight_column_content', 10, 2 );
function populate_order_weight_column_content( $column ) {
     if ( $column == 'total_weight' ) {
        global $the_order;

        $total_weight = $the_order->get_meta('_cart_weight');

        if ( $total_weight > 0 ) {
            echo wc_format_weight( $total_weight );
        } else {
            _e('N/A', 'woocommerce');
        }
    }
}

Столбец не обязательно должен быть сортируемым, мне просто нужно отобразить общий вес.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основная проблема в вашем коде заключается в том, что вы не используете правый крючок во второй функции, когда HPOS включен, поэтому в вашем настраиваемом столбце ничего не отображается.

Убедитесь, что «_cart_weight» — это правильный метаключ, используемый для регистрации общего веса (см. дополнение ниже, посвященное проблемам совместимости).

Следующее будет работать с включенным HPOS или без него:

add_filter( 'manage_woocommerce_page_wc-orders_columns', 'add_custom_columns_to_admin_orders', 20); // HPOS
add_filter( 'manage_edit-shop_order_columns', 'add_custom_columns_to_admin_orders', 20);
function add_custom_columns_to_admin_orders( $columns ) {
    return array_merge( $columns, ['total_weight' => __( 'Weight', 'woocommerce' )] );
}

add_action('manage_woocommerce_page_wc-orders_custom_column', 'custom_columns_content_in_admin_orders', 10, 2); // HPOS
add_action( 'manage_shop_order_posts_custom_column', 'custom_columns_content_in_admin_orders', 10, 2);
function custom_columns_content_in_admin_orders( $column, $order ) {
    if ( ! is_a($order, 'WC_order') && $order > 0 ) {
        $order = wc_get_order( $order );
    }

    if ( 'total_weight' === $column ) {
        $total_weight = $order->get_meta('_cart_weight');
        echo $total_weight > 0 ? wc_format_weight($total_weight) : __('N/A', 'woocommerce');
    }
}

Код находится в файле function.php вашей дочерней темы (или в плагине).


Добавление

Если зарегистрированный общий вес несовместим с HPOS, это означает, что код, используемый для регистрации общего веса, использует метафункцию записи WordPress вместо использования необходимого метода установки WooCommerce, совместимого с HPOS.

Решение:

  1. Замените код, регистрирующий общий вес, на:
add_action('woocommerce_checkout_create_order', 'add_checkout_order_total_weight', 100);
function add_checkout_order_total_weight( $order ) {
    $order->update_meta_data('_cart_weight', WC()->cart->get_cart_contents_weight());
}

Обязательно удалите старый код (или соответствующие функции стороннего плагина).


  1. Добавьте общий вес для заказов вручную или пересчитайте общий вес для заказов администратора:
add_action( 'woocommerce_process_shop_order_meta', 'add_edit_admin_order_total_weight', 60 );
function add_edit_admin_order_total_weight( $order_id ) {
    $order = wc_get_order($order_id); // Get WC_Order instance
    $total_weight = 0; // Initializing
    
    // Loop through order items
    foreach ( $order->get_items() as $item ) {
        $product  = $item->get_product(); // Get WC_Product instance
        $weight = (float) $product->get_weight(); // Get product weight

        $total_weight += $weight > 0 ? $item->get_quantity() * $weight : 0; // Increase total weight
    }

    $initial_total_weight = (float) $order->get_meta('_cart_weight'); // Check initial

    if ( $initial_total_weight !== $total_weight ) {
        $order->update_meta_data('_cart_weight', WC()->cart->get_cart_contents_weight());
        $order->save();
    }
}

  1. Синхронизировать предыдущие заказы (необязательно):

Как снова запустить синхронизацию WooCommerce HPOS для ранее синхронизированных заказов?


Связанный:

Спасибо LoicTheAztec, это помогло, однако теперь я просто получаю список неприменимых сумм. Я предполагаю, что это связано с тем, что метаключ не получает нужные мне данные. Я попытался заполнить метаключ этим кодом: add_action('woocommerce_checkout_create_order', 'add_order_total_weight_metadata'); function add_order_total_weight_metadata($order) { $order->add_meta_data('_cart_weight', intval( WC()->cart->get_cart_contents_weight() ) ); } но все равно не повезло

Merlin 02.07.2024 12:23

Другие вопросы по теме