Een aantal jaren geleden werd ik gebeld met wel een heel bijzondere vraag. De beller had een webshop en zijn webbouwer kon hem niet helpen met een voor hem wel heel principieel probleem. De webwinkelier wilde namelijk niet, dat mensen op zondag hij hem konden bestellen.
En hoewel zijn webbouwer een pop up had ingebouwd, die alleen op zondagen werd getoond en de mensen vertelden, dat ze op zondag niet konden bestellen, bleven de bestellingen op zondag binnenkomen.
Dit probleem heeft mij in eerste instanties heel wat hoofdbrekens gekost. Wat is een goede manier om dit op te lossen. Maar na wat geëxperimenteer ben ik er uiteindelijk uitgekomen.
Aanvullend was er ook de wens om ook op Christelijke feestdagen (maar dan ook weer niet alle) de webshop te sluiten. Om de code nog enigszins overzichtelijk te houden, heb ik dat onderdeel weggelaten, maar na het bekijken van de code, zal ik in het kort uitleggen, hoe ik dat laatste onderdeel heb opgelost.
Maar laten we eerst eens met de basiscode beginnen
<?php
add_action('init','wxp_woocommerce_not_on_sunday');
function wxp_woocommerce_not_on_sunday() {
if (wxp_check_sunday_and_holiday()) {
// Disable Cart, Checkout, Add Cart
remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 );
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
remove_action( 'woocommerce_proceed_to_checkout', 'woocommerce_button_proceed_to_checkout', 20 );
remove_action( 'woocommerce_checkout_order_review', 'woocommerce_checkout_payment', 20 );
add_action( 'woocommerce_before_main_content', 'wxp_shop_closed', 5 );
add_action( 'woocommerce_before_cart', 'wxp_shop_closed', 5 );
add_action( 'woocommerce_before_checkout_form', 'wxp_shop_closed', 5 );
}
}
function wxp_shop_closed() {
// Melding op de shop page, cart en checkout.
wc_print_notice('Op zon- en feestdagen is onze winkel gesloten. Ook online. Wij hopen op uw begrip','error');
}
function wxp_check_sunday_and_holiday() {
//Kijk of het een zondag is
if (date('w')==0) return true;
return false;
}
Een hele lap tekst dus. Maar laten we eens met de laatste functie beginnen. De functie wxp_check_sunday_and_holiday. Jaren later realiseerde ik mij, dat de naam van de functie niet klopt, omdat het natuurlijk ‘sunday or holiday’ zou moeten zijn, maar een kniesoor die daar op let. (En ja, ik ben een kniesoor).
In deze vorm geeft de functie de waarde ’true’ terug wanneer de datum van vandaag een zondag is. Wat de functie date(‘w’) geeft een numerieke waarde voor de dag van de week terug, waarbij zondag 0 is en zaterdag 6.
Omdat Pasen en Pinksteren per definitie op zondag vallen, hoeven we dat niet te controleren. Het aardige van de Christelijke feestdagen is, dat deze -behalve Kerst- allemaal vanuit Pasen zijn berekend. Om het even mathematisch weer te geven :
Goede Vrijdag | Pasen – 2 |
Paasmaandag | Pasen + 1 |
Hemelvaart | Pasen + 40 |
Pinksteren | Pasen + 50, is altijd een zondag |
Tweede Pinksterdag | Pasen + 51 |
Dan hoeven we alleen Kerst (25 december, altijd!) en Tweede Kerstdag (26 december, altijd!) te checken.
En om te kijken op welke datum Pasen valt in een bepaald jaar… daar heeft PHP een ingebouwde functie voor. Uiteindelijk is het een flinke lap tekst, wanneer je de hele functie uitschrijft, maar de complexiteit valt mee. De complete functionaliteit voor het checken van feestdagen vind je in een andere code snippet.
Bij het initiëren van WordPress wordt de functie ‘wxp_woocommerce_not_on_sunday’ aangeroepen. Die kijkt dus of het een zon- of feestdag is, en als dat zo is wordt de code uitgevoerd, is dat niet zo, dan wordt de hele code in de functie genegeerd.
De eerste handeling is dat alle ‘Add to Cart’ en ‘Proceed to Checkout’ knoppen worden verwijderd. Je kan dus wel kijken, maar niet kopen.
Mocht je naar de winkelpagina, winkelwagen of de checkout pagina gaan, dan krijg je als foutmelding de wxp_shop_closed melding.
Kortom, je kan gewoon door de winkel wandelen, maar niets kopen.