我正在使用 WooCommerce 开发一个 WordPress 插件,以便客户可以将可定制的动态产品添加到他们的购物车。为了将定制数据放入购物车,我有以下几行:
WC()->add_to_cart($product_id, $quantity, 0, [], [ "custom_data" => $custom_data ]);
其中 $custom_data 存储产品的定制信息(基本是坐标和尺寸)。 这可以正常工作。
当客户实际购买产品时,会创建一个新订单,我可以在 WooCommerce 的管理员面板中查看它,并且我希望为订单上的每个项目显示自定义数据,以便在给定坐标的情况下制造该项目和尺寸,但我不希望客户在任何时候看到这些数据,因为它没有意义。 (数据只是字符串化的 JSON)。
我试过这个:
function add_custom_data_to_order($item, $cart_item_key, $values, $order) {
if (isset($values["custom_data"]) {
$item->add_meta_data("custom_data", $values["custom_data"]);
}
}
add_action("woocommerce_checkout_create_order_line_item", "add_custom_data_to_order", 10, 4);
这可行,但不是我想要实现的目标,因为数据在结帐期间向用户显示,并且它作为项目的属性而不是额外信息显示在项目的管理订单视图上。
我怎样才能实现这个目标?
您需要在元数据键前添加下划线,您可以在此处看到:
WC()->add_to_cart($product_id, $quantity, 0, [], [ "_custom_data" => $custom_data ]);
这应该向用户隐藏它,然后您可以添加以下过滤器和函数以将其显示在管理订单页面上:
add_filter('woocommerce_order_item_display_meta_key', 'display_custom_meta_key', 20, 3 );
function display_custom_meta_key( $meta_key, $meta, $item ) {
if( $meta->key == '_custom_data' && is_admin() ){
$meta_key = __("Custom Data", "woocommerce" );
}
return $meta_key;
}
首先,如果您想将产品添加到购物车,则
WC()->add_to_cart(
中存在错误,应该改为 WC()->cart->add_to_cart(
。您的函数中还缺少一个右括号 )
。
您可以通过两种不同的方式向客户隐藏自定义订单项元数据:
add_filter( 'woocommerce_order_item_get_formatted_meta_data', 'hide_specific_order_item_meta_data', 10, 2);
function hide_specific_order_item_meta_data($formatted_meta, $item){
// Targeting only frontend
if( is_admin() )
return $formatted_meta;
foreach( $formatted_meta as $key => $meta ){
// Here we target your meta key
if( $meta->key === 'custom_data' )
// Remove displayed meta data from front end
unset($formatted_meta[$key]);
}
return $formatted_meta;
}
add_action("woocommerce_checkout_create_order_line_item", "add_custom_data_to_order", 10, 4);
function add_custom_data_to_order($item, $cart_item_key, $values, $order) {
if ( isset($values["custom_data"]) ) {
$item->add_meta_data("_custom_data", $values["custom_data"]);
}
}