在 WooCommerce 中添加自定义购物车项目数据数组作为订单项目元数据数组

问题描述 投票:0回答:1

我有此设置可以将产品的自定义元字段添加到订单中的商品中。

1:我使用 woocommerce_before_add_to_cart_button 创建一个自定义字段,该字段是具有多个字段的列表字段。它们保存为多维数组。

2:然后,当将元数据添加到购物车时,我使用 woocommerce_add_cart_item_data 将元数据添加到购物车中的项目。多维数组保存在一个自定义字段中。

3:然后我使用 woocommerce_cart_item_namewoocommerce_order_item_name 在购物车和产品标题下的结帐中显示这些字段。我使用 foreach 显示数组中的数据。没问题。

4:最后我使用 woocommerce_checkout_create_order_line_item 将自定义元数据保存到订单和商品中。这是我遇到阵列问题的地方,我没有得到保存。其他字段,不是数组,而是数字或变量,没有问题。

我已经尝试过这些:

$item->add_meta_data( 'team', $values['team'], false );
$item->add_meta_data( 'team', $values['team'], true );

问题还在于我无法在该挂钩中回显或打印以查看发生了什么或数据的样子。结账后订单中该字段为空。

为什么我不能只获取数组并将其添加到此处订单中项目的自定义元中?这与它是一个数组这一事实有关,因为其他字段可能有效:)

php woocommerce hook-woocommerce orders custom-fields
1个回答
0
投票

抱歉,但是还有其他一些事情在您的案例中造成了麻烦,没有人可以通过您问题中提供的详细信息来猜测。

下面是一个静态示例,演示了可以从自定义购物车项目数据数组将数组保存为自定义订单项目数据:

// Add an array of data as custom cart item data
add_filter( 'woocommerce_add_cart_item_data', 'add_custom_cart_item_data' );
function add_custom_cart_item_data( $cart_item_data ) {
    $cart_item_data['team_test'] = array('Set 1' => 'Value one', 'Set 2' => 'Value two');
    return $cart_item_data;
}

// Display custom cart item data in mini cart, Cart and Checkout pages
add_filter( 'woocommerce_get_item_data', 'display_custom_cart_item_data', 10, 2 );
function display_custom_cart_item_data( $cart_data, $cart_item ) {
    if( isset($cart_item['team_test']) && is_array($cart_item['team_test']) ) {
        foreach($cart_item['team_test'] as $key => $value ) {
            $cart_data[] = array(
                'key'   => $key,
                'value' => $value
            );
        }
    }
    return $cart_data;
}

// Save cart item custom data as order item metadata
add_action( 'woocommerce_checkout_create_order_line_item', 'save_custom_cart_item_data_as_order_item_meta', 10, 4 );
function save_custom_cart_item_data_as_order_item_meta( $item, $cart_item_key, $values, $order ) {
    if( isset($values['team_test']) ) {
        $item->update_meta_data('team_test', $values['team_test']);
    }
}

// Display custom order item metadata array in admin order
add_action( 'woocommerce_after_order_itemmeta', 'admin_display_custom_order_item_data_array', 10, 3 );
function admin_display_custom_order_item_data_array( $item_id, $item, $product ) {
    if( ! is_admin() && $item->get_type() !== 'line_item' ) return;

    if( $data_array = $item->get_meta('team_test') ) {
        foreach($data_array as $key => $value ) {
            printf('<div class="wc-order-item-%s" style="color:#888"><strong>%s:</strong> %s</div>', 
                sanitize_title($key), esc_html($key), esc_html($value));
        }
    }
}

从单个产品页面添加产品后,您将在购物车页面中看到

订单提交并保存后,在

wp_woocommerce_order_itemmeta

表中可以看到数据已保存:

最后,当我使用一个函数以管理订单显示该订单项元数据时:

© www.soinside.com 2019 - 2024. All rights reserved.