Last updated on September 25, 2023

WooCommerce order emails not sending

Don’t know where to add this snippet? Read our guide: How to add code snippets.

Ensure WooCommerce order emails are sent reliably.

If you are experiencing issues with WooCommerce order emails not sending, there are a few steps you can take to troubleshoot and resolve the problem. One common reason for this issue is a conflict with other plugins or themes. To identify and fix the problem, you can follow these steps:

  1. Check the email settings in WooCommerce:
    • Go to your WordPress admin dashboard and navigate to WooCommerce > Settings > Emails.
    • Ensure that the “Enable this email notification” option is checked for the relevant order emails (e.g., “New Order”, “Processing Order”, etc.).
    • Verify that the email recipient(s) are correctly set.
  2. Test the email functionality:
    • Install and activate the “Check Email” plugin from the WordPress.org plugin repository.
    • Go to Tools > Check Email to send a test email.
    • Check if the test email is received successfully.
  3. Disable conflicting plugins and themes:
    • Temporarily deactivate all other plugins except for WooCommerce.
    • Switch to a default WordPress theme like Twenty Twenty-One.
    • Test the order email functionality again.
    • If the emails start sending, you can narrow down the conflict by reactivating plugins and themes one by one until the issue reoccurs.
  4. Check server email configuration:
    • Contact your hosting provider to ensure that your server is properly configured to send emails.
    • Verify if there are any email-related restrictions or limitations on your server.

If the above steps do not resolve the issue, you can try using a custom code snippet to force the WooCommerce order emails to send. Here’s an example of how you can achieve this:

/**
 * Force WooCommerce order emails to send.
 */
function wpsnippets_force_order_emails( $order_id ) {
    $order = wc_get_order( $order_id );
    $order->set_status( 'completed' ); // Change the order status to trigger the email
    WC()->mailer()->get_emails()['WC_Email_Customer_Completed_Order']->trigger( $order_id );
}
add_action( 'woocommerce_thankyou', 'wpsnippets_force_order_emails', 10, 1 );

This code snippet hooks into the woocommerce_thankyou action, which is triggered after a successful order is placed. It changes the order status to ‘completed’ and manually triggers the ‘Customer Completed Order’ email. By doing so, it forces the email to be sent regardless of any potential issues.

Please note that this code should be added to your theme’s functions.php file or a custom plugin. Always make sure to backup your site before making any changes to the code.

Remember to remove this code snippet once the issue is resolved, as it is intended as a temporary workaround rather than a permanent solution.

Examples

Example 1: Resending WooCommerce Order Emails

This use case demonstrates how to resend WooCommerce order emails that were not sent initially.

function wpsnippets_resend_order_emails( $order_id ) {
    $order = wc_get_order( $order_id );
    $mailer = WC()->mailer();
    $mailer->get_emails()['WC_Email_Customer_Processing_Order']->trigger( $order_id );
}

The code snippet above shows a custom PHP function wpsnippets_resend_order_emails() that takes an $order_id as a parameter. It retrieves the order object using wc_get_order() and then triggers the WC_Email_Customer_Processing_Order email using the trigger() method of the mailer object.

Example 2: Customizing WooCommerce Order Emails

This use case demonstrates how to customize the content of WooCommerce order emails.

function wpsnippets_customize_order_email( $order, $sent_to_admin, $plain_text, $email ) {
    if ( 'customer_processing_order' === $email->id ) {
        $email->subject = 'Your Custom Subject';
        $email->heading = 'Your Custom Heading';
        $email->template_html = 'path/to/custom/template.php';
        $email->template_plain = 'path/to/custom/template.php';
    }
}
add_action( 'woocommerce_email_before_order_table', 'wpsnippets_customize_order_email', 10, 4 );

The code snippet above shows a custom PHP function wpsnippets_customize_order_email() that hooks into the woocommerce_email_before_order_table action. It checks if the email being customized is the customer_processing_order email and then modifies the subject, heading, and template paths accordingly.

Example 3: Debugging WooCommerce Order Emails

This use case demonstrates how to enable debugging for WooCommerce order emails to troubleshoot any issues with sending emails.

function wpsnippets_enable_email_debugging( $email_class ) {
    $email_class->enable_debug_mode();
}
add_action( 'woocommerce_email', 'wpsnippets_enable_email_debugging' );

The code snippet above hooks into the woocommerce_email action and calls the enable_debug_mode() method on the $email_class object. This enables debugging for WooCommerce order emails, allowing you to see detailed logs and debug information related to email sending.

Last updated on September 25, 2023. Originally posted on October 17, 2023.

Leave a Reply

Your email address will not be published. Required fields are marked *