Compare commits

..

6 Commits

Author SHA1 Message Date
Remo Zaros
ef3abb9514 clean up prijs-per-postcode 2026-07-01 11:19:33 +02:00
Remo Zaros
03f7e9857d move register_modal_api to main file 2026-07-01 11:18:44 +02:00
Remo Zaros
bdeae51bdb rewrite pppr_is_local 2026-07-01 11:17:12 +02:00
Remo Zaros
2df645be97 remove trim()s. was used twice 2026-06-30 10:46:08 +02:00
Remo Zaros
4173e32489 Change instruction text 2026-06-30 10:43:40 +02:00
Remo Zaros
a43d6213b5 Remove the PHP class 2026-06-29 18:53:19 +02:00
4 changed files with 215 additions and 166 deletions

View File

@@ -40,7 +40,7 @@ function generate_admin_page()
<ul> <ul>
<li>Het formaat voor een reeks is #### - #### (voorbeeld: 5000 - 5199).</li> <li>Het formaat voor een reeks is #### - #### (voorbeeld: 5000 - 5199).</li>
<li>Plaats één reeks op één regel.</li> <li>Plaats één reeks op één regel.</li>
<li>Een reeks van 1 is geldig. (voorbeeld: 5000 - 5000)</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> <li>Om een reeks te verwijderen. Wis de reeks en sla vervolgens de wijzigen op.</li>
</ul> </ul>
</div> </div>

View File

@@ -162,6 +162,14 @@ function get_PPPR_data() {
} }
function pppr_is_local() { function pppr_is_local() {
$first_char = $_COOKIE['PPPR'][0]; // Check if the cookie exists and is not empty
return $first_char === '1'; if (isset($_COOKIE['PPPR']) && !empty($_COOKIE['PPPR'])) {
// Ensure it's treated as a string before accessing the first character
$cookie_value = (string) $_COOKIE['PPPR'];
$first_char = $cookie_value[0] ?? '';
return $first_char === '1';
}
// Return false if cookie is missing or empty
return false;
} }

View File

@@ -1,10 +1,10 @@
<?php <?php
/* /*
* Plugin Name: Prijzen per poscodeereeks. * Plugin Name: Prijs per poscodeereeks.
* Description: Producten worden gefiltered aan de hand van opgegegeven postcodereeksen.Gebruikers met een postcode die in een opgegegeven postcodereeks valt zal een lokale prijs zien. Waar elke gebruiker met een postcode die buiten eem opgegeven reeks valt zal de reguliere prijs te zien krijgen. * Description: Producten worden gefiltered aan de hand van opgegegeven postcodereeksen.Gebruikers met een postcode die in een opgegegeven postcodereeks valt zal een lokale prijs zien. Waar elke gebruiker met een postcode die buiten eem opgegeven reeks valt zal de reguliere prijs te zien krijgen.
* Author: Remo Zaros * Author: Remo Zaros
* Version: 0.9.82 * Version: 0.9.090
* Text Domeain: prijs-per-postcode * Text Domeain: prijs-per-postcode
*/ */
@@ -12,11 +12,15 @@ require_once plugin_dir_path(__FILE__) . "session_dialog.php";
require_once plugin_dir_path(__FILE__) . "admin.php"; require_once plugin_dir_path(__FILE__) . "admin.php";
require_once plugin_dir_path(__FILE__) . "pppr_cookie.php"; require_once plugin_dir_path(__FILE__) . "pppr_cookie.php";
if (!defined("ABSPATH")) { if (!defined("ABSPATH")) {
echo "big bag of potatoes"; echo "big bag of potatoes";
exit(); exit();
} }
/*
* Create salt
*/
register_activation_hook( __FILE__, 'create_pppr_salt' ); register_activation_hook( __FILE__, 'create_pppr_salt' );
if ( ! defined( 'WP_PPPR_SALT' ) ) { if ( ! defined( 'WP_PPPR_SALT' ) ) {
$salt_file = __DIR__ . '/wp-pppr-salt.php'; $salt_file = __DIR__ . '/wp-pppr-salt.php';
@@ -28,66 +32,39 @@ if ( ! defined( 'WP_PPPR_SALT' ) ) {
} }
class PrijsPerPostcode add_filter("woocommerce_sale_flash", "__return_null");
{ add_filter('woocommerce_show_variation_price', '__return_true');
public function __construct()
{
add_action("init", [$this, "init"], 1);
add_action("rest_api_init", "register_modal_api");
}
public function init()
{
$uri = $_SERVER["REQUEST_URI"]; /*
init_postcode_handlers($uri); * Init the plugin
init_postode_admin(); */
add_action("init", function() {
$uri = $_SERVER["REQUEST_URI"];
init_postcode_handlers($uri);
// set the admin page
init_postode_admin();
}, 1
);
add_filter("woocommerce_sale_flash", "__return_null");
add_filter('woocommerce_show_variation_price', '__return_true');
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", * Set endpoint (postcode-modal/v1/submit) for the modal form.
[$this, "display_local_price_on_product"], */
10, add_action("rest_api_init", function () {
2, register_rest_route( 'postcode-modal/v1', '/submit', array(
); 'methods' => 'POST',
add_action("template_redirect", [ 'callback' => 'handle_postcode_modal',
$this, 'permission_callback' => '__return_true',
"check_postcode_on_every_woocommerce_page", ) );
]); });
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) /*
* Add local orice field to variation product.
*/
add_action("woocommerce_variation_options_pricing",
function($loop, $variation_data, $variation)
{ {
woocommerce_wp_text_input([ woocommerce_wp_text_input([
"id" => "_local_price[" . $loop . "]", "id" => "_local_price[" . $loop . "]",
@@ -100,9 +77,15 @@ class PrijsPerPostcode
"data_type" => "price", "data_type" => "price",
"wrapper_class" => "form-row form-row-first", // Left half "wrapper_class" => "form-row form-row-first", // Left half
]); ]);
} }, 10, 3,
);
public function save_local_price_field($variation_id, $i)
/*
* Save the local price on product save in the admin
*/
add_action("woocommerce_save_product_variation",
function ($variation_id, $i)
{ {
$local_price = $_POST["_local_price"][$i]; $local_price = $_POST["_local_price"][$i];
if (isset($local_price)) { if (isset($local_price)) {
@@ -112,84 +95,36 @@ class PrijsPerPostcode
wc_clean($local_price), wc_clean($local_price),
); );
} }
} }, 10, 2,
);
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($_COOKIE["PPPR"]) &&
pppr_is_local()
) {
$local_price = get_post_meta(
$variation_id,
"_local_price",
true,
);
if ($local_price) {
$product->set_price($local_price);
}
}
}
}
public function check_postcode_on_every_woocommerce_page()
{
if (is_admin() || defined("DOING_AJAX")) {
return;
}
/*
* Replace "Reguliere prijs" with "Prijs overige regios"
* in variation prodict admin
*/
add_filter( "gettext", function( $translated_text, $text, $domain,) {
if ( if (
(is_product() || "woocommerce" === $domain &&
is_product_category() || is_admin() &&
is_product_tag() || isset($_REQUEST["action"]) &&
is_cart() || "woocommerce_load_variations" === $_REQUEST["action"]
is_checkout() ||
is_account_page()) &&
!is_shop()
) { ) {
if (!verify_pppr_cookie_string()) { if ($translated_text === "Reguliere prijs (%s)") {
if (!WC()->cart->is_empty()) { $translated_text = "Prijs overige regios (%s)";
WC()->cart->empty_cart();
}
wp_safe_redirect($this->get_shop_url());
exit();
}else{
update_expire_pppr_cookie();
} }
} }
} return $translated_text;
}, 99, 3,
);
public function display_local_price_on_product($price_html, $product)
{
if (
$product->is_type("variation") &&
isset($_COOKIE["PPPR"]) &&
pppr_is_local()
) {
$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( /*
* Filter out variations whwre the price is
* either 0 or '' in the dropdown menu product page
*/
add_filter("woocommerce_variation_is_visible",
function (
$visible, $visible,
$variation_id, $variation_id,
$parent_id, $parent_id,
@@ -213,31 +148,145 @@ class PrijsPerPostcode
} }
return $visible; return $visible;
} }, 10, 4,
);
public function change_variation_regular_price_label(
$translated_text, /*
$text, * Dynamically recalculates the cart total by overriding the standard price
$domain, * with a region-specific _local_price for variations when
) { * the user's location matches the PPPR cookie criteria
if ( */
"woocommerce" === $domain && add_action("woocommerce_before_calculate_totals", function($cart)
is_admin() && {
isset($_REQUEST["action"]) && if (is_admin() && !defined("DOING_AJAX")) {
"woocommerce_load_variations" === $_REQUEST["action"] return;
) { }
if ($translated_text === "Reguliere prijs (%s)") {
$translated_text = "Prijs overige regios (%s)"; 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($_COOKIE["PPPR"]) && pppr_is_local() )
{
$local_price = get_post_meta(
$variation_id,
"_local_price",
true,
);
if ($local_price)
{
$product->set_price($local_price);
}
} }
} }
return $translated_text; }
);
/*
* Filter to display the regular or local price on teh product page.
*/
add_filter( "woocommerce_get_price_html",
function($price_html, $product)
{
if (
$product->is_type("variation") &&
isset($_COOKIE["PPPR"]) &&
pppr_is_local()
) {
$local_price = get_post_meta(
$product->get_id(),
"_local_price",
true,
);
if ($local_price !== "") {
return wc_price($local_price);
}
}
return $price_html;
}, 10, 2,
);
/*
* Enforces region-locking by clearing the cart and redirecting users to
* the shop page if their location cookie is invalid or expired when
* accessing key WooCommerce pages.
*/
add_action("template_redirect",
function ()
{
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 (!verify_pppr_cookie_string()) {
if (!WC()->cart->is_empty()) {
WC()->cart->empty_cart();
}
wp_safe_redirect(get_shop_url());
exit();
}else{
update_expire_pppr_cookie();
}
}
}
);
/*
* Chack or postcode is still valid when pressing the buy button
*/
add_action( 'woocommerce_after_checkout_validation', function( $data, $errors ) {
// 1. Controleer of de cookie bestaat en geldig is
if ( ! isset( $_COOKIE['PPPR'] ) || ! verify_pppr_cookie_string() ) {
$errors->add(
'pppr_cookie_invalid',
__( '<strong>Fout:</strong> Sessie verlopen. Vernieuw de pagina en vul je postcode opnieuw in.', 'woocommerce' )
);
return; // Stop hier, geen zin om verder te checken
} }
public function get_shop_url () { $pppr_data = get_PPPR_data();
return (function_exists('wcml_get_store_url'))
? wcml_get_store_url() // WPML WooCommerce Multilingual
: get_permalink(wc_get_page_id('shop')); // Fallback
}
}
new PrijsPerPostcode(); if ( ! $pppr_data || empty( $pppr_data['postcode'] ) ) {
$errors->add(
'pppr_data_missing',
__( '<strong>Fout:</strong> Kon postcode niet laden.', 'woocommerce' )
);
return;
}
// 3. Normalizeer postcodes (gebruik de juiste variabelen!)
$cookie_pc = strtoupper( str_replace( ' ', '', $pppr_data['postcode'] ) );
$shipping_pc = strtoupper( str_replace( ' ', '', $data['shipping_postcode'] ) );
// 4. Vergelijk
if ( $cookie_pc !== $shipping_pc ) {
wc_add_notice(
__( '<strong>Fout:</strong> Afleverpostcode komt niet overeen met de eerder ingevulde postcode.', 'woocommerce' ),
'error'
);
}
}, 10, 2 );
function get_shop_url () {
return (function_exists('wcml_get_store_url'))
? wcml_get_store_url() // WPML WooCommerce Multilingual
: get_permalink(wc_get_page_id('shop')); // Fallback
}

View File

@@ -279,15 +279,6 @@ function handle_postcode_modal($data)
], 200); ], 200);
} }
function register_modal_api()
{
register_rest_route("postcode-modal/v1", "submit", [
"methods" => "POST",
"callback" => "handle_postcode_modal",
"permission_callback" => "__return_true",
]);
}
function verify_postcode($postcode) function verify_postcode($postcode)
{ {
if (!preg_match('/^[0-9]{4}\s?[A-Za-z]{2}$/', $postcode) === 1) { if (!preg_match('/^[0-9]{4}\s?[A-Za-z]{2}$/', $postcode) === 1) {
@@ -384,9 +375,9 @@ function modify_checkout_with_js() {
return; return;
} }
$city = trim(esc_js( $data['city'] )); $city = esc_js( $data['city'] );
$postcode = trim(esc_js( preg_replace( '/(\d+)([A-Z]+)/', '$1 $2', strtoupper( $data['postcode'])))); $postcode = esc_js( preg_replace( '/(\d+)([A-Z]+)/', '$1 $2', strtoupper( $data['postcode'])));
$address = trim(esc_js( $data['street'] . ' ' . strtoupper( $data['house_number']))); $address = esc_js( $data['street'] . ' ' . strtoupper( $data['house_number']));
// Enqueue script properly to handle dependencies and nonces // Enqueue script properly to handle dependencies and nonces
wp_enqueue_script( 'jquery' ); wp_enqueue_script( 'jquery' );
@@ -554,6 +545,7 @@ function load_assets_reset_postcode_on_checkout()
} }
} }
function handle_unset_session_fetch() function handle_unset_session_fetch()
{ {
// Verify the nonce for security // Verify the nonce for security