Compare commits

..

1 Commits

Author SHA1 Message Date
18bf4e3ada Update read.md 2026-05-15 11:54:31 +02:00
5 changed files with 68 additions and 268 deletions

167
admin.php
View File

@@ -1,167 +0,0 @@
<?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,67 +1,47 @@
.postcode_modal { .postcode_modal {
border-radius: 3px; border-radius: 20px;
box-shadow(10px);
border: none; border: none;
max-width: 65ch; max-width: 80ch;
box-shadow: 0 0 20pc black;
padding: 2rem; padding: 2rem;
padding-bottom: 1rem;
opacity: 0; opacity: 0;
transition: transition: opacity 0.3s ease, display 0.3s allow-discrete;
opacity 0.3s ease,
display 0.3s allow-discrete;
&[open] { &[open] {
opacity: 1; opacity: 1;
transition-behavior: allow-discrete; transition-behavior: allow-discrete;
transition: transition: opacity 0.3s ease, display 0.3s allow-discrete;
opacity 0.3s ease,
display 0.3s allow-discrete;
}
h2 {
font-size: 1.1rem;
font-weight: 700;
}
p {
font-size: 1rem;
} }
&:not([open]) { &:not([open]) {
display: none; display: none;
} }
form { h2 {
margin-top: 1rem; font-size: 1.5rem;
margin: .6rem;
} }
input[type="text"] { input[type="text"] {
padding: 0.3rem; padding: .3rem;
font-size: 1.2rem; font-size: 1.4rem;
caret-color: var(--wp--preset--color--vivid-red); caret-color: hsl(344 98 40);
background: hsl(0 1 80);
border: none;
&:focus,
&:valid,
&:invalid,
&:autofill,
&:autofill:focus {
background: hsl(0 1 80) !important;
}
} }
button { button {
font-size: 1.2rem; border: none;
font-weight: 700; font-size: 1.4rem;
color: hsl(233 100 100); color: hsl(233 100 100);
padding: 0.4rem 1rem; padding: .4rem 1rem;
background: var(--wp--preset--color--vivid-red); border-radius: 5px;
border: 1px var(--wp--preset--color--vivid-red) solid; background: hsl(344 98 40);
margin: 0 0 0 0.3rem; border: 1px hsl(344 98 40) solid;
transition: 0.2s all linear; margin: 0 0 0 .3rem;
padding: 0.2em 2.5em; transition: .2s all linear;
&:hover{ &:hover{
color: var(--wp--preset--color--vivid-red); color: hsl(344 98 40 );
background: hsl(344 98 100); background: hsl(344 98 100);
cursor: pointer; cursor: pointer;
} }
@@ -71,19 +51,20 @@
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
div {
&>{
display: flex; display: flex;
gap: 1.5rem;
} }
} }
&::backdrop { &::backdrop {
backdrop-filter: blur(2px); backdrop-filter: blur(1px);
background: hsl(0 1 65 / 0.6); background-color: hsl(40deg 100 0 /0.4);
background: radial-gradient(circle,rgba(33, 33, 33, 0.68) 0%, rgba(15, 15, 15, 0.8) 23%, rgba(0, 0, 0, 0.87) 100%);
} }
.error_message_modal_postcode { .error_message_modal_postcode {
min-height: 1lh; min-height: 1lh;
color: var(--wp--preset--color--vivid-red); color: hsl(344 98 40 );
}/* HTML: <div class="loader"></div> */ }/* HTML: <div class="loader"></div> */
} }

View File

@@ -1,12 +1,12 @@
<?php <?php
require_once plugin_dir_path(__FILE__) . "session_dialog.php"; session_start();
require_once plugin_dir_path(__FILE__) . "admin.php"; require_once "session_dialog.php";
/* /*
* Plugin Name: prijzen per poscode range * Plugin Name: prijzen per poscode range
* Description: posctcodes in de 5000-5800 range krijgen een lokaal tarief aangeboden. * Description: posctcodes in de 5000-5800 range krijgen een lokaal tarief aangeboden.
* Author: Remo Zaros * Author: Remo Zaros
* Version: 0.9.5 * Version: 0.9.1
* Text Domeain: prijs-per-postcode * Text Domeain: prijs-per-postcode
*/ */
@@ -19,20 +19,14 @@ class PrijsPerPostcode
{ {
public function __construct() public function __construct()
{ {
add_action("init", [$this, "init"], 1); add_action("init", [$this, "init"]);
add_action("rest_api_init", "register_modal_api"); add_action("rest_api_init", "register_modal_api");
} }
public function init() public function init()
{ {
if (session_status() == PHP_SESSION_NONE) {
ob_start();
@session_start();
}
$uri = $_SERVER["REQUEST_URI"]; $uri = $_SERVER["REQUEST_URI"];
init_postcode_handlers($uri); init_postcode_handlers($uri);
init_postode_admin();
add_filter("woocommerce_sale_flash", "__return_null"); add_filter("woocommerce_sale_flash", "__return_null");
//add_action("template_redirect", [$this, "redirect_if_missing_tag"]); //add_action("template_redirect", [$this, "redirect_if_missing_tag"]);

View File

@@ -5,3 +5,8 @@ Deze plugin laat verschillende producten zien in Woocommerce naar aanleiding van
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. 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. Bij het opgeven van de postcode en huisnummer wordt de straatnaam en woonplaats opgezocht. Deze informatie wordt ingevuld tijdens het checkout process.
- [ ] code warning
- [ ] shop filter
- [ ] range postcodes
= [ ] pop up stylen

View File

@@ -1,5 +1,6 @@
<?php <?php
session_start();
function init_postcode_handlers($uri) function init_postcode_handlers($uri)
{ {
if (strpos($uri, "/winkel/") !== false) { if (strpos($uri, "/winkel/") !== false) {
@@ -71,14 +72,14 @@ function send_postcode_data()
console.log("Data returnd", data); console.log("Data returnd", data);
if (data.status === "error"){ if (data.status === "error"){
const err = data.code; const err = data.message;
let errmsg let errmsg
switch (err) { switch (err) {
case "HUISNUMMER_NOT_FOUND": case "Huisnummer not found":
errmsg = "Adres niet gevonden."; errmsg = "Adres niet gevonden.";
break; break;
case "HUISNUMMER_AMBIGUOUS": case "Multiple addresses match this huisnummer; add huisletter and/or huisnummertoevoeging":
errmsg = "Huisnummertovoeging mist."; errmsg = "Huisnummertovoeging mist.";
break; break;
default: default:
@@ -105,38 +106,30 @@ function render_dialog_html()
?> ?>
<dialog id="postcode_modal" class="postcode_modal" closedby="none"> <dialog id="postcode_modal" class="postcode_modal" closedby="none">
<h2>Vul je postcode en huisnummer in.</h2> <h2>Vul je postcode en huisnummer in.</h2>
<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="" novalidation>
<form id="postcode_modal_form" method="post" action="" novalidate>
<div class="form_fields"> <div class="form_fields">
<div> <div>
<!-- Dutch Postcode Field --> <input type="text" name="postcode"
<input
type="text"
name="postcode"
title="Voer een geldige Nederlandse postcode in (bijv. 1234AB of 1234 AB)." 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}" pattern="[1-9][0-9]{3} ?(?!sa|sd|ss)[a-zA-Z]{2}"
placeholder="5010 AA" placeholder= "1010 AA"
size="10" size="10"
required required
autocomplete="off"
/> />
<!-- House Number Field --> <input type="text" name="huisnummer"
<input pattern="/\d+([-\\s]?[a-zA-Z]+)?/"
type="text"
name="huisnummer"
title="Voer een geldig huisnummer in (bijv. 1, 1A, 1-A, 1a)." title="Voer een geldig huisnummer in (bijv. 1, 1A, 1-A, 1a)."
pattern="\d+([- ]?[a-zA-Z]+)?" placeholder= "12A"
placeholder="10"
size="5" size="5"
required required
autocomplete="off"
/> />
</div> </div>
<button id="postcode_modal_submit" type="submit">OK</button> <button id="postcode_modal_submit" type="submit">verzend</button>
</div> </div>
</form> </form>
<div class="error_message_modal_postcode" id="error_message_modal_postcode" aria-live="polite"></div> <div class="error_message_modal_postcode" id="error_message_modal_postcode" aria-live="polite"></div>
<div class="loader_modal"></div>
</dialog> </dialog>
<?php <?php
} }
@@ -189,13 +182,21 @@ function handle_postcode_modal($data)
$_SESSION["straatnaam"] = $result["straatnaam"]; $_SESSION["straatnaam"] = $result["straatnaam"];
$_SESSION["woonplaats"] = $result["woonplaats"]; $_SESSION["woonplaats"] = $result["woonplaats"];
$_SESSION["postcode_is_local"] = postcode_in_range($params["postcode"]); $_SESSION["postcode_is_local"] = postcode_in_range(
$params["postcode"],
5000,
5800,
);
$resp = [ $resp = [
"status" => "success", "status" => "success",
"message" => "all good", "message" => "all good",
"straatnaam" => $result["straatnaam"], "straatnaam" => $result["straatnaam"],
"lokaal_trarief" => postcode_in_range($params["postcode"]), "lokaal_trarief" => postcode_in_range(
$params["postcode"],
5000,
5800,
),
]; ];
} else { } else {
$resp = [ $resp = [
@@ -269,17 +270,8 @@ function getStraatnaam($postcode, $huisnummer)
]; ];
} }
function postcode_in_range($postcode) function postcode_in_range($postcode, $start, $end)
{ {
$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)); $cleanPostcode = strtoupper(preg_replace("/\s+/", "", $postcode));
if (!preg_match('/^\d{4}[A-Z]{2}$/', $cleanPostcode)) { if (!preg_match('/^\d{4}[A-Z]{2}$/', $cleanPostcode)) {
@@ -288,12 +280,7 @@ function postcode_in_range($postcode)
$numberPart = (int) substr($cleanPostcode, 0, 4); $numberPart = (int) substr($cleanPostcode, 0, 4);
foreach ($pc_arr as $pc_to_check) { return $numberPart >= $start && $numberPart <= $end;
if ($numberPart >= $pc_to_check[0] && $numberPart <= $pc_to_check[1]) {
return true;
}
}
return false;
} }
function modify_checkout_with_js() function modify_checkout_with_js()
@@ -325,7 +312,7 @@ function modify_checkout_with_js()
if (typeof wp !== 'undefined' && wp.data && wp.data.dispatch) { if (typeof wp !== 'undefined' && wp.data && wp.data.dispatch) {
const store = 'wc/store/cart'; const store = 'wc/store/cart';
wp.data.dispatch(store).setBillingAddress({ wp.data.dispatch(store).setShippingAddress({
first_name: '', first_name: '',
last_name: '', last_name: '',
address_1: '<?php echo esc_js($address); ?>', address_1: '<?php echo esc_js($address); ?>',
@@ -341,7 +328,7 @@ function modify_checkout_with_js()
//make fields READONLY and ppstcode reset. //make fields READONLY and ppstcode reset.
setTimeout(() => { setTimeout(() => {
// make prefilled fiields readonly. // make prefilled fiields readonly.
$('#billing-postcode, #billing-city, #billing-address_1') $('#shipping-postcode, #shipping-city, #shipping-address_1')
.prop('readonly', true) .prop('readonly', true)
.css('background', '#f9f9f9'); .css('background', '#f9f9f9');