2

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.

7uc1f3r
  • 25,125
  • 15
  • 25
  • 45
Mayank Chawla
  • 49
  • 1
  • 4

2 Answers2

2

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 );
7uc1f3r
  • 25,125
  • 15
  • 25
  • 45
  • I didn't take into account that there could be multiple items in same order and therefore multiple URLs and multiple messages will be printed. Is there any way to echo the product name along with the message. Like this: For $order_item1, follow these instructions. For $order_item2, follow these instructions. – Mayank Chawla Apr 26 '20 at 10:51
  • I have updated my answer to your additional question – 7uc1f3r Apr 26 '20 at 11:12
-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

mujuonly
  • 8,969
  • 5
  • 39
  • 68
  • the `$order->get_id()` will never be the same as the `$product_id`, see my answer. It concerns multiple fields from the product options, not a field added in the checkout page – 7uc1f3r Apr 26 '20 at 10:42