Главная/WordPress Fullstack/Блупринты/WooCommerce/Разработка накопительной бонусной системы и списания баллов в чекауте (Cart Fee API)
К карточкам раздела «WooCommerce»
WooCommerce(ТЗ 43 из 54)
ТЗ: Разработка накопительной бонусной системы и списания баллов в чекауте (Cart Fee API)
WooCommerce5 шагов • +25 XP

ТЗ: Разработка накопительной бонусной системы и списания баллов в чекауте (Cart Fee API)

Реализация внутренней валюты лояльности: начисление % от успешных покупок в баланс пользователя, списание баллов в чекауте в качестве скидки через $cart->add_fee() с лимитом не более 30% суммы и возвратом баллов при отмене.

~12 ч работыУровень: MiddleWC Cart Fee API ($cart->add_fee)User Meta Balance Storagewoocommerce_calculate_totalsOrder Status HooksAJAX Points Redemption UIAtomicity & Race Condition Guards
+5 XP за шаг
Выполнено 0 из 5 шагов (0%)
Трудозатраты~12 рабочих часов
Фриланс вилка~$540 – $900 (€480 – €840)
Оценка веб-студии~$1,140 – $1,920 (€1080 – €1800)

ТЗ заказчика (исходный бриф):

«Хотим запустить бонусную систему для постоянных клиентов: 5% от каждой успешной покупки начисляется баллами (1 балл = 1 рубль). На чекауте покупатель видит свой баланс и может ввести, сколько баллов списать в счет заказа (но не более 30% от чека). При отмене заказа баллы должны автоматически возвращаться обратно на баланс!»
Ключевые требования:
  • •Хранение бонусного баланса пользователя в User Meta с историей транзакций (начисления, списания)
  • •Интерактивный блок в чекауте: отображение баланса пользователя и поле ввода суммы баллов для списания
  • •Применение скидки через $cart->add_fee() с отрицательным значением и динамическим пересчетом налогов
  • •Ограничение: списание не более 30% от промежуточной суммы корзины (Subtotal)
  • •Списание баллов только при успешном создании заказа и автоматический возврат баллов при статусах «Отменен» или «Возвращен»
Ограничения проекта:
  • •Защита от состояния гонки (Race Condition): блокировка баланса во время оформления заказа
  • •Не начислять бонусы на часть заказа, оплаченную баллами
  • •Запрет списания баллов для гостей (неавторизованных пользователей)
Критерии приёмки (KPI):
  • 100% точность баланса без дублирующих списаний при повторных кликах
  • Корректный учет скидки в чеках и фискальных отчетах онлайн-касс
  • Мгновенный AJAX-пересчет итога корзины при вводе баллов

Конфигурация блупринта под условия проекта

Выберите архитектуру и стек — шаги роадмапа, структура файлов и примеры кода переключатся автоматически:

Пошаговое практическое руководство по ТЗ

Подробный разбор архитектуры, код реализации и советы эксперта по каждому этапу:

1
Этап 1 из 5

Архитектура хранения баланса и логирование транзакций

~45 минСредний

Практическое руководство:

Создайте класс AgenticLab_Points_Manager. Реализуйте методы get_balance, add_points и debit_points. Записывайте каждую операцию в лог транзакций для аудита.

План и контрольные точки реализации:
1Создать методы get_user_points и update_user_points
2Сохранять историю операций (дата, заказ, сумма, тип)
3Отображать текущий баланс в личном кабинете WooCommerce
Важные технические нюансы и подводные камни:

Операции изменения баланса должны быть атомарными для предотвращения race condition.

Совет эксперта (Best Practice):

История последних 50 транзакций: Хранение array_slice($log, -50) защищает таблицу wp_usermeta от неконтролируемого разрастания при частых покупках. (Важно: Для масштабных систем со 100 000+ покупателей выносите логирование транзакций в отдельную кастомную таблицу БД.)

Ожидаемый артефакт этапа:

Надежный сервис управления балансом с полной историей начислений и списаний.

PHP
<?php
declare(strict_types=1);

class AgenticLab_Points_Manager {
    private const META_KEY = '_agenticlab_loyalty_points';

    public static function get_balance(int $user_id): int {
        return (int) get_user_meta($user_id, self::META_KEY, true);
    }

    public static function add_points(int $user_id, int $points, int $order_id = 0, string $reason = ''): bool {
        if ($points <= 0) return false;

        $current = self::get_balance($user_id);
        $new_balance = $current + $points;
        update_user_meta($user_id, self::META_KEY, $new_balance);

        self::log_transaction($user_id, $points, 'credit', $order_id, $reason);
        return true;
    }

    public static function debit_points(int $user_id, int $points, int $order_id = 0, string $reason = ''): bool {
        $current = self::get_balance($user_id);
        if ($points <= 0 || $current < $points) return false;

        $new_balance = $current - $points;
        update_user_meta($user_id, self::META_KEY, $new_balance);

        self::log_transaction($user_id, -$points, 'debit', $order_id, $reason);
        return true;
    }

    private static function log_transaction(int $user_id, int $points, string $type, int $order_id, string $reason): void {
        $log = get_user_meta($user_id, '_agenticlab_points_history', true) ?: [];
        $log[] = [
            'timestamp' => time(),
            'points'    => $points,
            'type'      => $type,
            'order_id'  => $order_id,
            'reason'    => $reason,
        ];
        update_user_meta($user_id, '_agenticlab_points_history', array_slice($log, -50)); // Храним последние 50 записей
    }
}
2
Этап 2 из 5

Интерфейс списания баллов в чекауте

~40 минСредний
3
Этап 3 из 5

Применение скидки через $cart->add_fee() с лимитом 30%

~45 минСредний
4
Этап 4 из 5

Списание баллов при создании заказа и начисление кешбэка 5% при оплате

~50 минСложный
5
Этап 5 из 5

Проверка сценариев и защита от повторных списаний

~30 минЛегкий

Типичные грабли на этом ТЗ

2 антипаттерна

Инструменты экосистемы Fullstack AI Lab для этого ТЗ

Интеграция