diff --git a/prijs-per-postcode.php b/prijs-per-postcode.php
index ba1a073..0b6876d 100644
--- a/prijs-per-postcode.php
+++ b/prijs-per-postcode.php
@@ -3,10 +3,10 @@
session_start();
require_once "session_dialog.php";
/*
- * Plugin Name: Goedkoop Tilburg
- * 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.1
* Text Domeain: prijs-per-postcode
*/
@@ -28,39 +28,43 @@ class PrijsPerPostcode
$uri = $_SERVER["REQUEST_URI"];
if_needed_place_postcode_form($uri);
- add_action("woocommerce_product_query", [
- $this,
- "custom_show_products_by_tag",
- ]);
- add_action("template_redirect", [$this, "redirect_if_missing_tag"]);
- add_action("template_redirect", [
- $this,
- "force_404_for_specific_product_tags",
- ]);
- add_action("template_redirect", [
- $this,
- "redirect_checkout_if_lokaaltarief_not_set",
- ]);
- add_action("wp_footer", [$this, "set_checkout_fields_with_javascript"]);
- add_filter("woocommerce_checkout_fields", [
- $this,
- "make_checkout_fields_readonly",
- ]);
- add_filter("woocommerce_product_related_posts_query", [
- $this,
- "custom_filter_related_products_by_session_tag",
- ]);
- add_filter(
- "get_the_terms",
- [$this, "hide_lokaal_and_overige_regios_tags"],
+ //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_action("wp_footer", [$this, "set_checkout_fields_with_javascript"]);
}
public function set_checkout_fields_with_javascript()
{
- if (!is_checkout() || is_wc_endpoint_url()) {
+ if (
+ !is_checkout() ||
+ (is_wc_endpoint_url() && !is_wc_endpoint_url("order-received"))
+ ) {
return;
}
@@ -74,173 +78,142 @@ class PrijsPerPostcode
$_SESSION["straatnaam"] . " " . strtoupper($_SESSION["huisnummer"]);
// Output the JavaScript
?>
-
-
+
+
+ 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).setShippingAddress({
+ first_name: '',
+ last_name: '',
+ address_1: '',
+ address_2: '',
+ city: '',
+ state: '',
+ postcode: '',
+ country: 'NL',
+ phone: '',
+ email: ''
+ });
+
+ setTimeout(() => {
+ $('#shipping-postcode, #shipping-city, #shipping-address_1')
+ .prop('readonly', true)
+ .css('background', '#f9f9f9');
+ }, 500);
+
+ jQuery(document.body).trigger('update_checkout');
+ } else {
+ console.error('WooCommerce Blocks API is niet beschikbaar');
+ }
+
+ }
+
+ is_main_query() &&
- (is_shop() || is_product_category() || is_home())
- ) {
- $show_lokaal = $_SESSION["lokaal_tarief"] ?? false;
+ 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
+ ]);
+ }
- $tag_to_show = $show_lokaal ? "lokaal" : "algemeen";
-
- $tax_query = [
- [
- "taxonomy" => "product_tag",
- "field" => "slug",
- "terms" => [$tag_to_show],
- "operator" => "IN",
- ],
- ];
- $q->set("tax_query", $tax_query);
+ 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 redirect_if_missing_tag()
+ public function use_local_price_if_local_postcode($cart)
{
- // Only run on frontend single product pages
- if (is_admin() || !is_singular("product")) {
+ if (is_admin() && !defined("DOING_AJAX")) {
return;
}
- $product_id = get_the_ID();
- $product = wc_get_product($product_id);
+ foreach ($cart->get_cart() as $cart_item) {
+ $product = $cart_item["data"];
+ $variation_id = $product->is_type("variation")
+ ? $product->get_id()
+ : 0;
- $show_lokaal = $_SESSION["lokaal_tarief"] ?? false;
- $tag_to_show = $show_lokaal ? "lokaal" : "algemeen";
-
- if (!$product || !has_term($tag_to_show, "product_tag", $product_id)) {
- wp_redirect(home_url("/shop")); // Works with Dutch permalink
- exit();
- }
- }
-
- public function hide_lokaal_and_overige_regios_tags(
- $terms,
- $post_id,
- $taxonomy,
- ) {
- if ($taxonomy === "product_tag" && !is_admin()) {
- $tags_to_hide = ["lokaal", "algemeen"];
- return array_filter($terms, function ($term) use ($tags_to_hide) {
- return !in_array($term->slug, $tags_to_hide);
- });
- }
- return $terms;
- }
-
- public function make_checkout_fields_readonly($fields)
- {
- $readonly_fields = [
- "billing_address_1",
- "billing_city",
- "billing_postcode",
- ];
-
- foreach ($readonly_fields as $field) {
- if (isset($fields["billing"][$field])) {
- $fields["billing"][$field]["custom_attributes"][
- "readonly"
- ] = true;
- }
- }
- return $fields;
- }
-
- public function custom_filter_related_products_by_session_tag($query)
- {
- // Start session if not already started
- if (session_status() === PHP_SESSION_NONE) {
- session_start();
- }
-
- // Determine which tag to exclude based on session
- $show_lokaal = $_SESSION["lokaal_tarief"] ?? false;
- $exclude_tag = $show_lokaal ? "algemeen" : "lokaal";
-
- global $wpdb;
-
- // Get term_taxonomy_id for the tag to exclude
- $excluded_term = $wpdb->get_var(
- $wpdb->prepare(
- "SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} tt
- JOIN {$wpdb->terms} t ON tt.term_id = t.term_id
- WHERE tt.taxonomy = 'product_tag' AND t.slug = %s",
- $exclude_tag,
- ),
- );
-
- if ($excluded_term) {
- $query[
- "join"
- ] .= " LEFT JOIN {$wpdb->term_relationships} exclude_tr ON exclude_tr.object_id = p.ID ";
- $query["where"] .= $wpdb->prepare(
- " AND ( exclude_tr.term_taxonomy_id != %d OR exclude_tr.term_taxonomy_id IS NULL )",
- $excluded_term,
- );
- }
-
- return $query;
- }
-
- function redirect_checkout_if_lokaaltarief_not_set()
- {
- // Check if we are on the checkout, product, or cart page
- if (is_checkout() || is_product() || is_cart()) {
- // Prevent redirect on checkout endpoints (order-received, etc.)
- if (is_wc_endpoint_url()) {
- return;
- }
-
- // Check if the session variable is NOT set
- if (!isset($_SESSION["lokaal_tarief"])) {
- wc_clear_notices();
- wc_add_notice(
- __(
- "Local rate not available. Redirecting to shop.",
- "woocommerce",
- ),
- "notice",
+ if (
+ $variation_id &&
+ isset($_SESSION["postcode_is_local"]) &&
+ $_SESSION["postcode_is_local"]
+ ) {
+ $local_price = get_post_meta(
+ $variation_id,
+ "_local_price",
+ true,
);
- wp_safe_redirect(wc_get_page_permalink("shop"));
+ 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 force_404_for_specific_product_tags()
+ public function display_local_price_on_product($price_html, $product)
{
- // Check if it's a product tag archive
- if (is_tax("product_tag")) {
- $tag = get_queried_object();
-
- // List of tag slugs to block
- $blocked_tags = ["lokaal", "algemeen"];
-
- // If the current tag is in the blocked list, trigger 404
- if (in_array($tag->slug, $blocked_tags)) {
- global $wp_query;
- $wp_query->set_404();
- status_header(404);
+ 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;
}
}
diff --git a/session_dialog.php b/session_dialog.php
index d71c97a..d41ee60 100644
--- a/session_dialog.php
+++ b/session_dialog.php
@@ -3,12 +3,7 @@
session_start();
function if_needed_place_postcode_form($uri)
{
- if (
- strpos($uri, "/shop") !== false ||
- strpos($uri, "/winkel") !== false ||
- strpos($uri, "/product") !== 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()) {
@@ -16,6 +11,7 @@ function if_needed_place_postcode_form($uri)
WC()->cart->empty_cart();
}
add_action("wp_footer", "show_modal");
+ render_dialog_html();
}
}
}
@@ -31,7 +27,7 @@ function modal_styles()
function show_modal()
{
?>
-
@@ -43,20 +39,24 @@ function send_postcode_data()
?>