Reputation: 4320
All my orders are created with the on-hold
state by default until payment is confirmed and then the state turns to processing
. I created a hook to send the on-hold
email every time a new order is created to ensure every user will receive an email once the order is created.
//Force on-hold email notification bug workaround
add_action('woocommerce_new_order', 'new_order_on_hold_notification', 30, 1 );
function new_order_on_hold_notification( $order_id ) {
//global $woocommerce;
//$mailer = $woocommerce->mailer();
$order = wc_get_order( $order_id );
// Send Customer On-Hold Order notification
WC()->mailer()->get_emails()['WC_Email_Customer_On_Hold_Order']->trigger( $order_id );
}
The email is being sent, but for some reason, the order items are not being included in the email, this is weird since the rest of the emails woocommerce sends (upon order completion, shipped and delivered states) are correctly sent with order items.
UPDATE
As requested I attach the customer-on-hold-order.php
template Im using in my theme, it's basically the same as the default woocommerce template just added an image at the top of the email.
<?php
/**
* Customer on-hold order email
*
* This template can be overridden by copying it to yourtheme/woocommerce/emails/customer-on-hold-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/
* @package WooCommerce/Templates/Emails
* @version 3.7.0
*/
defined( 'ABSPATH' ) || exit;
/*
* @hooked WC_Emails::email_header() Output the email header
*/
do_action( 'woocommerce_email_header', $email_heading, $email ); ?>
<!--[if gte MSO 9]>
<table width="640">
<tr>
<td>
<![endif]-->
<table width="100%" style="max-width:640px;">
<tr>
<td>
<img src="https://ebani.com.co/wp-content/themes/martfury-child/woocommerce/emails/images/pedido-en-espera.jpg" width="100%" />
</td>
</tr>
</table>
<!--[if gte MSO 9]>
</td>
</tr>
</table>
<![endif]-->
<?php /* translators: %s: Customer first name */ ?>
<p><?php printf( esc_html__( 'Hi %s,', 'woocommerce' ), esc_html( $order->get_billing_first_name() ) ); ?></p>
<p><?php esc_html_e( 'Thanks for your order. It’s on-hold until we confirm that payment has been received. In the meantime, here’s a reminder of what you ordered:', 'woocommerce' ); ?></p>
<?php
/*
* @hooked WC_Emails::order_details() Shows the order details table.
* @hooked WC_Structured_Data::generate_order_data() Generates structured data.
* @hooked WC_Structured_Data::output_structured_data() Outputs structured data.
* @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 );
/**
* Show user-defined additional content - this is set in each email's settings.
*/
if ( $additional_content ) {
echo wp_kses_post( wpautop( wptexturize( $additional_content ) ) );
}
/*
* @hooked WC_Emails::email_footer() Output the email footer
*/
do_action( 'woocommerce_email_footer', $email );
Update #2
After debugging the email-order-items.php
template I found that the $items
array is empty however this is weird as I told you all other emails are correct with the order items.
Upvotes: 3
Views: 2645
Reputation: 4320
Finally, I found the root of the issue thanks to this question, it seems when woocommerce_new_order
is called the order is not yet fully populated, that's why in the notification email the order items array is empty. using woocommerce_checkout_order_processed
instead made the trick!
add_action('woocommerce_checkout_order_processed', 'new_order_on_hold_notification');
function new_order_on_hold_notification( $order_id ) {
$order = wc_get_order( $order_id );
// Only for on hold new orders
if( ! $order->has_status('on-hold') )
return; // Exit
// Send Customer On-Hold Order notification
WC()->mailer()->get_emails()['WC_Email_Customer_On_Hold_Order']->trigger( $order_id );
}
Upvotes: 2