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() ?>