php-在处理订单电子邮件模板中基于产品类别的条件显示

我正在研究customer-processing-order.php WooCommerce电子邮件模板的代码.

仅当订单商品具有已定义商品的订单商品时,我才想显示以下代码.

<p><?php _e( "Your order has been received and is now being processed. Your order details are shown below for your reference:", 'woocommerce' ); ?></p>

就像是:

if($categ="demo1"){
<p><?php _e( "Your order has been received and is now being processed. Some text here:", 'woocommerce' ); ?></p>
} 

这是模板代码的一部分:

<?php
/**
 * Customer processing order email
 *
 * This template can be overridden by copying it to yourtheme/woocommerce/emails/customer-processing-order.php.
 *
 * HOWEVER, on occasion WooCommerce will need to update template files and you
 * (the theme developer) will need to copy the new files to your theme to
 * maintain compatibility. We try to do this as little as possible, but it does
 * happen. When this occurs the version of the template file will be bumped and
 * the readme will list any important changes.
 *
 * @see         https://docs.woocommerce.com/document/template-structure/
 * @author      WooThemes
 * @package     WooCommerce/Templates/Emails
 * @version     2.5.0
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

/**
 * @hooked WC_Emails::email_header() Output the email header
 */
do_action( 'woocommerce_email_header', $email_heading, $email ); ?>

<p><?php _e( "Your order has been received and is now being processed. Your order details are shown below for your reference:", 'woocommerce' ); ?></p>

<?php

/**
 * @hooked WC_Emails::order_details() Shows the order details table.
 * @hooked WC_Emails::order_schema_markup() Adds Schema.org markup.
 * @since 2.5.0
 */
do_action( 'woocommerce_email_order_details', $order, $sent_to_admin, $plain_text, $email );

/**
 * @hooked WC_Emails::order_meta() Shows order meta data.
 */
do_action( 'woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text, $email );

/**
 * @hooked WC_Emails::customer_details() Shows customer details
 * @hooked WC_Emails::email_address() Shows email address
 */
do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email );

/**
 * @hooked WC_Emails::email_footer() Output the email footer
 */
do_action( 'woocommerce_email_footer', $email );

我怎样才能做到这一点?

谢谢

解决方法:

这就是您所期望的.我使用WordPress原生条件函数has_term().此函数以单个术语的字符串或多个术语的数组形式接受术语ID,术语名称或术语段.

您将必须定义一个或多个类别(请参见两个代码中的注释).

这是定制的模板代码(针对一个类别):

<?php
/**
 * Customer processing order email
 *
 * This template can be overridden by copying it to yourtheme/woocommerce/emails/customer-processing-order.php.
 *
 * HOWEVER, on occasion WooCommerce will need to update template files and you
 * (the theme developer) will need to copy the new files to your theme to
 * maintain compatibility. We try to do this as little as possible, but it does
 * happen. When this occurs the version of the template file will be bumped and
 * the readme will list any important changes.
 *
 * @see         https://docs.woocommerce.com/document/template-structure/
 * @author      WooThemes
 * @package     WooCommerce/Templates/Emails
 * @version     2.5.0
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

//Define below your category (ID, slug or name)
$category = 'my_category';

$has_category = false;
foreach( $order->get_items() as $order_item ) {
    if( has_term( $category, 'product_cat', $order_item["product_id"] ) ) {
        $has_category = true;
        break;
    }
}

/**
 * @hooked WC_Emails::email_header() Output the email header
 */

do_action( 'woocommerce_email_header', $email_heading, $email ); ?>

<?php
// Here is your conditional statement based on a defined product category
if( $has_category ){
    echo '<p>'. __( "Your order has been received and is now being processed. Some text here:", 'woocommerce' ) .'</p>';
} else {
    echo '<p>'. __( "Your order has been received and is now being processed. Your order details are shown below for your reference:", 'woocommerce' ) .'</p>';
}
?>

<?php

/**
 * @hooked WC_Emails::order_details() Shows the order details table.
 * @hooked WC_Emails::order_schema_markup() Adds Schema.org markup.
 * @since 2.5.0
 */
do_action( 'woocommerce_email_order_details', $order, $sent_to_admin, $plain_text, $email );

# ... etc ...

如果您有多个类别,则代码将非常相似:

//Define below your categories in the array (IDs, slugs or names)
$categories = array('my_category1', 'my_category2', 'my_category3');

$has_category = false;
foreach( $order->get_items() as $order_item ) {

    if( has_term( $categories, 'product_cat', $order_item["product_id"] ) ) {
        $has_category = true;
        break;
    }
}

所有代码都经过测试并且可以正常工作.

参考:WordPress Function Reference — has_term()

上一篇:如何基于WooCommerce属性编写条件PHP


下一篇:php-“在订单满$100时免费获得产品X” WooCommerce中的优惠券代码