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

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

AndreyBerezov

Новичок
Здравствуйте, участники форума!
Как можно сделать ограничение, чтобы зарегистрированный пользователь мог всего 1 раз купить товар, а в случае повторного заказа получал бы ошибку с пометкой "товар уже был куплен"?
Спасибо за внимание.
 

reg

Новичок
посмотрите, как сделаны голосовалки с ограничением и проведите аналогию...
 

Grollem

Опытный
Для этого требуются сессии. Вот набросал решение за 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' );
        ?>
Тот же самый код нужно вставить на страницу товара.
 
Последнее редактирование:

Vicos

Форумчанин
А опции "Продаются поштучно" в инвентаризации не достаточно? Или всё же не то получается.
 
Сверху Снизу