通过使用 Woocommerce 中的自定义元数据的获取请求将项目添加到购物车
Add item to cart through a Get request with custom meta data in Woocommerce
我在 woocommerce 的订单视图中为每个商品创建了一个按钮(在订单详细信息-item.php 内),以使客户能够将该商品添加到购物车并购买更多。通过使用建立在 ?add-to-cart 基础上的 href,我可以让它正常工作,既适用于简单产品,也适用于可变产品,并且具有不同的属性。
问题是我无法同时传递我创建的自定义元字段(门宽)。我尝试了几种解决方案,但到目前为止都无济于事。
下面是我当前的代码:
$url = $order->get_view_order_url() . '/?add-to-cart=' . $item['product_id'];
$simple_ = $product->is_type('simple');
if ( $simple_ != 'simple') {
$url .= '&variation_id=' . $item['variation_id'];
$attributes = wc_get_product_variation_attributes($item['variation_id']);
foreach( $attributes as $key => $value ){ $url .= '&' . $key . '=' . $value; }
$meta = wc_get_order_item_meta( $item_id );
if ( $meta['Door width'][0] ) { $url .= '&attribute_Door width=' . $meta['Door width'][0]; }
}
<a href="<?php echo $url; ?>"><?php echo __('Order again', 'woocommerce'); ?></a>
我在其他帖子上寻找解决方案和建议,但找不到答案。
不知道有没有人有什么建议
将 &attribute_Door width=value
添加到 url 是行不通的,因为您不能使用空格。相反,您将使用稍后将在购物车中保存和重命名的任何 slug…
您还使用了过时的代码,因为自 Woocommerce 版本 3 以来,订单项现在是新的 class 无法直接访问对象和属性。
所以我重新深入研究了你的代码:
$url = $order->get_view_order_url() . '/?add-to-cart=' . $item->get_product_id();
$variation_id = $item->get_variation_id();
if ( $variation_id > 0 ) {
$url .= '&variation_id=' . $variation_id;
foreach( wc_get_product_variation_attributes( $variation_id ) as $key => $value )
$url .= '&' . $key . '=' . $value;
$meta = wc_get_order_item_meta( $item_id );
if ( ! empty( $meta['Door width'][0] ) )
$url .= '&door_width=' . esc_attr( $meta['Door width'][0] );
}
// Display the button
$button_text = __('Order again', 'woocommerce');
echo '<a href="' . $url . '">' . $button_text . '</a>';
所以对于产品变体,我得到这样的结果 (自定义测试):
?add-to-cart=40&variation_id=41&attribute_pa_color=black&attribute_pa_volume-special=15&attribute_pa_quantity=dozen&door_width=100
现在您需要在添加到购物车时获取 door_width
以将其保存在购物车对象中并将其作为属性显示在购物车和结帐中:
// Store custom data in cart item
add_action( 'woocommerce_add_cart_item_data','save_custom_data_in_cart', 20, 2 );
function save_custom_data_in_cart( $cart_item_data, $product_id ) {
if( isset( $_REQUEST['door_width'] ) )
$cart_item_data['door_width'] = array(
'label' => __('Door with'),
'value' => esc_attr( $_REQUEST['door_width'] ),
);
if( count($cart_item_data['door_width']) > 0 )
$cart_item_data['door_width']['key'] = md5( microtime().rand() );
return $cart_item_data;
}
// Display item custom data in cart and checkout pages
add_filter( 'woocommerce_get_item_data', 'render_custom_data_on_cart_and_checkout', 20, 2 );
function render_custom_data_on_cart_and_checkout( $cart_data, $cart_item ){
$custom_items = array();
if( !empty( $cart_data ) )
$custom_items = $cart_data;
if( isset( $cart_item['door_width'] ) )
$custom_items[] = array(
'name' => $cart_item['door_width']['label'],
'value' => $cart_item['door_width']['value'],
);
return $custom_items;
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。
已经过测试并且有效。它应该也适合你。
我在 woocommerce 的订单视图中为每个商品创建了一个按钮(在订单详细信息-item.php 内),以使客户能够将该商品添加到购物车并购买更多。通过使用建立在 ?add-to-cart 基础上的 href,我可以让它正常工作,既适用于简单产品,也适用于可变产品,并且具有不同的属性。
问题是我无法同时传递我创建的自定义元字段(门宽)。我尝试了几种解决方案,但到目前为止都无济于事。
下面是我当前的代码:
$url = $order->get_view_order_url() . '/?add-to-cart=' . $item['product_id'];
$simple_ = $product->is_type('simple');
if ( $simple_ != 'simple') {
$url .= '&variation_id=' . $item['variation_id'];
$attributes = wc_get_product_variation_attributes($item['variation_id']);
foreach( $attributes as $key => $value ){ $url .= '&' . $key . '=' . $value; }
$meta = wc_get_order_item_meta( $item_id );
if ( $meta['Door width'][0] ) { $url .= '&attribute_Door width=' . $meta['Door width'][0]; }
}
<a href="<?php echo $url; ?>"><?php echo __('Order again', 'woocommerce'); ?></a>
我在其他帖子上寻找解决方案和建议,但找不到答案。
不知道有没有人有什么建议
将 &attribute_Door width=value
添加到 url 是行不通的,因为您不能使用空格。相反,您将使用稍后将在购物车中保存和重命名的任何 slug…
您还使用了过时的代码,因为自 Woocommerce 版本 3 以来,订单项现在是新的 class 无法直接访问对象和属性。
所以我重新深入研究了你的代码:
$url = $order->get_view_order_url() . '/?add-to-cart=' . $item->get_product_id();
$variation_id = $item->get_variation_id();
if ( $variation_id > 0 ) {
$url .= '&variation_id=' . $variation_id;
foreach( wc_get_product_variation_attributes( $variation_id ) as $key => $value )
$url .= '&' . $key . '=' . $value;
$meta = wc_get_order_item_meta( $item_id );
if ( ! empty( $meta['Door width'][0] ) )
$url .= '&door_width=' . esc_attr( $meta['Door width'][0] );
}
// Display the button
$button_text = __('Order again', 'woocommerce');
echo '<a href="' . $url . '">' . $button_text . '</a>';
所以对于产品变体,我得到这样的结果 (自定义测试):?add-to-cart=40&variation_id=41&attribute_pa_color=black&attribute_pa_volume-special=15&attribute_pa_quantity=dozen&door_width=100
现在您需要在添加到购物车时获取 door_width
以将其保存在购物车对象中并将其作为属性显示在购物车和结帐中:
// Store custom data in cart item
add_action( 'woocommerce_add_cart_item_data','save_custom_data_in_cart', 20, 2 );
function save_custom_data_in_cart( $cart_item_data, $product_id ) {
if( isset( $_REQUEST['door_width'] ) )
$cart_item_data['door_width'] = array(
'label' => __('Door with'),
'value' => esc_attr( $_REQUEST['door_width'] ),
);
if( count($cart_item_data['door_width']) > 0 )
$cart_item_data['door_width']['key'] = md5( microtime().rand() );
return $cart_item_data;
}
// Display item custom data in cart and checkout pages
add_filter( 'woocommerce_get_item_data', 'render_custom_data_on_cart_and_checkout', 20, 2 );
function render_custom_data_on_cart_and_checkout( $cart_data, $cart_item ){
$custom_items = array();
if( !empty( $cart_data ) )
$custom_items = $cart_data;
if( isset( $cart_item['door_width'] ) )
$custom_items[] = array(
'name' => $cart_item['door_width']['label'],
'value' => $cart_item['door_width']['value'],
);
return $custom_items;
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。
已经过测试并且有效。它应该也适合你。