Введите часть искомого слова, названия или фразы...
↑ ↓
  1. Новые темы озаглавленные с маленькой буквы - удаляются без предупреждения!
  2. Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!

Как сделать, чтобы пользователь мог только 1 раз купить данный товар?

Тема в разделе "Вопросы новичков", создана пользователем AndreyBerezov, 23 янв 2015.

  1. AndreyBerezov

    AndreyBerezov

    Сообщения:
    4
    Симпатии:
    1
    Баллы:
    3
    Здравствуйте, участники форума!
    Как можно сделать ограничение, чтобы зарегистрированный пользователь мог всего 1 раз купить товар, а в случае повторного заказа получал бы ошибку с пометкой "товар уже был куплен"?
    Спасибо за внимание.
     
  2. reg

    reg

    Сообщения:
    23
    Симпатии:
    0
    Баллы:
    1
    посмотрите, как сделаны голосовалки с ограничением и проведите аналогию...
     
  3. Grollem

    Grollem

    Сообщения:
    141
    Симпатии:
    47
    Баллы:
    28
    Для этого требуются сессии. Вот набросал решение за 20 минут.
    в файл functions.php вставляем следующий код:
    Код:
    function order_completed( $order_id ) {
    ob_start(); // очищаем буфер чтобы правильно записать заголовки
    session_set_cookie_params(30000000000); // устанавливаем время жизни на год [возможно на серваке стоит ограничение на жизнь сесии]
    session_start();
    global $product;
    $order = new WC_Order( $order_id ); // получаем заказ
    $items = $order->get_items(); // получаем купленные товары
    /*
    echo "<pre>";
    var_dump($_SESSION); // посмотрим что записалось в сессию (для этого обновляем страницу ))
    echo "</pre>";
    */
    $count = 0;
    foreach ($items as $item) {
        $order_item = $item["item_meta"]["_product_id"][0];
        if($count >= 1) { // если товаров больше одного разделяем запятой
            $order_item = ','.$item["item_meta"]["_product_id"][0]; 
        }
    $mess .= $order_item;
    $count++; 
    }
    $_SESSION['test'] = $mess; // записываем полученное в сессию.
    }
    add_action( 'woocommerce_thankyou', 'order_completed' );
    Дальше переопределяем или открываем код файла content-product.php из \plugins\woocommerce\templates
    находим в нем строки отвечающий за вывод товара
    добавляем там следующий код:
    -- фрагмент кода
    Код:
    /* проверяем куплен ли товар */
    <?php
    ob_start();
    session_start();
    $buy_products = $_SESSION['test']; // получаем данные из сессии
    $buy_prod_arr = explode(',', $buy_products); // разбиваем из по запятой и записываем в массив
    ?>
    
    <li <?php post_class( $classes ); ?>>
    <?php
    /* Наш сниппет */
            if(in_array($product->id, $buy_prod_arr)) { // проверяем совпадает ли id текущего товара с каким нибудь значением массива если да то:
                echo "Товар куплен";
            } else {
                echo " товар не куплен"
            }
    /* Конец сниппета */
    ?>
        <?php do_action( 'woocommerce_before_shop_loop_item' );    ?>
    
        <a href="<?php the_permalink(); ?>">
    
            <?php
                /**
                 * woocommerce_before_shop_loop_item_title hook
                 *
                 * @hooked woocommerce_show_product_loop_sale_flash - 10
                 * @hooked woocommerce_template_loop_product_thumbnail - 10
                 */
                do_action( 'woocommerce_before_shop_loop_item_title' );
            ?>
    Тот же самый код нужно вставить на страницу товара.
     
    Последнее редактирование: 23 янв 2015
    • Нравится Нравится x 2
  4. Vicos

    Vicos

    Сообщения:
    34
    Симпатии:
    5
    Баллы:
    8
    А опции "Продаются поштучно" в инвентаризации не достаточно? Или всё же не то получается.