Интеграция WooCommerce для разработчиков
Шаблоны
За отображение части магазина отвечают два шаблона. Скопируйте нужный шаблон в тему, чтобы изменить его. Сначала проверяется дочерняя тема. Если копии нет, используется шаблон плагина.
| Шаблон | Путь в теме | Назначение |
|---|---|---|
picker.php | yourtheme/baza-booking-calendar/woocommerce/picker.php | Выбор даты и времени на странице товара с бронированием |
cart-summary.php | yourtheme/baza-booking-calendar/woocommerce/cart-summary.php | Данные бронирования под позицией в классической корзине и оформлении заказа |
Каждый шаблон получает данные в $args. Они описаны в начале соответствующего файла. Путь также можно изменить через apply_filters( 'baza_bc_woocommerce_template', $file, $name, $args ).
Структура выбора даты и времени
Скрипт modules/woocommerce/assets/woo-picker.js находит нужные элементы по атрибуту data-bbc-role. Если обязательного элемента нет, выполнение останавливается с ошибкой в консоли.
Обязательные роли: prev, next, title, grid, slots, extras, total, book, note.
Теги, классы, порядок и дополнительную разметку можно менять. Созданные скриптом строки имеют фиксированные классы для стилизации: bbc-woo-picker__day с .is-picked, __slot с .is-picked, __time, __price, __extra, __extras-toggle, __qty, __step и __veil. Последний класс используется для слоя загрузки blockUI blockOverlay.
Для .bbc-woo-picker доступны CSS-переменные --bbc-woo-accent, --bbc-woo-on-accent, --bbc-woo-radius, --bbc-woo-ink и --bbc-woo-gap. Первые четыре скрипт получает от кнопки Add to cart активной темы.
Блочная корзина
Блоки Cart и Checkout, а также мини-корзина преобразуют данные позиции в обычный текст. Поэтому шаблон итогов там не используется: для каждого дня и каждой дополнительной услуги создаётся отдельная строка. Изменить строки можно фильтром baza_bc_woocommerce_item_rows.
Фильтры и действия
| Хук | Назначение |
|---|---|
baza_bc_woocommerce_template (filter) | Путь к шаблону: ( $file, $name, $args ). |
baza_bc_woocommerce_summary_data (filter) | Данные для итогов в корзине: ( array $data { days, extras }, array $input ). |
baza_bc_woocommerce_item_rows (filter) | Текстовые строки позиции в блочной корзине, мини-корзине и заказе: ( array $rows { key, value }, array $input ). |
baza_bc_woocommerce_product_dates (action) | Вызывается на странице товара с бронированием в месте вывода календаря: ( WC_Product $product ). Здесь можно вывести собственный интерфейс, предварительно убрав стандартный через remove_action( ..., [ 'BazaBookingCalendar\BBC_Woo_Cart', 'render_calendar' ] ). |
baza_bc_woocommerce_offline_methods (filter) | Идентификаторы способов оплаты позже. По умолчанию: bacs, cheque, cod. |
baza_bc_woocommerce_paid_on_completion (filter) | Идентификаторы способов, для которых оплата считается полученной только при статусе completed. По умолчанию: cod. |
baza_bc_woocommerce_send_shop_emails (filter) | Верните true, чтобы отправлять клиентам собственные письма магазина для заказов с бронированием. По умолчанию выключено. |
baza_bc_price_journal_recorded (action) | Вызывается после записи изменения цены: ( $booking_id, array $entry ). |
baza_bc_internal_booking_meta_prefixes (filter) | Префиксы метаданных, скрытых в панели бронирования, письмах и событиях календаря. По умолчанию: bbc_, woo_. Ключи с начальным _ скрыты всегда. |
Как интеграция работает в коде
- Страница товара.
BBC_Woo_Cart::render_calendar()подключает скрипт выбора и выводитviews/picker.php. Интерфейс обращается к публичным действиямadmin-ajax.php. Все они только читают данные, кроме последнего, который добавляет позицию в корзину.
Запросы интерфейса выбора
bbc_woo_daysсproductиmonth=YYYY-MM: дни со свободным временем.bbc_woo_slotsсproductиdate: свободные часы дня с ценами.bbc_woo_extrasсproduct: дополнительные услуги.bbc_woo_quoteсproduct,slots[]иextras[id]=qty: общая сумма.bbc_woo_addс теми же данными: добавление в корзину.
- Расчёт цены. Цену всегда определяет сервер.
BBC_Booking_Create::create( $input, [ 'quote' => true ] )выполняет проверки и запускаетBBC_Booking_Calculate, но не создаёт бронирование. Из браузера принимаются только строки слотов, идентификаторы дополнительных услуг и их количество. - Позиция корзины.
WC()->cart->add_to_cart()получает данныеbbc_bookingв виде{ input, total }. Хукwoocommerce_before_calculate_totalsустанавливает окончательную цену без налога магазина.woocommerce_check_cart_itemsповторяет проверку в корзине и при оформлении. Занятое время вызывает ошибку, а изменившаяся цена обновляет позицию. - Заказ.
woocommerce_checkout_create_orderсохраняет формы в метаданных заказа_bbc_inputs. Действияwoocommerce_checkout_order_processedиwoocommerce_store_api_checkout_order_processedзапускаютBBC_Woo_Cart::create_bookings(). Для каждой позиции создаётся одно бронирование со статусом pending, удерживающее время. Идентификаторы сохраняются в_bbc_booking_idsзаказа иwoo_order_idбронирования. - Синхронизация статуса.
BBC_WooCommerce::order_status_changed()переводит оплаченное бронирование в booked, оставляет неоплаченные офлайн-способы в pending, отклоняет pending для cancelled или failed и отклоняет booked после refunded. Если бронирование отклонено в плагине и в заказе не осталось активных бронирований, неоплаченный заказ отменяется.
Метаданные бронирования, которые записывает магазин
Префикс woo_ скрывает эти поля в панели: woo_order_id, woo_payment_method, woo_payment_title, woo_payment_state со значениями paid, waiting, cancelled, failed или refunded, woo_payment_offline и woo_waiting_payment. Купон WooCommerce также записывает promo_sale и coupon_code.
Журнал цен
BBC_Price_Journal::record( $booking_id, $kind, $reason, $before, $after, $by = [] ) записывает изменение в метаданные bbc_price_journal и журнал активности. Массив $by имеет формат [ 'type' => admin|client|shop|system, 'user' => id, 'label' => text ]. Если его не передать, используется текущий пользователь или system. Для чтения используйте BBC_Price_Journal::entries( $id ).
Лицензия и совместимость
- Ключ возможности
woocommerceдоступен в каждом плане и открывает платёжный шлюз, тип товара, корзину и импорт. Синхронизация статусов уже созданных заказов от него не зависит. - Объявлена совместимость с HPOS и блоками Cart и Checkout.
- Импорт из WooCommerce Bookings выполняет
BBC_Woo_Importв WooCommerce > Import bookings. Повторный импорт безопасен благодаря метаданным_bbc_imported_from_wc.
