Что мне нужно
Я хочу сделать простую реализацию надстроек продукта без использования тяжелых подключаемых модулей, которые мне не подходят. Также я хочу иметь возможность отслеживать инвентарь дополнений, который не предлагается ни одним из плагинов. Для большей ясности могу сказать, что основной продукт - это подвеска, а надстройка - это цепочка. Клиент должен иметь возможность выбрать цепочку на странице кулона, когда он или она нажимает кнопку «Добавить в корзину», оба товара должны быть добавлены в корзину.
Итак, я подумал, что могу просто использовать отдельные скрытые продукты как надстройки. Идея состоит в том, чтобы добавить раскрывающийся список с моими дополнительными продуктами, получить выбранное значение через POST и добавить его в корзину вместе с основным продуктом. Пока все хорошо.
Что я сделал
Вот мой код:
add_action( 'woocommerce_before_add_to_cart_button', 'chain_selection_field' );
function chain_selection_field() {
global $product;
$domain = 'woocommerce';
$args = array(
'sku' => 'SOME_TEXT',
'stock_status' => 'instock',
);
$products = wc_get_products( $args );
foreach ($products as $product) {
$product_id = $product->get_id();
$options[$product_id] = $product->get_name();
}
woocommerce_form_field('chain_type', array(
'type' => 'select',
'label' => __('Chain type selection', $domain),
'required' => true,
'options' => $options,
),'');
}
add_action('woocommerce_add_to_cart', 'product_option_add_to_cart');
function product_option_add_to_cart() {
$product_id = $_POST['chain_type'];
$found = false;
if ( sizeof( WC()->cart->get_cart() ) > 0 ) {
foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
$_product = $values['data'];
if ( $_product->id == $product_id )
$found = true;
}
if ( ! $found )
WC()->cart->add_to_cart( $product_id );
} else {
WC()->cart->add_to_cart( $product_id );
}
}
Реализация добавления в корзину взята отсюда - Как добавить фильтр или ловушку для "woocommerce_add_to_cart"
В чем проблема?
На самом деле проблем много:
- Как только я выбираю какое-то значение в раскрывающемся списке, оно сохраняется навсегда. Даже после обновления страницы она все равно добавляется в корзину, даже если я выберу другое значение. Похоже, мне нужно как-то очистить значение POST. Я попытался добавить
$_POST = array();
или unset($_POST);
в конце функции добавления в корзину, но это не сработало. - Основной товар не добавляется в корзину - когда я нажимаю «добавить в корзину», только добавляю - на товар добавлен в корзину. Я проверил функцию добавления в корзину отдельно с предустановленным идентификатором продукта и обнаружил, что она работает должным образом, и оба продукта добавляются в корзину.