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

时间:2018-12-07 22:16:13

标签: php wordpress email woocommerce

已更新:

我正在建立一个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>';
}

但这是一个骇人听闻的解决方案,无法解决信息为什么未显示在已收到订单的页面中或直接出现在电子邮件中的订单行项目中的潜在问题。

1 个答案:

答案 0 :(得分:0)

好的,我已经解决了。我将答案放在这里是为了让其他所有人遇到同样的问题。基本上,我的过程缺少一个阶段。为了达到上述目的,您需要执行以下操作:

  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'>");
    
  2. 接下来,您将值添加到购物车项目数据中:

    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);
    
  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 );
    
  4. 最后,您将数据添加到您的订单商品中:

    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/向我解释此过程。