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), a 3 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.

Imię:


Nazwisko:


Adres email:


Nazwa Twojej firmy:


NIP Twojej firmy

REGON Twojej firmy



Adres Twojej firmy

Ulica

Kod pocztowy

Miasto

Wybierz bramkę płatniczą na Twojej stronie