У меня возникла небольшая проблема с фрагментом кода, который отображает оставшееся количество товара на складе для каждой позиции заказа в уведомлении администратора по электронной почте о новом заказе.
Это мой код:
// 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, спасибо, что нашли время проверить это для меня. Я тоже был уверен, что все хорошо. Но в случае любого прямого банковского перевода, который приостанавливает заказ, клиент отправляет новый заказ с оставшимися запасами, и это делает мою голову. Скриншот полученного письма здесь: imgur.com/a/OHqmiN4
Я тоже проверил этот случай, и у меня не возникло никаких проблем, как вы описываете. Значит, есть что-то еще, что создает проблемы. Я ответил на ваш вопрос ниже, предоставив альтернативное решение кода, которое использует что-то другое.
Да, извините, все это ненужно. Я отредактировал код сейчас. Я просто пробовал все, чтобы все заработало, и вместо этого вставил это при создании темы. Понятия не имею, почему, но сейчас он начал работать. Я не знаю, была ли это какая-то странная проблема с кешированием или что-то в этом роде, но я просто удалил все и начал заново, и все работает! Спасибо за ваше время, как всегда!
На самом деле это не сработало. Работает только если вручную создаю заказ. Сейчас попробую ваше решение.
Существует альтернативное кодовое решение, которое я уже использовал раньше. Попробуйте следующее:
// 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 вашей дочерней темы (или в плагине). Протестировано и работает. Это может сработать на вашей стороне, избегая описанной вами проблемы.
Некоторые связанные ответы:
Я протестировал ваш код, и такой проблемы, как вы описываете, нет… «Оставшийся запас» отображается только в уведомлении о новом заказе (отправленном администратору) для каждой позиции заказа…