WooCommerce Добавить в корзину, добавить второй продукт из настраиваемого поля выбора - PullRequest
1 голос
/ 08 мая 2020

Что мне нужно

Я хочу сделать простую реализацию надстроек продукта без использования тяжелых подключаемых модулей, которые мне не подходят. Также я хочу иметь возможность отслеживать инвентарь дополнений, который не предлагается ни одним из плагинов. Для большей ясности могу сказать, что основной продукт - это подвеска, а надстройка - это цепочка. Клиент должен иметь возможность выбрать цепочку на странице кулона, когда он или она нажимает кнопку «Добавить в корзину», оба товара должны быть добавлены в корзину.

Итак, я подумал, что могу просто использовать отдельные скрытые продукты как надстройки. Идея состоит в том, чтобы добавить раскрывающийся список с моими дополнительными продуктами, получить выбранное значение через 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"

В чем проблема?

На самом деле проблем много:

  1. Как только я выбираю какое-то значение в раскрывающемся списке, оно сохраняется навсегда. Даже после обновления страницы она все равно добавляется в корзину, даже если я выберу другое значение. Похоже, мне нужно как-то очистить значение POST. Я попытался добавить $_POST = array(); или unset($_POST); в конце функции добавления в корзину, но это не сработало.
  2. Основной товар не добавляется в корзину - когда я нажимаю «добавить в корзину», только добавляю - на товар добавлен в корзину. Я проверил функцию добавления в корзину отдельно с предустановленным идентификатором продукта и обнаружил, что она работает должным образом, и оба продукта добавляются в корзину.

1 Ответ

0 голосов
/ 16 мая 2020

Проблема заключалась в том, что я использовал глобальную переменную $product в foreach l oop. Таким образом, он нарушал логику l oop и использовал глобальный $product вместо желаемого значения массива. Итак, все, что требуется для работы кода, - это изменить код foreach l oop на что-то вроде:

foreach ($products as $single_product) {
        $product_id = $single_product->get_id();
        $options[$product_id] = $single_product->get_name();

В противном случае код работает нормально, хотя я должен сделать несколько замечаний:

  • код будет работать только в том случае, если он будет вставлен с помощью хуков, которые вызываются внутри <form> ... </form>, отправленного нажатием кнопки добавления в корзину, т.е. woocommerce_before_add_to_cart_button, woocommerce_before_add_to_cart_quantity и woocommerce_after_add_to_cart_quantity (вы можете проверить это самостоятельно в шаблоне - https://github.com/woocommerce/woocommerce/blob/4.1.0/templates/single-product/add-to-cart/simple.php) для простого продукта, а также несколько крючков, называемых внутренним вариантом l oop для переменного продукта, который можно найти здесь - https://github.com/woocommerce/woocommerce/blob/4.1.0/templates/single-product/add-to-cart/variable.php
  • при вставке через woocommerce_before_add_to_cart_button поле ввода помещается между текстом на складе продукта и кнопкой добавления в корзину, что не лучшее место, и похоже, что вам нужно либо отредактировать файлы шаблонов, либо использовать JS, чтобы добиться лучшего размещения с текущим W C (4.1) хуки.
  • wc_get_products () работает довольно медленно. В моем тесте он был в 10 раз медленнее, чем аналогичный запрос, сделанный через $wpdb->get_results
    • , лучше вставить product_option_add_to_cart() код пользовательской функции в if (isset($_POST['chain_type'])) { ... }, чтобы предотвратить уведомления PHP в случае отсутствия значения $ _POST почему-то
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...