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() { wp_enqueue_style( "prijs-per-postcode", plugins_url("/assets/postcode_modal.css", __FILE__), [], // Voeg een lege dependencies array toe (verplicht) filemtime(plugin_dir_path(__FILE__) . "assets/postcode_modal.css"), // Voeg versie toe ); } function show_modal() { ?>

Vul je postcode en huisnummer in.

Onze prijzen zijn afhankelijk van de regio. Vul daarom de postcode en het huisnummer in om de exacte prijzen te bekijken.

get_params(); $nonce = $data->get_header("X-WP-Nonce"); // 1. Security if (!wp_verify_nonce($nonce, "wp_rest")) { echo json_encode(["status" => "error", "message" => "nononce"]); exit(); } // 2. Basis Validatie if (!verify_postcode($params["postcode"])) { echo json_encode(["status" => "error", "message" => "postcode"]); exit(); } if (!verify_huisnummer($params["huisnummer"])) { echo json_encode(["status" => "error", "message" => "huisnummer"]); exit(); } // 3. API Call (Ruwe data) $result = getStraatnaam($params["postcode"], $params["huisnummer"]); // 4. Validatie & Logic $hasError = isset($result["error"]); $errorCode = null; $errorMessage = null; $candidates = []; $straatnaam = null; $woonplaats = null; if ($hasError) { $errorCode = $result["error"]["code"] ?? "UNKNOWN_ERROR"; $errorMessage = $result["error"]["message"] ?? "Onbekende fout"; $candidates = $result["error"]["details"]["candidates"] ?? []; // SPECIAL CASE: HUISNUMMER_AMBIGUOUS if ($errorCode === "HUISNUMMER_AMBIGUOUS" && !empty($candidates)) { $plainMatch = null; // Zoek naar candidate ZONDER toevoeging foreach ($candidates as $candidate) { if ( empty($candidate["huisletter"]) && empty($candidate["huisnummertoevoeging"]) ) { $plainMatch = $candidate; break; } } // Als we een 'platte' match hebben (bijv. 15), dan is het SUCCES if ($plainMatch) { $hasError = false; // Negeer de error $straatnaam = $plainMatch["straat"]; $woonplaats = $plainMatch["woonplaats"]; } } } else { // Normaal succes (geen error in response) if (!empty($result["results"])) { $straatnaam = $result["results"][0]["straat"]; $woonplaats = $result["results"][0]["woonplaats"]; } else { // Edge case: geen error veld, maar ook geen results $hasError = true; $errorCode = "NO_RESULTS"; $errorMessage = "Adres niet gevonden"; } } // 5. Response sturen if ($hasError) { echo json_encode([ "status" => "error", "code" => $errorCode, "message" => $errorMessage, "suggestions" => $result["error"]["details"]["suggestions"] ?? [], "apirequest" => "openpostcode.nl", ]); exit(); } // 6. Succes: Sessie opslaan & response $_SESSION["postcode"] = $params["postcode"]; $_SESSION["huisnummer"] = $params["huisnummer"]; $_SESSION["straatnaam"] = $straatnaam; $_SESSION["woonplaats"] = $woonplaats; $_SESSION["postcode_is_local"] = postcode_in_range($params["postcode"]); echo json_encode([ "status" => "success", "message" => "all good", "straatnaam" => $straatnaam, "woonplaats" => $woonplaats, "lokaal_tarief" => postcode_in_range($params["postcode"]), ]); exit(); } function register_modal_api() { register_rest_route("postcode-modal/v1", "submit", [ "methods" => "POST", "callback" => "handle_postcode_modal", ]); } function verify_postcode($postcode) { if (!preg_match('/^[0-9]{4}\s?[A-Za-z]{2}$/', $postcode) === 1) { return false; } return true; } function verify_huisnummer($huisnummer) { if (!preg_match('/^[0-9]{4}\s?[A-Za-z]{2}$/', $huisnummer) === 1) { return false; } return true; } function getStraatnaam($postcode, $huisnummer) { $url = "https://openpostcode.nl/api/v2/address?postcode=" . urlencode($postcode) . "&huisnummer=" . urlencode($huisnummer); $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); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if (curl_error($ch)) { curl_close($ch); return [ "error" => ["code" => "CURL_ERROR", "message" => curl_error($ch)], ]; } curl_close($ch); // Decodeer als associatieve array (true) $data = json_decode($response, true); // Als JSON decode faalt if (json_last_error() !== JSON_ERROR_NONE) { return [ "error" => [ "code" => "JSON_ERROR", "message" => "Invalid JSON response", ], ]; } // Geef de RUWE response terug (inclusief meta, error, results, etc.) return $data; } 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 ?> 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(); }