skip to Main Content

Is there any way I can add content from a custom product field to ‘order completed’ WooCommerce emails?

I have added this code to my functions.php in order to save my custom field to the product meta information.

//1.1 Display Activation Instructions field in admin
add_action('woocommerce_product_options_inventory_product_data', 'woocommerce_product_act_fields');
function woocommerce_product_act_fields(){
    global $woocommerce, $post;
    echo '<div class="product_custom_field">';
    woocommerce_wp_text_input(
        array(
            'id' => '_act',
            'label' => __('Activation Instructions', 'woocommerce'),
            'desc_tip' => 'true',
            'description' => 'Enter the Activation Instructions Link.'
        )
    );    
    echo '</div>';
}

//1.2 Save Activation Instructions field in product meta
add_action('woocommerce_process_product_meta', 'woocommerce_product_act_field_save');
function woocommerce_product_act_field_save($post_id){
    $woocommerce_act_product_text_field = $_POST['_act'];
    if (!empty($woocommerce_act_product_text_field))
        update_post_meta($post_id, '_act', esc_attr($woocommerce_act_product_text_field));
}

I have also added this code to display a custom text on my ‘order completed’ woocomerce emails.

add_action( 'woocommerce_email_customer_details', 'bbloomer_add_content_specific_email', 20, 4 );
function bbloomer_add_content_specific_email( $order, $sent_to_admin, $plain_text, $email ) {
   if ( $email->id == 'customer_completed_order' ) {
      echo '<h2>Activation & Download Instructions</h2><p style="margin-bottom:35px;">Please refer to 
      our <a href="https://example.com/activation-guides/">Activation Guides</a> for detailed 
      activation and download instructions.</p>';
   }
}

The above code works well and it displays the custom text for all ‘order completed’ emails.

But, I want to replace the URL part of the text with the custom product field data. The data is different for every product.

Thanks.

2

Answers


  1. Use: get_post_meta to retrieves a post meta field for the given post ID.

    //1.1 Display Activation Instructions field in admin
    function woocommerce_product_act_fields() {
        echo '<div class="product_custom_field">';
    
        woocommerce_wp_text_input(
            array(
                'id' => '_act',
                'label' => __('Activation Instructions', 'woocommerce'),
                'desc_tip' => 'true',
                'description' => 'Enter the Activation Instructions Link.'
            )
        );
    
        echo '</div>';
    }
    add_action('woocommerce_product_options_inventory_product_data', 'woocommerce_product_act_fields', 10, 0 );
    
    //1.2 Save Activation Instructions field in product meta
    function woocommerce_product_act_field_save( $product ) {
        if( isset($_POST['_act']) ) {
            $product->update_meta_data( '_act', sanitize_text_field( $_POST['_act'] ) );
        }
    }
    add_action( 'woocommerce_admin_process_product_object', 'woocommerce_product_act_field_save', 10, 1 );
    
    //2 Add url to email
    function woocommerce_product_act_email( $order, $sent_to_admin, $plain_text, $email ) {
        if ( $email->id == 'customer_completed_order' ) {
            $items = $order->get_items();
    
            echo '<h2>Activation & Download Instructions</h2>';
    
            foreach ( $items as $item ) {
                // Get product ID
                $product_id = $item->get_product_id();
    
                // Get product name
                $product_name = $item->get_name();
    
                // Get post meta
                $url = get_post_meta( $product_id, '_act', true);
    
                if ( $url ) {
                    echo '<p style="margin-bottom:35px;">For ' . $product_name . ' follow <a href="' . $url. '"> these instructions</a></p>';
                }
            }
        }
    }
    add_action( 'woocommerce_email_customer_details', 'woocommerce_product_act_email', 20, 4 );
    
    Login or Signup to reply.
  2. add_action( 'woocommerce_email_customer_details', 'bbloomer_add_content_specific_email', 20, 4 );
    
    function bbloomer_add_content_specific_email( $order, $sent_to_admin, $plain_text, $email ) {
        if ( $email->id == 'customer_completed_order' ) {
    
            $items = $order->get_items();
    
            foreach ( $items as $item ) {
                // Get product ID
                $product_id = $item->get_product_id();
    
                // Get post meta
                $url = get_post_meta( $product_id, '_act', true );
    
                if ( $url ) {
                    echo '<h2>'.$item->get_name().'Activation & Download Instructions</h2><p style="margin-bottom:35px;">Please refer to our <a href="' . $url . '">Activation Guides</a> for detailed activation and download instructions.</p>';
                }
            }
        }
    }
    

    Try this code

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search