【问题标题】:Adding custom data to Woocommerce Order items将自定义数据添加到 Woocommerce 订单项目
【发布时间】:2018-05-21 09:58:20
【问题描述】:

我有一个自定义插件,允许客户将自定义信息添加到他们的订单中。

商品被添加到购物车,并且自定义数据显示在购物车页面上。但是,自定义信息不会传递到后端的订单页面。理想情况下,我还希望将自定义数据添加到客户订单电子邮件中。

目前的代码如下:

<?php
function wcpc_save_custom_product_field( $cart_item_data, $product_id ) {
    if( isset( $_REQUEST['wcpc_custom_product'] ) ) {
        $cart_item_data[ 'wcpc_custom_product' ] = $_REQUEST['wcpc_custom_product'];
        $cart_item_data[ 'wcpc_custom_price' ] = $_REQUEST['wcpc_custom_price'];
        /* below statement make sure every add to cart action as unique line item */
        $cart_item_data['unique_key'] = md5( microtime().rand() );
    }
    return $cart_item_data;
}
add_action( 'woocommerce_add_cart_item_data', 'wcpc_save_custom_product_field', 10, 2 );

function render_meta_on_cart_and_checkout( $cart_data, $cart_item = null ) {
    $custom_items = array();
    /* Woo 2.4.2 updates */
    if( !empty( $cart_data ) ) {
        $custom_items = $cart_data;
    }
    if( isset( $cart_item['wcpc_custom_product'] ) &&  $cart_item['wcpc_custom_product'] != '' ) {
        $custom_items[] = array( "name" => 'Custom', "value" => $cart_item['wcpc_custom_product'] );
    }
    return $custom_items;
}
add_filter( 'woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 10, 2 );

add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );

function add_custom_price( $cart_object ) {

//  This is necessary for WC 3.0+
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    foreach ( $cart_object->get_cart() as $key => $value ) {
        if(isset($value['wcpc_custom_price'])) {
            $value['data']->set_price( $value['wcpc_custom_price'] );
        }
    }

}
?>

我已经尝试修改我在网上找到的代码 sn-p 并添加到上面的代码中。然而,当我实现这个时,购物车完全坏了:

function wcpc_order_item_product( $cart_item, $order_item ){

    if( isset( $order_item['wcpc_custom_product'] ) ){
        $cart_item_meta['wcpc_custom_product'] = $order_item['wcpc_custom_product'];
    }

    return $cart_item;

}
add_filter( 'woocommerce_order_item_product', 'wcpc_order_item_product', 10, 2 );

任何帮助将不胜感激。我没有太多的编码经验,我正在努力寻找一种方法来让它工作。

【问题讨论】:

    标签: php wordpress woocommerce hook-woocommerce orders


    【解决方案1】:

    钩子woocommerce_add_order_item_meta 即将被弃用。由于 Woocommerce 3 提供了更好的挂钩。试试这个:

    add_action( 'woocommerce_checkout_create_order_line_item', 'custom_checkout_create_order_line_item', 20, 4 );
    function custom_checkout_create_order_line_item( $item, $cart_item_key, $values, $order ) {
        if( ! isset( $values['wcpc_custom_product'] ) ) return;
    
        if( ! empty( $values['wcpc_custom_product'] ) )
            $item->update_meta_data( 'Custom label', $values['wcpc_custom_product'] );
    
    }
    

    您必须将“自定义标签”替换为要显示的标签,并带有值...

    这样您的自定义字段将显示在任何地方,后端和前端订单和电子邮件通知中。

    请参阅此相关主题,该主题将为您提供所有解释:
    Woocommerce: which hook to use instead of deprecated "woocommerce_add_order_item_meta"

    【讨论】:

    • 嗨 Loic,非常感谢您的回复。您的帖子在过去对我帮助很大!不幸的是,当我复制/粘贴上面的代码时,会导致购物车完全损坏。你对我哪里出错有任何想法吗?
    • 嗨 Loic,请忽略最后一个帖子!它现在可以工作了,我升级了 Woocommerce。但是,已经创建了另一个问题,现在我使用的是最新版本,我的类别被重复了,如下所示:aurello.co.uk/product-category/splashbacks你知道我如何隐藏/删除一组类别以便只显示一个吗?跨度>
    • 这只是在网站的前端 - 后端重复没有问题
    【解决方案2】:

    您可以使用 wc_add_order_item_meta() 将自定义元数据保存在订单和后端

    例如 ::

    add_action('woocommerce_add_order_item_meta','add_values_to_order_item_meta',1,2);
    if(!function_exists('add_values_to_order_item_meta'))
    {
      function add_values_to_order_item_meta($item_id, $values)
      {
            global $woocommerce,$wpdb;
            $user_custom_values = $values['user_custom_data_value'];
            if(!empty($user_custom_values))
            {
                wc_add_order_item_meta($item_id,'user_custom_data',$user_custom_values);  
            }
      }
    }
    

    来自您编辑的代码。

    add_action('woocommerce_add_order_item_meta','add_values_to_order_item_meta',1,2);
    if(!function_exists('add_values_to_order_item_meta')) 
    { 
        function add_values_to_order_item_meta($item_id, $values) 
            { 
                global $woocommerce,$wpdb;
                $user_custom_values = $values['wcpc_custom_product'];
                if(!empty($user_custom_values)) {
                wc_add_order_item_meta($item_id,'wcpc_custom_product',$user_custom_values); }
            } 
    }
    

    【讨论】:

    • 感谢您的回复。我是否需要编辑此代码以使其与我的插件兼容?我试着做一个快速的复制/粘贴工作。购物车仍在工作,但自定义数据未显示在订单页面上。
    • 你必须根据你的需要编辑这个,这只是一个例子。
    • 谢谢!好的,所以我将代码修改为: add_action('woocommerce_add_order_item_meta','add_values_to_order_item_meta',1,2); if(!function_exists('add_values_to_order_item_meta')) { function add_values_to_order_item_meta($item_id, $values) { global $woocommerce,$wpdb; $user_custom_values = $values['wcpc_custom_product']; if(!empty($user_custom_values)) { wc_add_order_item_meta($item_id,'wcpc_custom_product',$user_custom_values); } } }
    • 有效,但是当客户到达订单详情页面时,显示如下:Product Total test × 1 wcpc_custom_product: Width: 50, Length: 50, Brackets: , £0.00
    猜你喜欢
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 2016-10-12
    • 2021-02-22
    • 2018-01-03
    • 1970-01-01
    • 2021-07-13
    • 2021-02-12
    相关资源
    最近更新 更多