From 58307197775bc2013bfd0d03d2b9e7d9b96a2e64 Mon Sep 17 00:00:00 2001
From: Reinhold Kainhofer <reinhold@kainhofer.com>
Date: Fri, 26 May 2017 01:44:16 +0200
Subject: [PATCH] urldecode all SLUGs

All SLUGs are stored URL-encoded in the database, so we need to urldecode them before inserting them into lists like the Categories variable. This allows general UTF-8 SLUGs to work properly.

Fixes #17
---
 .../rules_shipping_framework_woocommerce.php  | 22 +++++++++----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/includes/rules_shipping_framework_woocommerce.php b/includes/rules_shipping_framework_woocommerce.php
index 4499c3e..5d8edde 100644
--- a/includes/rules_shipping_framework_woocommerce.php
+++ b/includes/rules_shipping_framework_woocommerce.php
@@ -196,10 +196,10 @@ class RulesShippingFrameworkWooCommerce extends RulesShippingFramework {
 				$skus[] = $product['data']->get_sku();
 			}
 			foreach (wc_get_product_terms( $id, 'product_cat') as $c) {
-				$categories[] = $c->slug;
+				$categories[] = urldecode($c->slug);
 			}
 			foreach (wc_get_product_terms( $id, 'product_tag') as $c) {
-				$tags[] = $c->slug;
+				$tags[] = urldecode($c->slug);
 			}
 			$shipclass = $product['data']->get_shipping_class();
 			if ($shipclass) {
@@ -251,7 +251,7 @@ class RulesShippingFrameworkWooCommerce extends RulesShippingFramework {
 			foreach ($products as $product) {
 				foreach (get_product_vendors($product['data']->get_id()) as $vendor) {
 // $this->printWarning("<pre>vendor: ".print_r($vendor,1)."</pre>");
-					$vendors[] = $vendor->slug;
+					$vendors[] = urldecode($vendor->slug);
 					$vendornames[] = $vendor->title;
 					$vendorids[] = $vendor->ID;
 				}
@@ -271,7 +271,7 @@ class RulesShippingFrameworkWooCommerce extends RulesShippingFramework {
 				$vendor = yith_get_vendor($product['data']->get_id(), 'product');
 // $this->printWarning("<pre>vendor: ".print_r($vendor,1)."</pre>");
 				if ($vendor->is_valid()) {
-					$vendors[] = $vendor->slug;
+					$vendors[] = urldecode($vendor->l);
 					$vendornames[] = $vendor->name;
 					$vendorids[] = $vendor->term_id;
 				}
@@ -384,15 +384,15 @@ class RulesShippingFrameworkWooCommerce extends RulesShippingFramework {
 		$subcategories = array();
 		if (isset($filter_conditions['subcategories']) && !empty($filter_conditions['subcategories'])) {
 			foreach ($filter_conditions['subcategories'] as $catslug) {
-				// Get the term itself (we have only the slug!)
-				$cat = get_term_by('slug', $catslug, 'product_cat');
+				// Get the term itself (we have only the slug!), DB stores slugs as URL-encoded!
+				$cat = get_term_by('slug', urlencode($catslug), 'product_cat');
 				if (empty($cat))
 					continue;
-				$subcategories[] = $cat->slug;
+				$subcategories[] = urldecode($cat->slug);
 				// Get the list of all subcategories of the given categories
 				$args=array('child_of' => $cat->term_id, 'hierarchical' => 1);
 				foreach (get_terms( 'product_cat', $args) as $subcat) {
-					$subcategories[] = $subcat->slug;
+					$subcategories[] = urldecode($subcat->slug);
 				}
 			}
 			$subcategories = array_unique($subcategories);
@@ -402,7 +402,7 @@ class RulesShippingFrameworkWooCommerce extends RulesShippingFramework {
 		foreach ($products as $p) {
 			$prodcategories = array();
 			foreach (wc_get_product_terms( $p['data']->id, 'product_cat') as $cat) {
-				$prodcategories[] = $cat->slug;
+				$prodcategories[] = urldecode($cat->slug);
 			}
 			if (!empty($filter_conditions['products']) && !in_array($p['data']->get_sku(), $filter_conditions['products']))
 				continue;
@@ -429,7 +429,7 @@ class RulesShippingFrameworkWooCommerce extends RulesShippingFramework {
 				// "WooThemes Vendor Products" support (vendors stored in its own taxonomy)
 				if (class_exists("WooCommerce_Product_Vendors") && function_exists("get_product_vendors")) {
 					foreach (get_product_vendors($p['data']->id) as $vendor) {
-						$vnd_props[] = $vendor->slug;
+						$vnd_props[] = urldecode($vendor->slug);
 					}
 				}
 
@@ -437,7 +437,7 @@ class RulesShippingFrameworkWooCommerce extends RulesShippingFramework {
 				if (function_exists("yith_get_vendor")) {
 					$vendor = yith_get_vendor($p['data']->id, 'product');
 					if ($vendor->is_valid()) {
-						$vnd_props[] = $vendor->slug;
+						$vnd_props[] = urldecode($vendor->slug);
 					}
 				}
 		
-- 
GitLab