在 WooCommerce 中显示每个订单商品的剩余库存,以获得特定电子邮件通知

问题描述 投票:0回答:1

我遇到一个代码片段的小问题,该代码片段在管理新订单电子邮件通知中显示每个订单项目的剩余产品库存数量。

这是我的代码:

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

这可以很好地在订单产品表中的每个产品下添加剩余库存行。然而,当通过银行存款/订单保留电子邮件等支付时,它还会将剩余库存添加到客户电子邮件中,这是我不想要的。理想情况下,它应该仅添加到发送给管理员的第一个新订单通知中。

我明显遗漏了什么?非常感谢一些帮助。谢谢!

php wordpress woocommerce stock email-notifications
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 文件中(或插件中)。经过测试并有效。它可能对您有利,避免您描述的问题。


一些相关答案:

© www.soinside.com 2019 - 2024. All rights reserved.