在 Woocommerce 电子邮件通知中检查两个产品的订单是否相同

Check if two products are in same order in Woocommerce email notifications

如果订单包含两个特定的产品 ID,我正在尝试向已完成订单的电子邮件添加额外的文本。到目前为止,这是我的代码:

function advmi_check_order_product_id($order_id)
{
    $order = new WC_Order($order_id);
    $items = $order->get_items();
    foreach($items as $item) {
        $product_id = $item['product_id'];
        if (($product_id == 56943 && $product_id == 95956 && 'completed' == $order->status )) {
            echo '<p>Added Text for both products in the order</p><p>Text </p>';
        }
        elseif ($product_id == 56943 && 'completed' == $order->status) {
            echo '<p>Text for only 56943 </p><p>Text </p>';
}
        }

我还需要订单状态完成。

我被卡住了 - 请问有什么帮助吗?

我使用的是 WC 版本:2.6.14

这将在已完成的订单电子邮件的订单 table 之前添加一些文本。我遍历订单项并根据订单中是否包含这些项设置标志。

add_action( 'woocommerce_email_before_order_table', 'add_additonal_order_email_text', 10, 4 );
function add_additonal_order_email_text( $order, $sent_to_admin, $plain_text, $email ) {
    $product_id_1 = 56943;
    $product_id_2 = 95956;
    $product_1_exists = false;
    $product_2_exists = false;

    if ( ! $sent_to_admin && 'completed' == $order->get_status() ) {
        foreach( $order->get_items() as $order_item ) {
            $product_id = $order_item->get_product_id();

            if( $product_id == $product_id_1 )
                $product_1_exists = true;
            elseif( $product_id == $product_id_2 )
                $product_2_exists = true;
        }

        if ( $product_1_exists && $product_2_exists ) {
            echo '<p>Added Text for both products in the order</p><p>Text </p>';
        } 
        elseif ( $product_1_exists && ! product_2_exists ) {
            echo '<p>Text for only 56943 </p><p>Text </p>';
        }
    }
}

更新 2 - 添加了从版本 2.4 到 3.2+ 的兼容性 WC

这是使您的代码正常工作的正确方法(在 woocommerce 2.6.x 及更高版本中),保留您的功能,您将在第二个自定义挂钩功能中使用该功能以在电子邮件通知中显示:

// Your conditional function that output a custom text
// The argument needed is the WC_Order object (instead of the Order ID)
function advmi_check_order_product_id( $order )
{
    $has_product1 = $has_product2 = false; // Initializing
    // Added Compatibility WC from version 2.4 to 3.2+ (Get The order ID)
    ## $order_id = method_exists( $order, 'get_id' ) ? $order->get_id() : $order->id;
    ## $order = new WC_Order($order_id); // Get the WC_Order object

    foreach( $order->get_items() as $item ) {
        // Added Compatibility WC from version 2.4 to 3.2+
        $product_id = method_exists( $item, 'get_product_id' ) ? $item->get_product_id() : $item['product_id'];
        if( 56943 == $product_id ) $has_product1 = true;
        if( 95956 == $product_id ) $has_product2 = true;
    }

    if ( $has_product1 && $has_product2 ) {
        echo '<p>'.__('Added Text for both products in the order').'</p>
            <p>'.__('Text').'</p>';
    }
    elseif ( $has_product1 && ! $has_product2 ) {
        echo '<p>'.__('Text for only 56943').'</p>
            <p>'.__('Text').'</p>';
    }
}

// The email function hooked that display the text
add_action( 'woocommerce_email_order_details', 'add_text_conditionally', 10, 4 );
function add_text_conditionally( $order, $sent_to_admin, $plain_text, $email ) {
    // For customer completed orders status only
    if ( $sent_to_admin || ! $order->has_status('completed') ) return;
    advmi_check_order_product_id( $order );
}

代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。

已在 2.6.14 和 3.2.3 版本上测试并运行…