Według przepisów handlowych, klient e‑sklepu powinien zostać poinformowany o swoich prawach i potwierdzić nam, że zapoznał się z regulaminem. Z reguły robi to pod koniec składania zamówienia odhaczając checkbox'a. WooCommerce zapewnia nam mechanizm do spełnienia tego obowiązku. Czasem zachodzi potrzeba, by klient oprócz regulaminu potwierdził jeszcze inne warunki. Może chodzić o politykę prywatności, albo że sam, dobrowolnie zrzeka się prawa zwrotu, bo towar jest używany, a on o tym wie i kupuje w ciemno, ale na swoją odpowiedzialność.
Standardowo, z poziomu panelu administracji na ma takiej możliwości, by dodać następne pola wyboru. Można poszukać wtyczki, albo samemu stworzyć kod korzystając z kilku zaczepów. Najbardziej sensownym wydaje się 'woocommerce_checkout_terms_and_conditions', który doda treść do kontenera w którym znajduje się checkbox akceptacji regulaminu. Zaczep jest umieszony nad polem, więc akceptacja regulaminu zawsze będzie na końcu.
Istnieje też możliwość umieszczenie treści nad lub pod w/w kontenerem. Do wyboru są: 'woocommerce_checkout_before_terms_and_conditions' lub 'woocommerce_checkout_after_terms_and_conditions'.
Nowe pole akceptacji warunków
Pole tworzymy za pomocą funkcji 'woocommerce_form_field', specjalnie utworzonej przez twórców WooCommerce.
add_action('woocommerce_checkout_terms_and_conditions', 'igel_woocommerce_checkout_before_terms_and_conditions', 100); function igel_woocommerce_checkout_before_terms_and_conditions() { woocommerce_form_field('privacy_policy', array( 'type' => 'checkbox', 'required' => true, 'label' => _x('I accept the privacy policy', 'woocommerce', 'igelshop-bs5'), 'id' => 'privacy_policy', ), 1); }
Pierwszy parametr to ID pola, drugi, to tablica parametrów, a trzeci, to wartość domyślna. W tablicy trzeba zwrócić uwagę na 'type' i ustawić go na 'checkbox', 'label' czyli opis pola i 'required' czyli określenie, czy ten warunek jest konieczny. Do paremetru 'label' przypisałem wartość funkcji _x(). Pomaga to przy dalszym tłumaczeniu strony. W tym przypadku tłumaczenie jest kontekstowe (drugi parament _x()) i pobierane z szablonu tematu. Równie dobrze można tu przypisać wartość na stałe lub treść określoną w customizerze.
Walidacja pola
Jeżeli pole warunku jest określone jako wymagane, to użytkownik nie może go nie zaznaczyć. Problem w tym, że musi o tym wiedzieć. Rozwiązaniem jest komunikat o błędzie. Musimy się podczepić pod proces obsługi zamówienia. Mamy do tego akcję 'woocommerce_checkout_process'.
add_action('woocommerce_checkout_process', 'igel_checkbox_checkout_validation'); function igel_checkbox_checkout_validation() { $field_id = 'privacy_policy'; if (!isset($_POST[$field_id]) || empty($_POST[$field_id])) wc_add_notice(_x("Acceptance of the privacy policy is required", 'woocommerce', "igelshop-bs5"), "error"); }
Jeżeli pole nie istnieje lub wartość pola jest pusta, to oznacza, że użytkownik nie zaznaczył tej opcji. Wtedy system dodaje notatkę poprzez 'wc_add_notice' z parametrem 'error'. W tym przypadku formularz nie przejdzie dalej, do czasu aż będzie wypełniony bez błędów.
Zapisanie parametrów zamówienia
Jeżeli informacja o tym, jakie zgody wyraził klient, jest nam potrzebna to możemy je zapisać w meta polach. A potem je odczytać na stronie zamówienia w panelu administracji. Zapis realizuje zaczep 'woocommerce_checkout_update_order_meta', a odczytu możemy dokonać dzięki 'woocommerce_admin_order_data_after_billing_address'.
add_action('woocommerce_checkout_update_order_meta', 'igel_woocommerce_checkout_before_terms_and_conditions_save'); function igel_woocommerce_checkout_before_terms_and_conditions_save($order_id) { if ($_POST['privacy_policy']) update_post_meta($order_id, '_privacy_policy', esc_attr($_POST['privacy_policy'])); if ($_POST['terms']) update_post_meta($order_id, '_terms', esc_attr($_POST['terms'])); } // Wyświetlanie statusu zgody w ustawieniach add_action('woocommerce_admin_order_data_after_billing_address', 'igel_woocommerce_checkout_before_terms_and_conditions_admin'); function igel_woocommerce_checkout_before_terms_and_conditions_admin($order) { if (get_post_meta($order->get_id(), '_terms', true) == 'on') { echo '<p><strong>Regulamin: </strong>Zaakceptowany</p>'; } else echo '<p><strong>BRAK AKCEPTACJI REGULAMINU!</p>'; if (get_post_meta($order->get_id(), '_privacy_policy', true) == '1') { echo '<p><strong>Polityka prywatności: </strong>Zaakceptowana</p>'; } else echo '<p><strong>BRAK AKCEPTACJI Polityki prywatności!</p>'; }
System jeżeli wykryje, że pole 'privacy_policy' lub 'terms' istnieje, to przypisze wartość poprzez 'update_post_meta'. Checkbox, który nie jest zaznaczony, po przejściu formularza zwyczajnie nie istnieje w tablicy wartości. Nie musimy zatem sprawdzać jego wartości, a jedynie czy istnieje.
Wartość sprawdzamy dopiero przy odczycie. Inaczej zapisane zostało pole '_terms', które przyjęło wartość 'on', a inaczej '_privacy_policy', które ma wartość '1'. Warto zorientować się, co jest zapisywane do bazy, by potem nie wyświetlać złych komunikatów. Można użyć to tego zwykłego var_dump().
Jeżeli oba pola zostały zaznaczone, to wynik powinien wyglądać podobnie jak na poniższej grafice: