Compare commits
2 Commits
d060a412cb
...
ce165ebfc6
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ce165ebfc6 | ||
|
|
23ba4e89ef |
@@ -28,34 +28,175 @@ class PrijsPerPostcode
|
||||
$uri = $_SERVER["REQUEST_URI"];
|
||||
if_needed_place_postcode_form($uri);
|
||||
|
||||
add_action("wp_footer", "set_checkout_fields_with_javascript");
|
||||
function set_checkout_fields_with_javascript()
|
||||
{
|
||||
// Only run on the checkout page
|
||||
if (!is_checkout() || is_wc_endpoint_url()) {
|
||||
return;
|
||||
}
|
||||
add_action("woocommerce_product_query", [
|
||||
$this,
|
||||
"custom_show_products_by_tag",
|
||||
]);
|
||||
add_action("template_redirect", [$this, "redirect_if_missing_tag"]);
|
||||
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"],
|
||||
10,
|
||||
3,
|
||||
);
|
||||
}
|
||||
|
||||
// Define the values you want to set
|
||||
$woonplaats = $SESSION["woonplaats"];
|
||||
$postcode = $_SESSION["postcode"];
|
||||
$address_1 =
|
||||
$_SESSION["straatnaam"] . " " . $_SESSION["huisnummer"];
|
||||
// Output the JavaScript
|
||||
?>
|
||||
<script type="text/javascript">
|
||||
jQuery(document).ready(function($){
|
||||
// Set the values for the checkout fields
|
||||
$('#billing_city').val('<?php echo esc_js($woonplaats); ?>');
|
||||
$('#billing_postcode').val('<?php echo esc_js($postcode); ?>');
|
||||
$('#billing_address_1').val('<?php echo esc_js(
|
||||
$address_1,
|
||||
); ?>');
|
||||
});
|
||||
</script>
|
||||
<?php
|
||||
public function set_checkout_fields_with_javascript()
|
||||
{
|
||||
// Only run off the checkout page
|
||||
if (!is_checkout() || is_wc_endpoint_url()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Define the values you want to set
|
||||
$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
|
||||
?>
|
||||
<script type="text/javascript">
|
||||
jQuery(document).ready(function($){
|
||||
// Set the values for the checkout fields
|
||||
$('#billing_city').val('<?php echo esc_js(
|
||||
$woonplaats,
|
||||
); ?>');
|
||||
$('#billing_postcode').val('<?php echo esc_js(
|
||||
$postcode,
|
||||
); ?>');
|
||||
$('#billing_address_1').val('<?php echo esc_js(
|
||||
$address,
|
||||
); ?>');
|
||||
});
|
||||
</script>
|
||||
<?php
|
||||
}
|
||||
|
||||
public function custom_show_products_by_tag($q)
|
||||
{
|
||||
// Only target main product queries on the frontend
|
||||
if (
|
||||
!is_admin() &&
|
||||
$q->is_main_query() &&
|
||||
(is_shop() || is_product_category() || is_home())
|
||||
) {
|
||||
// Replace this with your actual boolean logic
|
||||
$show_lokaal = $_SESSION["lokaal_tarief"] ?? false;
|
||||
|
||||
// Determine which tag to show
|
||||
$tag_to_show = $show_lokaal ? "lokaal" : "algemeen";
|
||||
|
||||
// Set the tax query to only include the chosen tag
|
||||
$tax_query = [
|
||||
[
|
||||
"taxonomy" => "product_tag",
|
||||
"field" => "slug",
|
||||
"terms" => [$tag_to_show],
|
||||
"operator" => "IN",
|
||||
],
|
||||
];
|
||||
$q->set("tax_query", $tax_query);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function redirect_if_missing_tag()
|
||||
{
|
||||
// Only run on frontend single product pages
|
||||
if (is_admin() || !is_singular("product")) {
|
||||
return;
|
||||
}
|
||||
|
||||
$product_id = get_the_ID();
|
||||
$product = wc_get_product($product_id);
|
||||
|
||||
$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;
|
||||
}
|
||||
}
|
||||
new PrijsPerPostcode();
|
||||
|
||||
8
read.md
8
read.md
@@ -1,3 +1,7 @@
|
||||
# Prijs per postcode
|
||||
# Goedkoop Tilburg
|
||||
|
||||
Laat een modal zien op de /winkel pag. De modal vraagt om postcode en huisnummer. Na validatie worden vier sessievarablen gemaakt postcode, huisnummer, straatnaam, islokaal
|
||||
Deze plugin laat verschillende producten zien in Woocommerce naar aanleiding van de opgegeven postcode.
|
||||
|
||||
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.
|
||||
|
||||
@@ -69,7 +69,8 @@ function send_postcode_data()
|
||||
}
|
||||
|
||||
if (data.status === "success"){
|
||||
postcodeModal.close();
|
||||
//postcodeModal.close();
|
||||
location.reload();
|
||||
}
|
||||
}catch(err){
|
||||
console.error("Fetch Failed:", err);
|
||||
@@ -159,7 +160,8 @@ function handle_postcode_modal($data)
|
||||
$_SESSION["huisnummer"] = $params["huisnummer"];
|
||||
$_SESSION["straatnaam"] = $result["straatnaam"];
|
||||
$_SESSION["woonplaats"] = $result["woonplaats"];
|
||||
$_SESSION["lokaak_tarief"] = postcode_in_range(
|
||||
|
||||
$_SESSION["lokaal_tarief"] = postcode_in_range(
|
||||
$params["postcode"],
|
||||
5000,
|
||||
5800,
|
||||
|
||||
Reference in New Issue
Block a user