решение найдено
Для вывода html checkbox-a используется хук
add_action( 'woocommerce_review_order_after_cart_contents', array( __CLASS__, 'woo_review_order_after_cart_contents' ) );
/**
* Обработчик хука woocommerce_review_order_before_submit
* Выводит checkbox на форму CheckOut только для разрешенных заказов
*/
public static function woo_review_order_before_submit( ) {
?>
<p class="form-row dorepeate">
<label class="woocommerce-form__label woocommerce-form__label-for-checkbox checkbox">
<input type="checkbox" class="woocommerce-form__input woocommerce-form__input-checkbox input-checkbox" name="dorepeate" <?php checked( self::$dorepeate ); ?> id="dorepeate" />
<span class="woocommerce-dorepeate-checkbox-text">Включить подписку для этого заказа?</span>
</label>
</p>
<?php
}
Для получения значения используем хук
add_filter( 'woocommerce_process_checkout_field_dorepeate', array( __CLASS__, 'woo_process_checkout_field_dorepeate' ) );
/**
* Обработчик хука woocommerce_process_checkout_field_
* для значения checkbox-a 'dorepeate' с формы checkout
* @param $value int 1|0
*/
public static function woo_process_checkout_field_dorepeate( $value ) {
self::$dorepeate = $value;
return $value;
}
Осталось только обвязать логикой сохранения и обработки
Для сохранения в заказе использую хук
// обработчик хука перед сохранением заказа
add_action( 'woocommerce_checkout_create_order', array( __CLASS__, 'woo_checkout_create_order' ) );
/**
* Вызывается Woocommerce перед сохранением заказа
* @param $order WC_Order
*/
public static function woo_checkout_create_order( $order ) {
// сохраняем статус повторяемости заказа
// определяется возможностью повторяемости для самого товара в корзине
// и подтверждением пользователя
$order->update_meta_data( '_is_repeating', self::$dorepeate );
// начальный статус - 'не активен'
$order->update_meta_data( '_repeate_status', 'inactive' );
}