将自定义数据添加到 Woocommerce 订单项目
Adding custom data to Woocommerce Order items
我有一个自定义插件,允许客户将自定义信息添加到他们的订单中。
商品已添加到购物车,自定义数据显示在购物车页面上。但是,自定义信息不会转移到后端的订单页面。理想情况下,我还希望将自定义数据添加到客户订单电子邮件中。
当前代码如下:
<?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'] );
}
}
}
?>
我试过修改我在网上找到的代码片段并添加到上面的代码中。然而,当我实现这个时,购物车完全坏了:
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 );
如有任何帮助,我们将不胜感激。我没有太多的编码经验,而且我正在努力寻找一种方法来实现它。
您可以使用 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); }
}
}
挂钩 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'] );
}
您必须将“自定义标签”替换为您希望显示的标签的值...
这样您的自定义字段将显示在后端和前端订单以及电子邮件通知中的任何地方。
查看这个相关的线程,它会给你所有的解释:
我有一个自定义插件,允许客户将自定义信息添加到他们的订单中。
商品已添加到购物车,自定义数据显示在购物车页面上。但是,自定义信息不会转移到后端的订单页面。理想情况下,我还希望将自定义数据添加到客户订单电子邮件中。
当前代码如下:
<?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'] );
}
}
}
?>
我试过修改我在网上找到的代码片段并添加到上面的代码中。然而,当我实现这个时,购物车完全坏了:
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 );
如有任何帮助,我们将不胜感激。我没有太多的编码经验,而且我正在努力寻找一种方法来实现它。
您可以使用 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); }
}
}
挂钩 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'] );
}
您必须将“自定义标签”替换为您希望显示的标签的值...
这样您的自定义字段将显示在后端和前端订单以及电子邮件通知中的任何地方。
查看这个相关的线程,它会给你所有的解释: