I try do something similar to ‘product addons’, but manually. I would have few simple products, that have to be as companions. Their ids will be the same. I want to make them as checkboxes, with photo, name and price. If checkbox is checked – that product has to add to cart together with main on the product page. That’s a code, already tweaked by gpt
// Function to display checkboxes for additional products
function display_additional_products_checkboxes() {
$additional_products_ids = array(220, 222, 224, 226); // Replace with your product IDs
echo '<div class="additional-products">';
echo '<h3>Additional Products</h3>';
foreach ($additional_products_ids as $product_id) {
$additional_product = wc_get_product($product_id);
if ($additional_product) {
$product_name = $additional_product->get_name();
$product_price = $additional_product->get_price_html();
$product_id_sanitized = sanitize_title($additional_product->get_slug());
echo '<div class="additional-product">';
echo '<label for="additional_product_' . $product_id_sanitized . '">';
echo '<input type="checkbox" name="additional_products[]" id="additional_product_' . $product_id_sanitized . '" value="' . $product_id . '">';
echo $product_name . ' - ' . $product_price;
echo '</label>';
echo '</div>';
}
}
echo '</div>';
}
add_action('woocommerce_before_add_to_cart_button', 'display_additional_products_checkboxes');
// Function to process additional products checkboxes
function add_additional_products_to_cart($cart_item_data, $product_id, $variation_id) {
if (isset($_POST['additional_products']) && !empty($_POST['additional_products'])) {
$additional_products = wc_clean(wp_unslash($_POST['additional_products']));
$cart_item_data['additional_products'] = $additional_products;
}
return $cart_item_data;
}
add_filter('woocommerce_add_cart_item_data', 'add_additional_products_to_cart', 10, 3);
// Function to display additional products in cart
function display_additional_products_in_cart($item_data, $cart_item) {
if (isset($cart_item['additional_products']) && !empty($cart_item['additional_products'])) {
$additional_products = $cart_item['additional_products'];
$additional_products_names = array();
foreach ($additional_products as $product_id) {
$product = wc_get_product($product_id);
if ($product) {
$additional_products_names[] = $product->get_name();
} else {
error_log("Failed to get additional product with ID: $product_id");
}
}
$item_data[] = array(
'key' => __('Additional Products', 'woocommerce'),
'value' => implode(', ', $additional_products_names),
);
}
return $item_data;
}
add_filter('woocommerce_get_item_data', 'display_additional_products_in_cart', 10, 2);
// Function to add additional products to order
function add_additional_products_to_order($item, $cart_item_key, $values, $order) {
if (isset($values['additional_products']) && !empty($values['additional_products'])) {
$additional_products = $values['additional_products'];
foreach ($additional_products as $product_id) {
$product = wc_get_product($product_id);
if ($product) {
$item->add_meta_data(__('Additional Product', 'woocommerce'), $product->get_name());
} else {
error_log("Failed to get additional product with ID: $product_id");
}
}
}
}
add_action('woocommerce_checkout_create_order_line_item', 'add_additional_products_to_order', 10, 4);
// Function to add additional products as separate line items in the cart
function add_additional_products_as_separate_items($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
if (isset($cart_item_data['additional_products']) && !empty($cart_item_data['additional_products'])) {
if (!isset(WC()->session->additional_products_added)) {
WC()->session->set('additional_products_added', array());
}
$processed = WC()->session->get('additional_products_added');
$additional_products = $cart_item_data['additional_products'];
foreach ($additional_products as $additional_product_id) {
if (!in_array($additional_product_id, $processed)) {
$additional_product = wc_get_product($additional_product_id);
if ($additional_product) {
error_log("Adding additional product to cart: " . $additional_product->get_name());
WC()->cart->add_to_cart($additional_product_id);
$processed[] = $additional_product_id; // Mark this additional product as processed
} else {
error_log("Failed to add additional product with ID: $additional_product_id");
}
}
}
WC()->session->set('additional_products_added', $processed);
}
}
add_action('woocommerce_add_to_cart', 'add_additional_products_as_separate_items', 10, 6);
// Clear session data after checkout
function clear_additional_products_session() {
if (isset(WC()->session->additional_products_added)) {
WC()->session->__unset('additional_products_added');
}
}
add_action('woocommerce_checkout_order_processed', 'clear_additional_products_session');
But I still have the same issue, and gpt can’t help – I have it again and again.
Log shows something like
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
[25-Jun-2024 04:21:09 UTC] Adding additional product to cart: Present One
Like endless loop. Gpt tried to help with session moment, but it didn’t help. Maybe some human would know better where I’m wrong?