Compare commits

..

22 Commits

Author SHA1 Message Date
Remo Zaros
5345b86a25 Increase version number 2026-05-28 09:46:24 +02:00
Remo Zaros
f458be3293 Change shipping fields to billing fields. Change error message to error code in switcht statement. 2026-05-28 09:44:33 +02:00
Remo Zaros
a08d0527b4 remove session_start() that magically reappeared 2026-05-20 09:14:48 +02:00
Remo Zaros
458c216fea Replace | with a - in postcode ranges 2026-05-20 09:06:39 +02:00
Remo Zaros
5828269a70 include admin page, bump version number 2026-05-19 16:57:24 +02:00
Remo Zaros
d4be70eb78 Change postcode_in_range() to work with admin page 2026-05-19 16:56:03 +02:00
Remo Zaros
f1d0414f58 Add page wp admin 2026-05-19 16:54:21 +02:00
Remo Zaros
41f44b1200 Add more postcode ranges 2026-05-18 18:42:26 +02:00
Remo Zaros
7f32a4bb1b Add new styles 2026-05-18 18:41:52 +02:00
Remo Zaros
492289deb1 session changed, css, postcode range 2026-05-18 10:17:45 +02:00
Remo Zaros
318eb8f0c5 Change postcode modal. 2026-05-17 16:44:57 +02:00
Remo Zaros
6fd3f4a13c Add dropdown filter. Add label rename variable products admin 2026-05-14 15:04:55 +02:00
Remo Zaros
4bd6de0916 Make reset postcode button work 2026-05-14 13:53:23 +02:00
Remo Zaros
2f430be382 Add postcode reset to checkout. 2026-05-14 13:12:17 +02:00
Remo Zaros
81d2523d42 work in live now. 2026-05-12 16:24:50 +02:00
Remo Zaros
e17c87f214 css work 2026-05-12 16:24:22 +02:00
Remo Zaros
30b43a9396 fix error messages, made redirects when postcode is unknown 2026-05-11 09:19:50 +02:00
Remo Zaros
782fee8ac4 Add blur to backdrop, set min-height error message 2026-05-11 09:18:25 +02:00
Remo Zaros
ce165ebfc6 Make plugin work 2026-05-10 20:24:08 +02:00
Remo Zaros
23ba4e89ef Change story 2026-05-10 20:23:47 +02:00
Remo Zaros
d060a412cb fill in datat on checkout page 2026-05-09 14:23:30 +02:00
Remo Zaros
305d2c7797 add animation 2026-05-09 14:22:13 +02:00
7 changed files with 773 additions and 64 deletions

167
admin.php Normal file
View File

@@ -0,0 +1,167 @@
<?php
function init_postode_admin()
{
add_action("admin_menu", "local_postcodes_admin_menu", 99);
add_action("admin_head", "local_postcodes_admin_css");
add_action("admin_init", "local_postcodes_register_settings"); // Correct
}
function local_postcodes_admin_menu()
{
add_submenu_page(
"woocommerce", // Parent menu slug
"Lokale Postcodes", // Page title
"Lokale Postcodes", // Menu title
"manage_options", // Capability
"local-postcodes", // Menu slug
"generate_admin_page", // Callback function
"dashicons-buddicons-pm", // Optional icon URL or dashicon
);
}
function local_postcodes_register_settings()
{
register_setting(
"my_plugin_options",
"local_postcodes_values",
"local_postcodes_input_validate",
);
}
function generate_admin_page()
{
?>
<div class="wrap">
<h1><span class="dashicons dashicons-admin-home"></span> Lokale Postcodereeksen</h1>
<?php settings_errors("local_postcodes_error_messages"); ?>
<div class="info">
<p class="info">Vul hier de lokale postcodereeksen in.</p>
<ul>
<li>Het formaat voor een reeks is #### - #### (voorbeeld: 5000 - 5199).</li>
<li>Plaats één reeks op één regel.</li>
<li>Een reeks van 1 is geldig. (voorbeeld: 5000 - 5000)</li>
<li>Om een reeks te verwijderen. Wis de reeks en sla vervolgens de wijzigen op.</li>
</ul>
</div>
<form id="postcodes_form" method="post" action="options.php">
<?php
settings_fields("my_plugin_options");
do_settings_sections("my_plugin_options");
?>
<textarea id="local_postcodes_values" name="local_postcodes_values"><?php echo esc_textarea(
get_option("local_postcodes_values"),
); ?></textarea>
<?php submit_button(); ?>
</form>
</div>
<?php
}
function local_postcodes_admin_css()
{
?>
<style>
h1 .dashicons{
font-size: 25px;
}
.info {
font-size: 1.1rem;
max-width: 60ch;
ul {
list-style: square inside;
}
}
#postcodes_form {
display: flex;
flex-direction: column;
max-width: 60ch;
align-items: flex-end;
font-size: 1.1rem;
#local_postcodes_values{
width: 100% !important;
height: 50vh !important;
font-size: 1.1rem;
font-family: "Consolas", "Monaco", "Courier New", monospace;
}
.submit{
margin-top: .2rem;
}
}
</style>';
<?php
}
function local_postcodes_input_validate($input)
{
$valid_input = "";
$lines = preg_split("/\R/", $input, -1, PREG_SPLIT_NO_EMPTY);
$pattern = '/^\d{4}\s*\-\s*\d{4}$/';
$pc_arr = [];
foreach ($lines as $line) {
$line = trim($line);
if (preg_match($pattern, $line)) {
$parts = explode("-", $line);
$first = (int) $parts[0];
$second = (int) $parts[1];
if ($first <= $second) {
$pc_arr[] = [$first, $second];
} else {
$pc_arr[] = [$second, $first];
}
} else {
add_settings_error(
"local_postcodes_error_messages",
"invalid_postcode_" . md5($line),
'❌️ Ongeldige regel: "' .
esc_html($line) .
'". Gebruik het formaat #### - ####.(bijvoorbeeld: 5000 - 5199)',
"error",
);
}
}
usort($pc_arr, function ($a, $b) {
return $a[0] <=> $b[0];
});
$old_pc_arr_len = count($pc_arr);
$pc_arr = array_map(
"unserialize",
array_unique(array_map("serialize", $pc_arr)),
);
$new_pc_arr_len = count($pc_arr);
if ($new_pc_arr_len < $old_pc_arr_len) {
add_settings_error(
"local_postcodes_error_messages",
"Duplicaten",
// @formatter:off
"⚠️ " .
$old_pc_arr_len -
$new_pc_arr_len .
" " .
($old_pc_arr_len - $new_pc_arr_len > 1
? "duplicaten"
: "duplicaat") .
" verwijderd.",
// @formatter:on
"warning",
);
}
foreach ($pc_arr as $range) {
$valid_input .= $range[0] . " - " . $range[1] . "\n";
}
return $valid_input;
}

View File

@@ -1,10 +1,89 @@
.postcode_modal {
backgrounnd: green;
border-radius: 30px;
box-shadow(10px);
border-radius: 3px;
border: none;
max-width: 65ch;
padding: 2rem;
padding-bottom: 1rem;
opacity: 0;
transition:
opacity 0.3s ease,
display 0.3s allow-discrete;
&[open] {
opacity: 1;
transition-behavior: allow-discrete;
transition:
opacity 0.3s ease,
display 0.3s allow-discrete;
}
h2 {
font-size: 1.1rem;
font-weight: 700;
}
p {
font-size: 1rem;
}
&:not([open]) {
display: none;
}
form {
margin-top: 1rem;
}
input[type="text"] {
padding: 0.3rem;
font-size: 1.2rem;
caret-color: var(--wp--preset--color--vivid-red);
background: hsl(0 1 80);
border: none;
&:focus,
&:valid,
&:invalid,
&:autofill,
&:autofill:focus {
background: hsl(0 1 80) !important;
}
}
button {
font-size: 1.2rem;
font-weight: 700;
color: hsl(233 100 100);
padding: 0.4rem 1rem;
background: var(--wp--preset--color--vivid-red);
border: 1px var(--wp--preset--color--vivid-red) solid;
margin: 0 0 0 0.3rem;
transition: 0.2s all linear;
padding: 0.2em 2.5em;
&:hover {
color: var(--wp--preset--color--vivid-red);
background: hsl(344 98 100);
cursor: pointer;
}
}
.form_fields {
display: flex;
justify-content: space-between;
align-items: center;
div {
display: flex;
gap: 1.5rem;
}
}
&::backdrop {
background-color: hsl(40deg 100 30 /0.5);
backdrop-filter: blur(2px);
background: hsl(0 1 65 / 0.6);
}
.error_message_modal_postcode {
min-height: 1lh;
color: var(--wp--preset--color--vivid-red);
} /* HTML: <div class="loader"></div> */
}

26
assets/reset-postcode.css Normal file
View File

@@ -0,0 +1,26 @@
.postcode-reset {
font-size: var(--wp--preset--font-size--small, 13px);
line-height: 1.3;
margin-top: 11px;
a {
color: var(--wc-red);
cursor: pointer;
&.decline {
color: #111;
}
&:hover {
filter: brightness(160%);
}
}
.bevestiging {
display: none;
&[data-open="true"] {
display: inline;
}
}
}

32
assets/reset-postcode.js Normal file
View File

@@ -0,0 +1,32 @@
document.addEventListener("click", function (event) {
if (event.target.matches(".reset-postcode-show-comfirm")) {
event.preventDefault();
document.querySelector(".bevestiging").dataset.open = true;
}
if (event.target.matches(".accept")) {
event.preventDefault();
console.log("link2 button clicked!");
fetch(ajax_object.ajax_url, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
body: new URLSearchParams({
action: "unset_my_session",
nonce: ajax_object.nonce, // The nonce value
}),
})
.then((response) => response.json())
.then((data) => {
if (data.success) {
window.location.reload();
}
});
}
if (event.target.matches(".decline")) {
event.preventDefault();
document.querySelector(".bevestiging").dataset.open = false;
}
});

View File

@@ -1,11 +1,12 @@
<?php
require_once "session_dialog.php";
require_once plugin_dir_path(__FILE__) . "session_dialog.php";
require_once plugin_dir_path(__FILE__) . "admin.php";
/*
* Plugin Name: Prijs per Postcode
* Description: veschillende prijzen per postdoce. een range posctcodes zijn "lokaal" andere zijn overig
* Plugin Name: prijzen per poscode range
* Description: posctcodes in de 5000-5800 range krijgen een lokaal tarief aangeboden.
* Author: Remo Zaros
* Version: 0.0.1
* Version: 0.9.5
* Text Domeain: prijs-per-postcode
*/
@@ -18,14 +19,206 @@ class PrijsPerPostcode
{
public function __construct()
{
add_action("init", [$this, "init"]);
add_action("init", [$this, "init"], 1);
add_action("rest_api_init", "register_modal_api");
}
public function init()
{
if (session_status() == PHP_SESSION_NONE) {
ob_start();
@session_start();
}
$uri = $_SERVER["REQUEST_URI"];
if_needed_place_postcode_form($uri);
init_postcode_handlers($uri);
init_postode_admin();
add_filter("woocommerce_sale_flash", "__return_null");
//add_action("template_redirect", [$this, "redirect_if_missing_tag"]);
add_action(
"woocommerce_variation_options_pricing",
[$this, "add_local_price_field"],
10,
3,
);
add_action(
"woocommerce_save_product_variation",
[$this, "save_local_price_field"],
10,
2,
);
add_action("woocommerce_before_calculate_totals", [
$this,
"use_local_price_if_local_postcode",
]);
add_filter(
"woocommerce_get_price_html",
[$this, "display_local_price_on_product"],
10,
2,
);
add_action("template_redirect", [
$this,
"controleer_postcode_op_woocommerce_paginas",
]);
add_filter(
"woocommerce_variation_is_visible",
[$this, "filter_variation_by_local_price"],
10,
4,
);
add_filter(
"gettext",
[$this, "change_variation_regular_price_label"],
99,
3,
);
}
public function add_local_price_field($loop, $variation_data, $variation)
{
woocommerce_wp_text_input([
"id" => "_local_price[" . $loop . "]",
"label" =>
__("Lokale Prijs", "woocommerce") .
" (" .
get_woocommerce_currency_symbol() .
")",
"value" => get_post_meta($variation->ID, "_local_price", true),
"data_type" => "price",
"wrapper_class" => "form-row form-row-first", // Left half
]);
}
public function save_local_price_field($variation_id, $i)
{
$local_price = $_POST["_local_price"][$i];
if (isset($local_price)) {
update_post_meta(
$variation_id,
"_local_price",
wc_clean($local_price),
);
}
}
public function use_local_price_if_local_postcode($cart)
{
if (is_admin() && !defined("DOING_AJAX")) {
return;
}
foreach ($cart->get_cart() as $cart_item) {
$product = $cart_item["data"];
$variation_id = $product->is_type("variation")
? $product->get_id()
: 0;
if (
$variation_id &&
isset($_SESSION["postcode_is_local"]) &&
$_SESSION["postcode_is_local"]
) {
$local_price = get_post_meta(
$variation_id,
"_local_price",
true,
);
if ($local_price) {
$product->set_price($local_price);
}
}
}
}
public function controleer_postcode_op_woocommerce_paginas()
{
if (is_admin() || defined("DOING_AJAX")) {
return;
}
if (
(is_product() ||
is_product_category() ||
is_product_tag() ||
is_cart() ||
is_checkout() ||
is_account_page()) &&
!is_shop()
) {
if (!isset($_SESSION["postcode_is_local"])) {
wp_redirect(home_url("/winkel/"));
exit();
}
}
}
public function display_local_price_on_product($price_html, $product)
{
if (
$product->is_type("variation") &&
isset($_SESSION["postcode_is_local"]) &&
$_SESSION["postcode_is_local"] === true
) {
$local_price = get_post_meta(
$product->get_id(),
"_local_price",
true,
);
if ($local_price !== "") {
return wc_price($local_price);
}
}
return $price_html;
}
function filter_variation_by_local_price(
$visible,
$variation_id,
$parent_id,
$variation,
) {
// Ensure $variation is a valid object
if (!$variation instanceof WC_Product_Variation) {
$variation = wc_get_product($variation_id);
}
if (!$variation) {
return false;
}
$is_local = isset($_SESSION["postcode_is_local"])
? $_SESSION["postcode_is_local"]
: false;
$price = $is_local
? $variation->get_meta("_local_price", true)
: $variation->get_regular_price();
if (empty($price) || floatval($price) == 0) {
return false;
}
return $visible;
}
public function change_variation_regular_price_label(
$translated_text,
$text,
$domain,
) {
if (
"woocommerce" === $domain &&
is_admin() &&
isset($_REQUEST["action"]) &&
"woocommerce_load_variations" === $_REQUEST["action"]
) {
if ($translated_text === "Reguliere prijs (%s)") {
$translated_text = "Prijs overige regios (%s)";
}
}
return $translated_text;
}
}

View File

@@ -1,3 +1,7 @@
# Prijs per postcode
# Goedkoop Tilburg
Laat een modal zien op de /winkel pag. De modal vraagt om postcode en huisnummer. Na validatie worden vier sessievarablen gemaakt postcode, huisnummer, straatnaam, islokaal
Deze plugin laat verschillende producten zien in Woocommerce naar aanleiding van de opgegeven postcode.
Een postcode in de 5000/5800 range laat producten zien met de tag "lokaal". Als een postcode buiten deze range ligt laat Woocommerce producten zien met de tag "algemeen". Een product moet de tag "lokaal" of "algemeen" hebben om in de winkel te verschijnen.
Bij het opgeven van de postcode en huisnummer wordt de straatnaam en woonplaats opgezocht. Deze informatie wordt ingevuld tijdens het checkout process.

View File

@@ -1,16 +1,22 @@
<?php
session_start();
function if_needed_place_postcode_form($uri)
function init_postcode_handlers($uri)
{
if (strpos($uri, "/shop") !== false || strpos($uri, "/winkel") !== false) {
render_dialog_html();
if (strpos($uri, "/winkel/") !== false) {
add_action("wp_enqueue_scripts", "modal_styles");
add_action("wp_footer", "send_postcode_data");
if (!has_postcode()) {
if (!is_admin()) {
WC()->cart->empty_cart();
}
add_action("wp_footer", "show_modal");
render_dialog_html();
}
}
add_action("wp_ajax_unset_my_session", "handle_unset_session_fetch");
add_action("wp_ajax_nopriv_unset_my_session", "handle_unset_session_fetch");
add_action("wp_footer", "modify_checkout_with_js");
add_action("wp_enqueue_scripts", "load_assets_reset_postcode_on_checkout");
}
function modal_styles()
@@ -24,8 +30,7 @@ function modal_styles()
function show_modal()
{
?>
<h1>sdfsdfsdfsdfsdfsdfsdf</h1>
<script>
<script id="postcode_modal">
const postcodeModal = document.querySelector("#postcode_modal");
postcodeModal.showModal();
</script>
@@ -37,20 +42,24 @@ function send_postcode_data()
?>
<script type="module">
const postcodeModal = document.querySelector("#postcode_modal");
const submitBtn = document.querySelector("#postcode_modal_form");
const modalForm = document.querySelector("#postcode_modal_form");
submitBtn.addEventListener('submit', async (e) => {
modalForm.addEventListener('submit', async (e) => {
e.preventDefault();
const formData = new FormData(e.target);
const data = Object.fromEntries(formData.entries());
const json = JSON.stringify(data);
try {
const resp = await fetch('<? echo get_rest_url(null, "postcode-modal/v1/submit"); ?>', {
const resp = await fetch('<?php echo get_rest_url(
null,
"postcode-modal/v1/submit",
); ?>', {
method: 'POST',
credentials: 'same-origin',
headers: {
'Content-Type': 'application/json',
'X-WP-Nonce': '<? echo wp_create_nonce("wp_rest"); ?>'
'X-WP-Nonce': '<?php echo wp_create_nonce("wp_rest"); ?>'
},
body: json
});
@@ -62,11 +71,25 @@ function send_postcode_data()
console.log("Data returnd", data);
if (data.status === "error"){
const err = data.code;
let errmsg
switch (err) {
case "HUISNUMMER_NOT_FOUND":
errmsg = "Adres niet gevonden.";
break;
case "HUISNUMMER_AMBIGUOUS":
errmsg = "Huisnummertovoeging mist.";
break;
default:
errmsg = "Gegevens niet correct.";
}
document.querySelector("#error_message_modal_postcode").innerHTML = errmsg;
}
if (data.status === "success"){
postcodeModal.close();
//location.reload();
}
}catch(err){
console.error("Fetch Failed:", err);
@@ -82,22 +105,38 @@ function render_dialog_html()
?>
<dialog id="postcode_modal" class="postcode_modal" closedby="none">
<h2>Vul je postcode en huisnummer in.</h2>
<form id="postcode_modal_form" method="post" action="">
<input type="text" name="postcode"
<p>Onze prijzen zijn afhankelijk van de regio. Vul daarom de postcode en het huisnummer in om de exacte prijzen te bekijken.</p>
<form id="postcode_modal_form" method="post" action="" novalidate>
<div class="form_fields">
<div>
<!-- Dutch Postcode Field -->
<input
type="text"
name="postcode"
title="Voer een geldige Nederlandse postcode in (bijv. 1234AB of 1234 AB)."
pattern="[1-9][0-9]{3} ?(?!sa|sd|ss)[a-zA-Z]{2}"
placeholder= "1010 AA"
placeholder="5010 AA"
size="10"
required
autocomplete="off"
/>
<input type="text" name="huisnummer"
pattern="\d+([-\s]?[a-zA-Z]+)?"
<!-- House Number Field -->
<input
type="text"
name="huisnummer"
title="Voer een geldig huisnummer in (bijv. 1, 1A, 1-A, 1a)."
placeholder= "12a"
pattern="\d+([- ]?[a-zA-Z]+)?"
placeholder="10"
size="5"
required
autocomplete="off"
/>
<button id="postcode_modal_submit" type="submit">verzend</button>
<form>
</div>
<button id="postcode_modal_submit" type="submit">OK</button>
</div>
</form>
<div class="error_message_modal_postcode" id="error_message_modal_postcode" aria-live="polite"></div>
</dialog>
<?php
}
@@ -121,7 +160,7 @@ function handle_postcode_modal($data)
"status" => "error",
"message" => "postcode",
];
echo $resp;
echo json_encode($resp);
exit();
}
@@ -130,16 +169,33 @@ function handle_postcode_modal($data)
"status" => "error",
"message" => "huisnummer",
];
echo $resp;
echo json_encode($resp);
exit();
}
$result = getStraatnaam($params["postcode"], $params["huisnummer"]);
if (isset($result["error"])) {
$resp = [
"status" => "error",
"message" => $result["error"],
"apirequest" => "openpostcode.nl",
];
echo json_encode($resp);
exit();
}
$_SESSION["postcode"] = $params["postcode"];
$_SESSION["huisnummer"] = $params["huisnummer"];
$_SESSION["straatnaam"] = $result["straatnaam"];
$_SESSION["woonplaats"] = $result["woonplaats"];
$_SESSION["postcode_is_local"] = postcode_in_range($params["postcode"]);
$resp = [
"status" => "success",
"message" => "all good",
"straatnaam" => $result["straatnaam"],
"lokaal_trarief" => postcode_in_range($params["postcode"]),
];
} else {
$resp = [
@@ -175,31 +231,183 @@ function verify_huisnummer($huisnummer)
return true;
}
function check_data_at_openpostcode($oostcode, $huisnummer)
function getStraatnaam($postcode, $huisnummer)
{
$urk =
"https//openpostcode.nl/api/v2/address?postcode=" .
$postcode .
"&" .
$huisnummer;
$options = [
"http" => [
"method" => "GET",
"header" => "Accept: application/json\r\n",
],
"ssl" => [
"verify_peer" => true,
"verify_peer_name" => true,
],
];
$url =
"https://openpostcode.nl/api/v2/address?postcode=" .
urlencode($postcode) .
"&huisnummer=" .
urlencode($huisnummer);
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_USERAGENT, "PHP/OpenPostcodeClient");
$response = curl_exec($ch);
if (curl_error($ch)) {
curl_close($ch);
return ["error" => "cURL error: " . curl_error($ch)];
}
curl_close($ch);
if ($response === false) {
// Handle error
} else {
$data = json_decode($response, true);
if (isset($data["error"])) {
return [
"error" => $data["error"]["message"],
"code" => $data["error"]["code"],
];
}
return data;
return [
"straatnaam" => $data["results"][0]["straat"],
"woonplaats" => $data["results"][0]["woonplaats"],
];
}
function postcode_in_range($postcode)
{
$vals = get_option("local_postcodes_values", "");
$rows = preg_split("/\R/", $vals, -1, PREG_SPLIT_NO_EMPTY);
$pc_arr = [];
foreach ($rows as $row) {
$row = trim($row);
$postcode_range = explode("-", $row);
$pc_arr[] = [(int) $postcode_range[0], (int) $postcode_range[1]];
}
$cleanPostcode = strtoupper(preg_replace("/\s+/", "", $postcode));
if (!preg_match('/^\d{4}[A-Z]{2}$/', $cleanPostcode)) {
return false;
}
$numberPart = (int) substr($cleanPostcode, 0, 4);
foreach ($pc_arr as $pc_to_check) {
if ($numberPart >= $pc_to_check[0] && $numberPart <= $pc_to_check[1]) {
return true;
}
}
return false;
}
function modify_checkout_with_js()
{
if (
!is_checkout() ||
(is_wc_endpoint_url() && !is_wc_endpoint_url("order-received"))
) {
return;
}
$woonplaats = $_SESSION["woonplaats"];
$postcode = $formatted_postcode = preg_replace(
"/(\d+)([A-Z]+)/",
'$1 $2',
strtoupper($_SESSION["postcode"]),
);
$address =
$_SESSION["straatnaam"] . " " . strtoupper($_SESSION["huisnummer"]);
// Output the JavaScript
?>
<script type="text/javascript" id="fill_address_fields">
jQuery(document).ready(function($) {
fillCheckoutFields();
$(document.body).on('updated_checkout', fillCheckoutFields);
});
function fillCheckoutFields() {
if (typeof wp !== 'undefined' && wp.data && wp.data.dispatch) {
const store = 'wc/store/cart';
wp.data.dispatch(store).setBillingAddress({
first_name: '',
last_name: '',
address_1: '<?php echo esc_js($address); ?>',
address_2: '',
city: '<?php echo esc_js($woonplaats); ?>',
state: '',
postcode: '<?php echo esc_js($postcode); ?>',
country: 'NL',
phone: '',
email: ''
});
//make fields READONLY and ppstcode reset.
setTimeout(() => {
// make prefilled fiields readonly.
$('#billing-postcode, #billing-city, #billing-address_1')
.prop('readonly', true)
.css('background', '#f9f9f9');
// create postcode reset button
const div = document.createElement("div");
const script = document.createElement('script');
div.setAttribute("class", "postcode-reset")
div.innerHTML = `
<a href="#" class="reset-postcode-show-comfirm" >Reset postcode.</a>
<span class="bevestiging"> Weet je het zeker?
<a href="#" class="accept">ja</a>/<a href="#" class="decline">nee</a>
(Deze handeling leegt de winkelwagen.)
</span> `;
div.style.width = "100%";
document.querySelector(".wc-block-components-address-form__city").after(div);
}, 500);
jQuery(document.body).trigger('update_checkout');
} else {
console.error('WooCommerce Blocks API is niet beschikbaar');
}
}
</script>
<?php
}
function load_assets_reset_postcode_on_checkout()
{
if (is_checkout() && !is_wc_endpoint_url()) {
wp_enqueue_style(
"reset-postcode-style",
plugin_dir_url(__FILE__) . "assets/reset-postcode.css",
[],
"1.0.0",
);
wp_enqueue_script(
"reset-postcode-script",
plugin_dir_url(__FILE__) . "assets/reset-postcode.js",
[],
"1.0.0",
true,
);
// Pass PHP variables to JavaScript
wp_localize_script("reset-postcode-script", "ajax_object", [
"ajax_url" => admin_url("admin-ajax.php"),
"nonce" => wp_create_nonce("reset_postcode_nonce"), // Creates a secure token
]);
}
}
function handle_unset_session_fetch()
{
// Verify the nonce for security
if (!wp_verify_nonce($_POST["nonce"], "reset_postcode_nonce")) {
wp_die("Security check failed.");
}
// Unset the specific session variable
if (isset($_SESSION["postcode"])) {
$_SESSION = [];
}
// Send a JSON response
wp_send_json_success();
}