在电子邮件中显示自定义数据,订单详情 woocommerce

Posted

技术标签:

【中文标题】在电子邮件中显示自定义数据,订单详情 woocommerce【英文标题】:Show custom data in emails, order details woocommerce 【发布时间】:2019-05-09 16:30:49 【问题描述】:

更新:

我正在构建一个 WooCommerce 网站,用户在其中从单个产品页面的下拉列表中选择一系列选项,然后显示在购物车页面中,感谢我在这里收到的帮助,以及结帐时的帮助。选择的选项也会影响产品的价格。我从两个产品变体开始:“打印”和“原始”(该网站出售古董地图)。

一切正常,直到结帐时所有订单详细信息都正确显示,但是在下订单后,详细信息不会出现在“订单详细信息”下的“已收到订单”屏幕上,也不会出现在客户中确认邮件。

为了提供一些背景知识,使用 jQuery 选择不同的变体,并在下面的示例中添加到隐藏字段:

$( ":root" ).find("#mapchest-custom-fields").append("<input type='hidden' 
name='test' value='wibble'>");

...然后引用这些隐藏字段以通过以下方式将详细信息添加到购物车:

add_filter('woocommerce_add_cart_item_data','add_custom_field_data', 20,3);

function add_custom_field_data($cart_item_data, $product_id, $variation_id)


    if(isset($_REQUEST['test']) && ! empty( 'test' ))  // not
        $mc_test = sanitize_text_field($_POST['test']);
        $cart_item_data['custom_data']['test'] = array(
            'label' => 'Test',
            'value' => $mc_test
        );
    

    if(isset($_REQUEST['original_map_vendor_details']) && ! empty( 
    'original_map_vendor_details' )) 
        $mc_original_map_size = 
        sanitize_text_field($_REQUEST['original_map_vendor_details']);
        $cart_item_data['custom_data']['original_map_vendor_details'] = 
        array(
            'label' => 'Vendor',
            'value' => $mc_original_map_size
        );
    

    // process above repeated for other fields

    return $cart_item_data;

使用以下功能在购物车和结帐中显示详细信息:

add_filter('woocommerce_get_item_data','wdm_add_item_meta',10,2);

function wdm_add_item_meta($cart_data, $cart_item)


    $custom_items = array();

    if( !empty( $cart_data ) )
    $custom_items = $cart_data;

    if( isset( $cart_item['custom_data'] ) ) 
        foreach( $cart_item['custom_data'] as $key => $custom_data )
        if( $key != 'key' )
            $custom_items[] = array(
                'name' => $custom_data['label'],
                'value' => $custom_data['value'],
            );
        
        
    

    return $custom_items;

正如我所说,我想做的是在“已收到订单”页面和电子邮件中显示详细信息,但我无法使其正常工作。我知道对于电子邮件,我需要将其连接到其中一个电子邮件挂钩,但我不知道如何访问上述函数中发送到购物车的数据。

我尝试使用 woocommerce_checkout_create_order_line_item 挂钩添加到以下几行:

add_action( 'woocommerce_checkout_create_order_line_item', 
'add_custom_order_line_item_meta', 20,4 );

function add_custom_order_line_item_meta($item, $cart_item_key, $values, 
$order)

    if( array_key_exists('test', $values['custom_data']) )
        $item->update_meta_data( 'Test', $values['custom_data']['test'] );
    

...但是如果我像这样在电子邮件中 ​​var_dump 可以看到数据:

add_action('woocommerce_email_customer_details', 
'add_custom_checkout_field_to_emails_notifications', 25, 4 );

function add_custom_checkout_field_to_emails_notifications( $order, 
$sent_to_admin, $plain_text, $email ) 
    var_dump($order);

因此,总而言之,我的数据一直在工作并显示到结帐时。之后,我希望它显示在客户确认电子邮件和“已收到订单”页面上,但我无法访问数据。在查看了关于同一主题的其他问题后,我会认为这会自动发生在收到的订单页面上,但事实并非如此。我怀疑代码中缺少一个阶段,但我无法弄清楚它应该是什么。

关于我在这里做错了什么的任何提示?

提前致谢。

ps。我现在已经设法使用以下功能在确认电子邮件中显示字段(经过一段时间):

add_action( 'woocommerce_checkout_create_order_line_item', 
'add_custom_order_line_item_meta', 20,4 );

function add_custom_order_line_item_meta($item, $cart_item_key, $values, 
$order)


    if ( isset( $values['custom_data'] ) ) 
        $item->update_meta_data( __('The Custom Data', 'woocommerce'), 
        $values['custom_data'] );          
   

add_action('woocommerce_email_customer_details', 
'add_custom_checkout_field_to_emails_notifications', 25, 4 );

function add_custom_checkout_field_to_emails_notifications( $order, 
$sent_to_admin, $plain_text, $email ) 
// var_dump($order);
  foreach( $order->get_items() as $item_id => $item )

    $custom_data = $item->get_meta( 'The Custom Data' );

    foreach( $custom_data as $key => $value )

      foreach( $value as $key1 => $value1 )
        $output = '';
        $output .= '<span class="text">' . $value1  . '</span>';
        echo $output;
      
      echo "<br>";
    

    echo "<br><br>";
    // var_dump($custom_data );

  
  '</strong> <span class="text">' . $order->get_data() . '</span></div>';

但这是一个老套的解决方案,并没有解决为什么信息没有出现在收到的订单页面或直接出现在电子邮件的订单行项目中的根本问题。

【问题讨论】:

$ordervar_dump 向您展示了什么? 它向我展示了订单数据,但包含以下内容: int(1513) ["key"]=> string(4) "Test" ["value"]=> array(2) ["label"]=> string(4) "测试" ["value"]=> string(8) "wibble" 尝试添加你的问题,带有钩子的完整功能,因为人们不能总是猜到(你的第一个sn-p)......记住这些问题的答案,需要对每个人都有用.这样,它将帮助您获得更好的答案,并且对其他人有用。 公平竞争...现在编辑 戴夫,抱歉,这并不是说听起来很简洁……它基本上会在电子邮件中返回整个订单对象,其中包括我想要获取的字段。问题是访问实际数据并显示它(在电子邮件和收到的订单屏幕中)。 【参考方案1】:

好的,我已经解决了。我把答案放在这里是为了让其他有同样问题的人受益。基本上,我的过程缺少一个阶段。为了实现上述目的,您可以执行以下操作:

    定义您希望作为元数据传递的值。在我自己的情况下,我使用了一个隐藏字段,但这同样可以通过文本输入、下拉菜单或其他输入字段进行设置。在我的例子中,我使用 jquery 将其附加到一个 id 为“mapchest-custom-fields”的空 div 中,我在购物车按钮之前将其挂接到进程中。它同样可以设置为静态值。

    <?php
    function define_container_div() 
    ?>  
    <div id="mapchest-custom-fields"></div>
    <?php
     
    
    add_action( 'woocommerce_before_add_to_cart_button', 'define_container_div', 20 );
    ?>
    

    ...追加值的jQuery代码。价值也可以是动态的:

    $( ":root" ).find("#mapchest-custom-fields").append("<input type='hidden' name='test' value='wibble'>");
    

    接下来,您将值添加到您的购物车商品数据中:

    function add_values_to_cart_item_data( $cart_item_data, $product_id, $variation_id ) 
    
        if(isset($_POST['test']) && ! empty( 'test' )) 
            $test = filter_input( INPUT_POST, 'test' );
            $cart_item_data['test'] = $test;
        
    
        return $cart_item_data;
    
    
    add_filter( 'woocommerce_add_cart_item_data', 'add_values_to_cart_item_data', 10, 3);
    

    接下来,显示购物车中的价值:

    function display_data_in_cart( $item_data, $cart_item ) 
    
        $item_data[] = array(
            'key'     => __( 'Test', 'mapchest' ),
            'value'   => wc_clean( $cart_item['test'] ),
        );
    
        return $item_data;
    
    
    add_filter( 'woocommerce_get_item_data', 'display_data_in_cart', 10, 2 );
    

    最后,您将数据添加到您的订单商品中:

    function add_data_to_order_items( $item, $cart_item_key, $values, $order ) 
    
        $item->add_meta_data( __( 'Test', 'mapchest' ), $values['test'] );
    
    
    add_action( 'woocommerce_checkout_create_order_line_item', 'add_data_to_order_items', 10, 4 );
    

上述过程对我有用。它在购物车和结帐中显示自定义数据,并将其保存到“已收到订单”页面存档订单和确认电子邮件(尚未检查其他电子邮件)。

感谢https://iconicwp.com/blog/add-custom-cart-item-data-woocommerce/ 向我解释这个过程。

【讨论】:

以上是关于在电子邮件中显示自定义数据,订单详情 woocommerce的主要内容,如果未能解决你的问题,请参考以下文章

在Woocommerce管理员,订单和电子邮件中显示自定义付款字段

在Woocommerce电子邮件通知中显示自定义订单状态的付款链接

自定义 WooCommerce 日期选择器结帐字段已保存并显示在订单和电子邮件中

RookeyFrame 自定义数据源 返回统计查询后的视图

WooCommerce 订单电子邮件中未显示自定义电话号码字段

Woocommerce:在购物车、订单确认和订单电子邮件中显示变体名称 [重复]