Ten kod pozwala na dodanie pola wyboru daty dla każdego wariantu produktu w WooCommerce. Umożliwia to wyłączenie wariantu na określoną datę, dzięki czemu wariant jest niewidoczny i niedostępny dla klientów na stronie produktu.
Kod zawiera trzy główne części:
add_variation_date_field – Ta funkcja dodaje pole wyboru daty do każdego wariantu produktu w panelu administracyjnym WooCommerce. Wartości z tego pola są zapisywane jako metadane wariantu.
save_variation_date_field – Ta funkcja zapisuje wartość wybranej daty do metadanych wariantu, gdy wariant jest zapisywany w panelu administracyjnym.
hide_variation_based_on_date – Ta funkcja sprawdza, czy data zapisana dla wariantu jest równa bieżącej dacie. Jeśli tak, wariant staje się niewidoczny i niedostępny dla klientów na stronie produktu. W przeciwnym razie wariant pozostaje widoczny i dostępny.
Kod jest zaimplementowany jako zestaw funkcji, które są dołączane do odpowiednich hooków w WordPress i WooCommerce. Dzięki temu można go łatwo dodać do motywu lub wtyczki, takiej jak Code Snippets, bez konieczności modyfikowania plików rdzenia WooCommerce.
function add_variation_date_field($loop, $variation_data, $variation) { woocommerce_wp_text_input(array( 'id' => 'exclude_date[' . $variation->ID . ']', 'label' => __('W tym dniu wyłącz wariant', 'woocommerce'), 'value' => get_post_meta($variation->ID, '_exclude_date', true), 'desc_tip' => true, 'description' => __('Wybierz datę, kiedy wariant produktu będzie niedostępny.', 'woocommerce'), 'type' => 'date', )); } add_action('woocommerce_product_after_variable_attributes', 'add_variation_date_field', 10, 3); function save_variation_date_field($post_id) { if (isset($_POST['exclude_date'][$post_id])) { update_post_meta($post_id, '_exclude_date', sanitize_text_field($_POST['exclude_date'][$post_id])); } } add_action('woocommerce_save_product_variation', 'save_variation_date_field', 10, 1); function hide_variation_based_on_date($visible, $variation_id, $parent_id) { $exclude_date = get_post_meta($variation_id, '_exclude_date', true); if (!empty($exclude_date)) { $today = new DateTime(); $today->setTime(0, 0, 0); $exclude_date_obj = DateTime::createFromFormat('Y-m-d', $exclude_date); $exclude_date_obj->setTime(0, 0, 0); if ($exclude_date_obj->format('Y-m-d') == $today->format('Y-m-d')) { return false; } } return $visible; } add_filter('woocommerce_variation_is_visible', 'hide_variation_based_on_date', 10, 3);
add_variation_date_field – Ta funkcja dodaje pole wyboru daty do każdego wariantu produktu w panelu administracyjnym WooCommerce.
Wywołuje woocommerce_wp_text_input z odpowiednimi argumentami, aby utworzyć pole input z typem 'date’ o nazwie ’exclude_date’.
$loop, $variation_data, $variation to parametry przekazywane przez hook woocommerce_product_after_variable_attributes.
id to identyfikator unikatowy dla pola input, który łączy wartość z odpowiednim wariantem produktu.
label to etykieta pola, która będzie wyświetlana obok niego.
value to aktualna wartość pola (jeśli wcześniej zapisano datę dla tego wariantu).
desc_tip i description to opis wyświetlany jako podpowiedź dla pola.
save_variation_date_field – Ta funkcja zapisuje wartość wybranej daty do metadanych wariantu, gdy wariant jest zapisywany w panelu administracyjnym.
$post_id to parametr przekazywany przez hook woocommerce_save_product_variation, który reprezentuje ID wariantu produktu.
Jeśli wartość pola ’exclude_date’ istnieje dla danego wariantu, funkcja używa update_post_meta do zaktualizowania wartości metadanych o kluczu _exclude_date dla tego wariantu.
Wartość pola jest sanitizowana za pomocą sanitize_text_field przed zapisaniem.
hide_variation_based_on_date – Ta funkcja sprawdza, czy data zapisana dla wariantu jest równa bieżącej dacie. Jeśli tak, wariant staje się niewidoczny i niedostępny dla klientów na stronie produktu. W przeciwnym razie wariant pozostaje widoczny i dostępny.
$visible, $variation_id, $parent_id to parametry przekazywane przez hook woocommerce_variation_is_visible.
Funkcja pobiera wartość metadanych _exclude_date dla danego wariantu za pomocą get_post_meta.
Jeśli wartość istnieje (czyli data wyłączenia wariantu została ustawiona), funkcja tworzy dwa obiekty DateTime: $today dla bieżącej daty i $exclude_date_obj dla daty z metadanych.
Godziny, minuty i sekundy są zerowane dla obu obiektów DateTime, aby porównać tylko daty, a nie czas.
Jeśli obie daty są równe, funkcja zwraca false, co powoduje ukrycie wariantu na stronie produktu.
Jeśli daty nie są równe, funkcja zwraca pierwotną wartość $visible.
Hooki:
Hooki są mechanizmem, który pozwala na wprowadzanie zmian w działaniu WordPress, WooCommerce oraz innych wtyczek bez konieczności edycji ich kodu źródłowego. W kodzie, który omawiamy, używamy trzech różnych hooków:
woocommerce_product_after_variable_attributes – Hook ten jest wywoływany po wyrenderowaniu pól atrybutów wariantów produktów w panelu administracyjnym. Dodajemy do niego funkcję add_variation_date_field, która zostanie wywołana dla każdego wariantu produktu. Dzięki temu dodajemy pole wyboru daty do panelu administracyjnego.
add_action('woocommerce_product_after_variable_attributes', 'add_variation_date_field', 10, 3);
10
oznacza priorytet wykonania (im niższa wartość, tym wcześniej zostanie wywołana funkcja), a3
oznacza liczbę argumentów przekazywanych do funkcji.woocommerce_save_product_variation
– Hook ten jest wywoływany podczas zapisywania wariantów produktu. Dodajemy do niego funkcjęsave_variation_date_field
, która zapisuje wartość wybranej daty dla każdego wariantu jako metadaną.
add_action('woocommerce_save_product_variation', 'save_variation_date_field', 10, 1);
Priorytet wykonania wynosi 10, a liczba argumentów przekazywanych do funkcji to 1.
woocommerce_variation_is_visible – Hook ten pozwala na kontrolowanie, czy wariant produktu jest widoczny na stronie produktu. Dodajemy do niego funkcję hide_variation_based_on_date, która sprawdza, czy zapisana data dla wariantu jest równa bieżącej dacie. Jeśli tak, funkcja zwraca false, co powoduje ukrycie wariantu na stronie produktu.
add_filter('woocommerce_variation_is_visible', 'hide_variation_based_on_date', 10, 3);
Używamy add_filter, ponieważ ten hook jest filtrem, który pozwala na modyfikowanie wartości. Priorytet wykonania wynosi 10, a liczba argumentów przekazywanych do funkcji to 3.