Отображение оставшегося количества на складе для каждой позиции заказа только в уведомлении по электронной почте о новом заказе WooCommerce

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

Это мой код:

// Add action to display content on specific email
 add_action( 'woocommerce_email_before_order_table', 'add_stock_to_admin_email', 20, 4 );
    
    // Function to display content on specific email
    function add_stock_to_admin_email( $order, $sent_to_admin, $plain_text, $email ) {
        if ( $email->id == 'new_order' ) {
            // Add action to display remaining stock quantity on order item meta
            add_action( 'woocommerce_order_item_meta_start', 'display_remaining_stock_quantity', 10, 3 );
        }
    }
    
    // Function to display remaining stock quantity on order item meta
    function display_remaining_stock_quantity(int $item_id, object $item, object $order): void {
        // Only display for line items
        if (!$item->is_type('line_item')) {
            return;
        }
    
        $product = $item->get_product();
    
        // Display remaining stock quantity
        $stock_quantity = $product->get_stock_quantity();
        if ($stock_quantity > 0) {
            printf('<div>%s: %d</div>', __('Remaining stock', 'woocommerce'), $stock_quantity);
        }
    }

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

Я явно что-то упускаю? Некоторая помощь была бы очень признательна. Спасибо!

Я протестировал ваш код, и такой проблемы, как вы описываете, нет… «Оставшийся запас» отображается только в уведомлении о новом заказе (отправленном администратору) для каждой позиции заказа…

LoicTheAztec 25.05.2024 02:07

@LoicTheAztec, спасибо, что нашли время проверить это для меня. Я тоже был уверен, что все хорошо. Но в случае любого прямого банковского перевода, который приостанавливает заказ, клиент отправляет новый заказ с оставшимися запасами, и это делает мою голову. Скриншот полученного письма здесь: imgur.com/a/OHqmiN4

Acephalia 25.05.2024 02:29

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

LoicTheAztec 25.05.2024 03:28

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

Acephalia 25.05.2024 03:38

На самом деле это не сработало. Работает только если вручную создаю заказ. Сейчас попробую ваше решение.

Acephalia 25.05.2024 03:47
Стоит ли изучать 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 и хотите разрабатывать...
1
5
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Альтернативный способ:

Существует альтернативное кодовое решение, которое я уже использовал раньше. Попробуйте следующее:

// Setting the email ID as a global variable
add_action('woocommerce_email_before_order_table', 'set_the_email_id_as_a_global_variable', 1, 4);
function set_the_email_id_as_a_global_variable($order, $sent_to_admin, $plain_text, $email){
    $GLOBALS['email_id_str'] = $email->id;
}

// Display product remaining stock quantity on order items
add_action( 'woocommerce_order_item_meta_start', 'display_remaining_stock_quantity', 10, 3 );
function display_remaining_stock_quantity( $item_id, $item, $order ) {
    // Only for order item "line item" type
    if ( !$item->is_type('line_item') ) {
        return;
    }
    $globalsVar = $GLOBALS; // Pass $GLOBALS variable as reference

    // Try to get the email ID from globals reference 
    if ( isset($globalsVar['email_id_str']) && $globalsVar['email_id_str'] === 'new_order' ) {
        $product = $item->get_product();

        if ( $stock_qty = $product->get_stock_quantity() ) {
            printf('<div>%s: %d</div>', __('Remaining stock', 'woocommerce'), $stock_qty);
        }
    }
}

Код находится в файле function.php вашей дочерней темы (или в плагине). Протестировано и работает. Это может сработать на вашей стороне, избегая описанной вами проблемы.


Некоторые связанные ответы:

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

Параметр per_page не работает для WordPress REST API v2
Отображение общей цены и размеров продукта в зависимости от количества и категории продукта в WooCommerce
Как реализовать базовое использование Google reCaptcha v3
Автоматическое обновление корзины WooCommerce при изменении количества товаров в корзине
Замените кнопку «Добавить в корзину» в цикле кнопкой, связанной с продуктом, и другим текстом в зависимости от категорий
Wordpress добавляет глобальный и классический встроенный CSS программно
Исключить налоги на продукты в зависимости от категорий продуктов и страны в WooCommerce
Отображение значения пользовательского поля оформления заказа в заказах WooCommerce и уведомлениях по электронной почте
Не отображается конечная точка для службы в AKS, а метка и селекторы не совпадают
Добавьте настраиваемые поля в форму сброса пароля WooCommerce и сохраните данные