WooCommerce 客户完成订单电子邮件通知中基于产品类别的条件文本
Conditional text based on product category in WooCommerce customer completed order email notification
我正在尝试根据基于订单中产品类别的一组条件回显 WooCommerce 生成的订单完成电子邮件中的一些文本 table。
我有 4 个产品类别(一类、二类、三类、四类)。
一个类别有可变产品(以防万一,尽管我在没有它的情况下测试订单)
我想要的条件是:
- 仅适用于客户订单完成电子邮件
- 如果订单只有 cat-one 中的产品,则使用“SOME TEXT”
- 如果订单中有第一类产品和任何其他类别的产品,则使用“其他文本”
- 如果订单包含除 cat-one 之外的所有类别的产品,则使用“ANOTHER TEXT”
到目前为止我尝试过的:
function add_instructions_to_email( $order, $sent_to_admin, $plain_text, $email ) {
$cat_one = false;
$cat_two = false;
$cat_three = false;
$cat_four = false;
$items = $order->get_items();
foreach ( $items as $item ) {
$product_id = $item->get_product_id();
//CHECK WHICH CATEGORIES ARE IN THE ORDER
if ( has_term( 'cat_one', 'product_cat', $product_id ) ) {
$cat_one=true;
}
if ( has_term( 'cat_two', 'product_cat', $product_id ) ) {
$cat_two=true;
}
if ( has_term( 'cat_three', 'product_cat', $product_id ) ) {
$cat_three=true;
}
if ( has_term( 'cat_four', 'product_cat', $product_id ) ) {
$cat_four=true;
}
if ( $email->id == 'customer_completed_order') {
// 1. ONLY CAT-ONE
if ( $cat_one) {
echo "SOME TEXT";
}
// 2. CAT-ONE and any other Category
elseif ( $cat_one && $cat_two || $cat_three || $cat_four) {
if($order->has_shipping_method('local_pickup')) {
echo "SOME TEXT";
} else {
echo "SOME OTHER TEXT";
}
}
// 3. THERE IS NO CAT-ONE IN THE ORDER
elseif ( !$cat_one && $cat_two || $cat_three || $cat_four ) {
if ($order->has_shipping_method('local_pickup')) {
echo "SOME TEXT";
} else {
echo "SOME OTHER TEXT";
}
}
}
add_action( 'woocommerce_email_before_order_table', 'add_instructions_to_email', 20, 4 );
它没有按预期工作。我还尝试在 foreach
中使用 elseif
语句,并在 has_term
语句中直接使用条件语句。没有成功。
感谢任何帮助。
您的代码有一些小错误,以下 code/answer 包含:
- 仅适用于客户订单完成电子邮件
- 如果订单只有 cat-one 中的产品,则使用“SOME TEXT”
- 如果订单中有第一类产品和任何其他类别的产品,则使用“其他文本”
- 如果订单包含除 cat-one 之外的所有类别的产品,则使用“ANOTHER TEXT”
所以你得到:
function action_woocommerce_email_before_order_table( $order, $sent_to_admin, $plain_text, $email ) {
// Only for order completed email
if ( $email->id == 'customer_completed_order' ) {
// Booleans
$cat_one = false;
$cat_two = false;
$cat_three = false;
$cat_four = false;
// Output
$output = '';
// Loop through order items
foreach ( $order->get_items() as $item ) {
// Product ID
$product_id = $item->get_variation_id() > 0 ? $item->get_variation_id() : $item->get_product_id();
// Has term (product category)
if ( has_term( 'cat-one', 'product_cat', $product_id ) ) {
$cat_one = true;
}
if ( has_term( 'cat-two', 'product_cat', $product_id ) ) {
$cat_two = true;
}
if ( has_term( 'cat-three', 'product_cat', $product_id ) ) {
$cat_three = true;
}
if ( has_term( 'cat-four', 'product_cat', $product_id ) ) {
$cat_four = true;
}
}
// 1. ONLY CAT-ONE
if ( $cat_one ) {
$output = "SOME TEXT";
// 2. CAT-ONE and any other Category
if ( $cat_two || $cat_three || $cat_four ) {
$output = "SOME OTHER TEXT";
}
} else {
// 3. ALL CATEGORIES EXCEPT CAT-ONE
if ( $cat_two && $cat_three && $cat_four ) {
$output = "ANOTHER TEXT";
}
}
// Output
echo $output;
}
}
add_action( 'woocommerce_email_before_order_table', 'action_woocommerce_email_before_order_table', 10, 4 );
我正在尝试根据基于订单中产品类别的一组条件回显 WooCommerce 生成的订单完成电子邮件中的一些文本 table。
我有 4 个产品类别(一类、二类、三类、四类)。
一个类别有可变产品(以防万一,尽管我在没有它的情况下测试订单)
我想要的条件是:
- 仅适用于客户订单完成电子邮件
- 如果订单只有 cat-one 中的产品,则使用“SOME TEXT”
- 如果订单中有第一类产品和任何其他类别的产品,则使用“其他文本”
- 如果订单包含除 cat-one 之外的所有类别的产品,则使用“ANOTHER TEXT”
到目前为止我尝试过的:
function add_instructions_to_email( $order, $sent_to_admin, $plain_text, $email ) {
$cat_one = false;
$cat_two = false;
$cat_three = false;
$cat_four = false;
$items = $order->get_items();
foreach ( $items as $item ) {
$product_id = $item->get_product_id();
//CHECK WHICH CATEGORIES ARE IN THE ORDER
if ( has_term( 'cat_one', 'product_cat', $product_id ) ) {
$cat_one=true;
}
if ( has_term( 'cat_two', 'product_cat', $product_id ) ) {
$cat_two=true;
}
if ( has_term( 'cat_three', 'product_cat', $product_id ) ) {
$cat_three=true;
}
if ( has_term( 'cat_four', 'product_cat', $product_id ) ) {
$cat_four=true;
}
if ( $email->id == 'customer_completed_order') {
// 1. ONLY CAT-ONE
if ( $cat_one) {
echo "SOME TEXT";
}
// 2. CAT-ONE and any other Category
elseif ( $cat_one && $cat_two || $cat_three || $cat_four) {
if($order->has_shipping_method('local_pickup')) {
echo "SOME TEXT";
} else {
echo "SOME OTHER TEXT";
}
}
// 3. THERE IS NO CAT-ONE IN THE ORDER
elseif ( !$cat_one && $cat_two || $cat_three || $cat_four ) {
if ($order->has_shipping_method('local_pickup')) {
echo "SOME TEXT";
} else {
echo "SOME OTHER TEXT";
}
}
}
add_action( 'woocommerce_email_before_order_table', 'add_instructions_to_email', 20, 4 );
它没有按预期工作。我还尝试在 foreach
中使用 elseif
语句,并在 has_term
语句中直接使用条件语句。没有成功。
感谢任何帮助。
您的代码有一些小错误,以下 code/answer 包含:
- 仅适用于客户订单完成电子邮件
- 如果订单只有 cat-one 中的产品,则使用“SOME TEXT”
- 如果订单中有第一类产品和任何其他类别的产品,则使用“其他文本”
- 如果订单包含除 cat-one 之外的所有类别的产品,则使用“ANOTHER TEXT”
所以你得到:
function action_woocommerce_email_before_order_table( $order, $sent_to_admin, $plain_text, $email ) {
// Only for order completed email
if ( $email->id == 'customer_completed_order' ) {
// Booleans
$cat_one = false;
$cat_two = false;
$cat_three = false;
$cat_four = false;
// Output
$output = '';
// Loop through order items
foreach ( $order->get_items() as $item ) {
// Product ID
$product_id = $item->get_variation_id() > 0 ? $item->get_variation_id() : $item->get_product_id();
// Has term (product category)
if ( has_term( 'cat-one', 'product_cat', $product_id ) ) {
$cat_one = true;
}
if ( has_term( 'cat-two', 'product_cat', $product_id ) ) {
$cat_two = true;
}
if ( has_term( 'cat-three', 'product_cat', $product_id ) ) {
$cat_three = true;
}
if ( has_term( 'cat-four', 'product_cat', $product_id ) ) {
$cat_four = true;
}
}
// 1. ONLY CAT-ONE
if ( $cat_one ) {
$output = "SOME TEXT";
// 2. CAT-ONE and any other Category
if ( $cat_two || $cat_three || $cat_four ) {
$output = "SOME OTHER TEXT";
}
} else {
// 3. ALL CATEGORIES EXCEPT CAT-ONE
if ( $cat_two && $cat_three && $cat_four ) {
$output = "ANOTHER TEXT";
}
}
// Output
echo $output;
}
}
add_action( 'woocommerce_email_before_order_table', 'action_woocommerce_email_before_order_table', 10, 4 );