【问题标题】:Conditional display based on product category in processing order email template处理订单邮件模板中基于产品类别的条件显示
【发布时间】:2017-01-28 11:00:59
【问题描述】:

我正在编写 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 );

我该怎么做?

谢谢

【问题讨论】:

    标签: php wordpress woocommerce categories orders


    【解决方案1】:

    这就是您所期望的。我使用 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()

    【讨论】:

    • 谢谢。我一直在寻找这个答案。
    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 2021-04-02
    • 2018-06-25
    • 2018-06-04
    • 2019-04-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多