Home  >  Q&A  >  body text

Exclude billing address from specific WooCommerce email notifications, show only shipping address

The "woocommerce_email_customer_details" action contains billing address and shipping address data. All I need is the shipping address.

How can I achieve this goal? Below is my current "New Order" email plain text template (admin-new-order.php)

/*Admin new order email (plain text)*/
defined( 'ABSPATH' ) || exit;
do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email );
do_action( 'woocommerce_email_order_details', $order, $sent_to_admin, $plain_text, $email );
if ( $additional_content ) {
    echo esc_html( wp_strip_all_tags( wptexturize( $additional_content ) ) );
}

P粉071626364P粉071626364318 days ago479

reply all(1)I'll reply

  • P粉806834059

    P粉8068340592023-12-30 10:19:53

    For HTML email:

    If you use this code, it will remove billing and shipping information from the required email notifications. This is because it ensures that the related template files are not loaded:

    function action_woocommerce_email_customer_details( $order, $sent_to_admin, $plain_text, $email ) {
        $mailer = WC()->mailer();
        remove_action( 'woocommerce_email_customer_details', array( $mailer, 'email_addresses' ), 20 );
    }
    add_action( 'woocommerce_email_customer_details', 'action_woocommerce_email_customer_details', 5, 4 );
    

    However, since you only want to partially hide/not show the output of the related template file (/emails/email-addresses.php) a different approach will be required.

    This can be done by adapting the /emails/email-addresses.php template file to your needs. This template can be overridden by copying it yourtheme/woocommerce/emails/email-addresses.php

    Note: Since you only want to apply this to specific email notifications, you will need to use $email->id. Since this is not passed to the relevant template file by default, a workaround is required.

    How to pass "$email" to the WooCommerce email template file if it is not available by defaultThis is described in Reply Codes.


    So to answer your question:

    Step 1)Add in the functions.php

    file of the active child theme (or active theme)
    // Header - set global variable
    function action_woocommerce_email_header( $email_heading, $email ) {
        $GLOBALS['email_id'] = $email->id;
    } 
    add_action( 'woocommerce_email_header', 'action_woocommerce_email_header', 10, 2 );
    

    Step 2) In the /emails/email-addresses.php template file, @version 5.6.0

    Replace lines 18 - 20

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

    and

    if ( ! defined( 'ABSPATH' ) ) {
        exit;
    }
    
    // Getting the email ID global variable
    $ref_name_globals_var = isset( $GLOBALS ) ? $GLOBALS : '';
    $email_id = isset( $ref_name_globals_var['email_id'] ) ? $ref_name_globals_var['email_id'] : '';
    

    and

    Replace lines 28 - 40

    
        

    get_billing_phone() ) : ?>
    get_billing_phone() ); ?> get_billing_email() ) : ?>
    get_billing_email() ); ?>

    and

    
        
            

    get_billing_phone() ) : ?>
    get_billing_phone() ); ?> get_billing_email() ) : ?>
    get_billing_email() ); ?>


    For plain text email:

    Step 1)Add in the functions.php

    file of the active child theme (or active theme)
    function action_woocommerce_email_order_details( $order, $sent_to_admin, $plain_text, $email ) {
        // Plain text is TRUE and target specific email notification
        if ( $plain_text && $email->id == 'new_order' ) {
            $GLOBALS['email_id'] = $email->id;
        }
    }
    add_action( 'woocommerce_email_order_details', 'action_woocommerce_email_order_details', 1, 4 );
    

    Step 2) In the /emails/plain/email-addresses.php template file, @version 5.6.0

    Replace lines 20 - 29

    echo "\n" . esc_html( wc_strtoupper( esc_html__( 'Billing address', 'woocommerce' ) ) ) . "\n\n";
    echo preg_replace( '##i', "\n", $order->get_formatted_billing_address() ) . "\n"; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
    
    if ( $order->get_billing_phone() ) {
        echo $order->get_billing_phone() . "\n"; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
    }
    
    if ( $order->get_billing_email() ) {
        echo $order->get_billing_email() . "\n"; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
    }
    

    and

    // Getting the email ID global variable
    $ref_name_globals_var = isset( $GLOBALS ) ? $GLOBALS : '';
    $email_id = isset( $ref_name_globals_var['email_id'] ) ? $ref_name_globals_var['email_id'] : '';
    
    // Targeting NOT a specific email. Multiple statuses can be added, separated by a comma
    if ( ! in_array( $email_id, array( 'new_order' ) ) ) {
        echo "\n" . esc_html( wc_strtoupper( esc_html__( 'Billing address', 'woocommerce' ) ) ) . "\n\n";
        echo preg_replace( '##i', "\n", $order->get_formatted_billing_address() ) . "\n"; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
    
        if ( $order->get_billing_phone() ) {
            echo $order->get_billing_phone() . "\n"; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
        }
    
        if ( $order->get_billing_email() ) {
            echo $order->get_billing_email() . "\n"; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
        }
    }
    

    reply
    0
  • Cancelreply