I have file custom.php where do I add products with custom data (field_wrap_name and field_wrap_img) WC()->cart->add_to_cart
custom.php
foreach($result as $res) {
if( isset($_POST['bookwrap_type_name']) && ! empty($_POST['bookwrap_type_name']) )
$custom_data['custom_data']['field_wrap_name'] = $res[1];
if( isset($_POST['bookwrap_type_img']) && ! empty($_POST['bookwrap_type_img']) )
$custom_data['custom_data']['field_wrap_img'] = $res[2];
WC()->cart->add_to_cart($res[0], '1', '0', array(), $custom_data );
}
and show it in the cart and order function.php
function display_custom_data_in_cart($item_data, $cart_item)
{
if (isset($cart_item['custom_data'])) {
if (isset($cart_item['custom_data']['field_wrap_name']) && !empty($cart_item['custom_data']['field_wrap_name'])) {
$item_data[] = array(
'key' => __('Type of wrapper', 'theme-child'),
'value' => $cart_item['custom_data']['field_wrap_name'],
);
}
if (isset($cart_item['custom_data']['field_wrap_img']) && !empty($cart_item['custom_data']['field_wrap_img'])) {
$item_data[] = array(
'key' => __('An example of a cover', 'theme-child'),
'value' => '<img src="' . $cart_item['custom_data']['field_wrap_img'] . '" class="bwrap-cart-img">',
);
}
}
return $item_data;
}
add_filter('woocommerce_get_item_data', 'display_custom_data_in_cart', 10, 2);
Its works then i add new product, how add this $custom_data then products already in cart in custom.php?
if( in_array( $res[0], array_column( WC()->cart->get_cart(), 'product_id' ) ) ) {
// product in cart
???
} else {
WC()->cart->add_to_cart($res[0], '1', '0', array(), $custom_data );
}
If the product is already in cart, and if the "custom_data" is the same, you can use WC_Cart
set_quantity()
method like:
if( in_array( $res[0], array_column( WC()->cart->get_cart(), 'product_id' ) ) ) {
// Loop through cart items to get the cart item key
foreach ( WC()->cart->get_cart() as $item_key => $item ) {
if ( $item['product_id'] == $res[0] ) {
WC()->cart->set_quantity( $item_key, $item['quantity']+1 );
break;
}
}
} else {
WC()->cart->add_to_cart($res[0], '1', '0', array(), $custom_data );
}
Or you can use WC_Cart
remove_cart_item()
method, to remove the existing product from cart and add the new product to cart increasing its quantity:
if( in_array( $res[0], array_column( WC()->cart->get_cart(), 'product_id' ) ) ) {
// product in cart
foreach ( WC()->cart->get_cart() as $item_key => $item ) {
if ( $item['product_id'] == $res[0] ) {
$quantity = $item['quantity'];
WC()->cart->remove_cart_item( $item_key );
WC()->cart->add_to_cart($res[0], $quantity+1, '0', array(), $custom_data );
break;
}
}
} else {
WC()->cart->add_to_cart($res[0], '1', '0', array(), $custom_data );
}
Both ways should work.