仅在 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' && $sent_to_admin ) {
        // Add action to display remaining stock quantity on order item meta
        add_action( 'woocommerce_order_item_meta_start', 'display_remaining_stock_quantity', 10, 3 );
    }
}

// Display remaining stock quantity on order item meta
function display_remaining_stock_quantity(int $item_id, object $item, object $order): void {
    // On email notifications for line items
    if (is_wc_endpoint_url() ||!$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个回答
0
投票

我测试了您的代码,不存在您所描述的使用银行电汇(“bacs”付款方式 ID)支付的“暂停”订单的问题。

在您的代码中,第一个

&& $sent_to_admin
语句中不需要
IF
。应该是:

if ( $email->id === 'new_order' ) {

另外,在您的其他

IF
声明中,不需要
is_wc_endpoint_url() ||
,应该是:

if ( !$item->is_type('line_item') ) {

另一种方式:

我之前已经使用过一种替代代码解决方案。尝试以下操作:

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

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;
    }
    // Try to get the email ID global variable
    $refNameGlobalsVar = $GLOBALS;
    $email_id = $refNameGlobalsVar['email_id_str'];

    if( $email_id === 'new_order' ) {
        $product = $item->get_product();

        // Display remaining stock quantity
        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.