Index: /changelog
===================================================================
--- /changelog	(revision 8057)
+++ /changelog	(revision 8059)
@@ -511,2 +511,6 @@
 - Feature: Abos kÃ¶nnen jetzt auf 10 Jahre in der Zukunft gesetzt werden
 - Feature: Positionssnummer aus ProduktÃŒbersicht bearbeitbar
+- Feature: Kategorie im Produkt Backend anzeigbar, sortier und filterbar 
+- Feature: Produkte ohne Kategorie finden 
+
+
Index: /controller/wpsg_ProduktController.class.php
===================================================================
--- /controller/wpsg_ProduktController.class.php	(revision 8057)
+++ /controller/wpsg_ProduktController.class.php	(revision 8059)
@@ -218,6 +218,12 @@
 			$_SESSION['wpsg']['backend']['products']['arFilter'] = $this->shop->view['arFilter'];
 
+			if ($this->shop->hasMod('wpsg_mod_produktartikel') && $this->get_option('wpsg_mod_produktartikel_cat')) {
+				
+				$this->shop->view['arFilter']['loadCat'] = true;
+				
+			}
+			
 			$this->shop->view['arData'] = wpsg_product::find(wpsg_array_merge(array('searchExt' => '1'), $this->shop->view['arFilter']));
-
+			
 			if (isset($_REQUEST['submit-button'])) $this->shop->view['submit'] = true;
 			else $this->shop->view['submit'] = false;
Index: /model/wpsg_product.class.php
===================================================================
--- /model/wpsg_product.class.php	(revision 8057)
+++ /model/wpsg_product.class.php	(revision 8059)
@@ -720,6 +720,5 @@
 		} // public static function getMinPrice($arFilter = array())
 
-		public static function count($arFilter = array())
-		{
+		public static function count($arFilter = array()) {
 
 			list($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER) = self::getQueryParts($arFilter);
@@ -732,4 +731,5 @@
 						SELECT
 						  	DISTINCT P.`id`
+						    ".$strQuerySELECT."
 						FROM
 							`".WPSG_TBL_PRODUCTS."` AS P
@@ -744,4 +744,6 @@
 			";
           
+			// wpsg_debug($strQuery);
+			
 			return $GLOBALS['wpsg_db']->fetchOne($strQuery);
 
@@ -783,4 +785,6 @@
 			";
 
+			// wpsg_debug($strQuery);
+			
 			$arID = $GLOBALS['wpsg_db']->fetchAssocField($strQuery);
 			$arReturn = array();
@@ -841,5 +845,18 @@
             $bJoinPost = false;
             $bJoinVariants = false;
+			$bJoinTermRelationship = false;
+			$bJoinTermTaxonomy = false;
+			$bJoinTerms = false;
+			
+			$strQueryOn_TermTaxonomy = '';
+			$strQueryOn_Terms = '';
             
+			if (intval($arFilter['productcategory_ids']??0) === -2) {
+				
+				unset($arFilter['productcategory_ids']);
+				$arFilter['isNoCat'] = true;
+				
+			}
+			
 			if (wpsg_isSizedArray($arFilter['product_ids'])) $strQueryWHERE .= " AND P.`id` IN (".wpsg_q(implode(',', $arFilter['product_ids'])).") ";
 
@@ -884,9 +901,27 @@
             }
 
-			if (wpsg_isSizedArray($arFilter['cat_ids']) && $GLOBALS['wpsg_sc']->hasMod('wpsg_mod_produktartikel'))
-			{
-
-				$strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'posts')."` AS POST ON (POST.`wpsg_produkt_id` = P.`id`) ";
-				$strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'term_relationships')."` AS PCAT ON (POST.`ID` = PCAT.`object_id`) ";
+			if (($arFilter['isNoCat']??false) === true) {
+				 
+				$strQuerySELECT = ", (
+					SELECT
+						COUNT(*)
+					FROM
+						`".wpsg_q($GLOBALS['wpsg_sc']->prefix.'posts')."` AS SUB_POST
+							RIGHT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'term_relationships')."` AS SUB_PCAT ON (SUB_POST.`ID` = SUB_PCAT.`object_id`)
+					WHERE
+						SUB_POST.`wpsg_produkt_id` = P.`id`
+				) AS `count_cat` ";				
+				
+				$strQueryHAVING .= " AND `count_cat` <= 0 ";
+				
+			}
+			
+			if (wpsg_isSizedArray($arFilter['cat_ids']) && $GLOBALS['wpsg_sc']->hasMod('wpsg_mod_produktartikel')) {
+
+				//$strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'posts')."` AS POST ON (POST.`wpsg_produkt_id` = P.`id`) ";
+				//$strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'term_relationships')."` AS PCAT ON (POST.`ID` = PCAT.`object_id`) ";
+
+				$bJoinPost = true;
+				$bJoinTermRelationship = true;
 
 				$strQueryWHERE .= " AND PCAT.`term_taxonomy_id` IN (".wpsg_q(implode(',', $arFilter['cat_ids'])).") ";
@@ -894,28 +929,56 @@
 			}
 
-			if ((wpsg_isSizedString($arFilter['productcategory_ids'])) && ($arFilter['productcategory_ids'] != '-1') && ($GLOBALS['wpsg_sc']->hasMod('wpsg_mod_produktartikel')))
-			{
-
-				$strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'posts')."` AS POST ON (POST.`wpsg_produkt_id` = P.`id`) ";
-				$strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'term_relationships')."` AS TR ON (POST.`ID` = TR.`object_id`) ";
-
-				$strQueryWHERE .= " AND TR.`term_taxonomy_id` = ".$arFilter['productcategory_ids']." ";
-				/*
-				$strQueryWHERE = " AND P.`lang_parent` <= 0 ";
-				$strQueryHAVING .= "
-					AND (
-						P.`name` LIKE '%".wpsg_q($arFilter['s'])."%' OR
-						P.`anr` LIKE '%".wpsg_q($arFilter['s'])."%'
-					)
-				";
-				*/
-
-			}
-
-			if (wpsg_isSizedArray($arFilter['variants']))
-			{
-
-				foreach (wpsg_trim($arFilter['variants']) as $variant_id => $variation_id)
-				{
+			if (($arFilter['loadCat']??false) === true) {
+				
+				$bJoinPost = true;
+				$bJoinTermRelationship = true;
+				$bJoinTermTaxonomy = true;
+				$bJoinTerms = true;
+				
+				//$strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'posts')."` AS POST ON (POST.`wpsg_produkt_id` = P.`id`) ";				
+				//$strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'term_relationships')."` AS PCAT ON (POST.`ID` = PCAT.`object_id`) ";				
+				//$strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'term_taxonomy')."` AS TERMTAX ON (TERMTAX.`term_taxonomy_id` = PCAT.`term_taxonomy_id`) ";
+				//$strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'terms')."` AS TERMS ON (TERMS.`term_id` = TERMTAX.`term_id`) ";
+				
+				if (wpsg_isSizedString($arFilter['ascdesc'], "DESC")) $strDirection = " DESC ";
+				else $strDirection = " ASC ";
+				
+				if (wpsg_ShopController::getShop()->get_option('wpsg_mod_produktartikel_cat_first_level') === '1') {
+					
+					$strQueryOn_TermTaxonomy .= " AND TERMTAX.`parent` = '0' ";
+					
+				}
+				
+				$wpsg_mod_produktartikel_cat_ignore = trim(wpsg_ShopController::getShop()->get_option('wpsg_mod_produktartikel_cat_ignore'));
+				
+				if ($wpsg_mod_produktartikel_cat_ignore !== '') {
+				
+					foreach (explode(',', wpsg_ShopController::getShop()->get_option('wpsg_mod_produktartikel_cat_ignore')) as $exclude_term_slug) {
+						
+						if ($exclude_term_slug > 0) $strQueryOn_Terms .= " AND TERM.`slug` != '".wpsg_q($exclude_term_slug)."' ";
+						
+					}
+				
+				}
+            				
+				$strQuerySELECT .= " , GROUP_CONCAT(TERMS.name ORDER BY TERMS.name ".$strDirection.") AS `cat_names` ";
+				
+			}
+			
+			if ((wpsg_isSizedString($arFilter['productcategory_ids'])) && ($arFilter['productcategory_ids'] != '-1') && ($GLOBALS['wpsg_sc']->hasMod('wpsg_mod_produktartikel'))) {
+
+				$bJoinPost = true;
+				$bJoinTermRelationship = true;
+				
+				//$strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'posts')."` AS POST ON (POST.`wpsg_produkt_id` = P.`id`) ";
+				//$strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'term_relationships')."` AS TR ON (POST.`ID` = TR.`object_id`) ";
+
+				$strQueryWHERE .= " AND PCAT.`term_taxonomy_id` = ".$arFilter['productcategory_ids']." ";
+		
+			}
+
+			if (wpsg_isSizedArray($arFilter['variants'])) {
+
+				foreach (wpsg_trim($arFilter['variants']) as $variant_id => $variation_id) {
 
 					$in = wpsg_q($variant_id);
@@ -926,9 +989,7 @@
 			}
 
-			if (wpsg_isSizedArray($arFilter['attributs']))
-			{
-
-				foreach ($arFilter['attributs'] as $attribut_id => $attribut_value)
-				{
+			if (wpsg_isSizedArray($arFilter['attributs'])) {
+
+				foreach ($arFilter['attributs'] as $attribut_id => $attribut_value) {
 
 					$in = wpsg_q($attribut_id);
@@ -951,5 +1012,6 @@
             else if (wpsg_isSizedString($arFilter['order'], 'cdate')) { $strQueryORDER = " P.`cdate` "; }
 			else if (wpsg_isSizedString($arFilter['order'], 'anr')) { $strQueryORDER = " P.`anr` "; }
-            else if (wpsg_isSizedString($arFilter['order'], 'pos')) { $strQueryORDER = " PP.`menu_order` "; $bJoinPost = true; }
+            else if (wpsg_isSizedString($arFilter['order'], 'pos')) { $strQueryORDER = " POST.`menu_order` "; $bJoinPost = true; }
+			else if (($arFilter['order']??'') === 'cat') { $strQueryORDER = " `cat_names` "; }
 			else if (wpsg_isSizedString($arFilter['order'], 'pgruppe')) {
 
@@ -959,10 +1021,10 @@
 			} else $strQueryORDER = " P.`id` ";
 
-            if ($bJoinPost) {
-                
-                $strQueryJOIN .= " LEFT JOIN `".$GLOBALS['wpsg_sc']->prefix."posts` AS PP ON (PP.`wpsg_produkt_id` = P.`id` AND PP.`post_type` = '".wpsg_q($GLOBALS['wpsg_sc']->get_option('wpsg_mod_produktartikel_pathkey'))."' ) ";
-                
-            }
-            
+			//$strQueryJOIN .= " LEFT JOIN `".$GLOBALS['wpsg_sc']->prefix."posts` AS PP ON (PP.`wpsg_produkt_id` = P.`id` AND PP.`post_type` = '".wpsg_q($GLOBALS['wpsg_sc']->get_option('wpsg_mod_produktartikel_pathkey'))."' ) ";
+            if ($bJoinPost) $strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'posts')."` AS POST ON (POST.`wpsg_produkt_id` = P.`id`) "; 
+			if ($bJoinTermRelationship) $strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'term_relationships')."` AS PCAT ON (POST.`ID` = PCAT.`object_id`) ";
+            if ($bJoinTermTaxonomy) $strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'term_taxonomy')."` AS TERMTAX ON (TERMTAX.`term_taxonomy_id` = PCAT.`term_taxonomy_id` ".$strQueryOn_TermTaxonomy.") ";
+			if ($bJoinTerms) $strQueryJOIN .= " LEFT JOIN `".wpsg_q($GLOBALS['wpsg_sc']->prefix.'terms')."` AS TERMS ON (TERMS.`term_id` = TERMTAX.`term_id` ".$strQueryOn_Terms.") ";
+				
             if ($bJoinVariants) {
 
Index: /mods/wpsg_mod_produktartikel.class.php
===================================================================
--- /mods/wpsg_mod_produktartikel.class.php	(revision 8057)
+++ /mods/wpsg_mod_produktartikel.class.php	(revision 8059)
@@ -93,4 +93,6 @@
             $this->shop->checkDefault('wpsg_mod_produktartikel_gtin_backend', '0');
             $this->shop->checkDefault('wpsg_mod_produktartikel_positionnumber', '0');
+            $this->shop->checkDefault('wpsg_mod_produktartikel_cat', '1');
+			
             /*
              * Posts Tabelle erweitern
@@ -322,6 +324,5 @@
         }
 
-        public function settings_save()
-        {
+        public function settings_save() {
 
             global $wpdb;
@@ -348,4 +349,8 @@
             $this->shop->update_option('wpsg_mod_produktartikel_postthumbnail', $_REQUEST['wpsg_mod_produktartikel_postthumbnail'], false, false, WPSG_SANITIZE_CHECKBOX);
 
+			$this->shop->update_option('wpsg_mod_produktartikel_cat', $_REQUEST['wpsg_mod_produktartikel_cat'], false, false, WPSG_SANITIZE_CHECKBOX);
+			$this->shop->update_option('wpsg_mod_produktartikel_cat_ignore', $_REQUEST['wpsg_mod_produktartikel_cat_ignore'], false, false, WPSG_SANITIZE_TEXTFIELD);
+			$this->shop->update_option('wpsg_mod_produktartikel_cat_first_level', $_REQUEST['wpsg_mod_produktartikel_cat_first_level'], false, false, WPSG_SANITIZE_CHECKBOX);
+			
             //$this->shop->update_option('wpsg_mod_produktartikel_positionnumber', $_REQUEST['wpsg_mod_produktartikel_positionnumber'], false, false, WPSG_SANITIZE_CHECKBOX);
 
@@ -1379,9 +1384,7 @@
         } // public function getProductcategorySelect($ref = 0)
 	
-		public function getProductcategorySelect($arProductFilter = array(), $productCountinLabel = true)
-		{
+		public function getProductcategorySelect($arProductFilter = array(), $productCountinLabel = true) {
 		
-			if (wpsg_isSizedArray($arProductFilter))
-			{
+			if (wpsg_isSizedArray($arProductFilter)) {
 			
 				unset($arProductFilter['limit']);
@@ -1391,17 +1394,30 @@
 				unset($arProductFilter['productcategory_ids']);
 			
+				$arProductFilter['loadCat'] = false;
+				
 				list($strQuerySELECT, $strQueryWHERE, $strQueryJOIN, $strQueryHAVING, $strQueryORDER) = wpsg_product::getQueryParts($arProductFilter);
 			
 				$strQuery = "
-                        SELECT T.`term_id`, T.`name`, P.`name` AS pname, TR.`term_taxonomy_id`,
-                        COUNT( T.`term_id` ) AS anzahl
-                        FROM `".$GLOBALS['wpsg_sc']->prefix."terms` AS T, `".$GLOBALS['wpsg_sc']->prefix."term_taxonomy` AS TT,
-                        `".$GLOBALS['wpsg_sc']->prefix."term_relationships` AS TR, `".$GLOBALS['wpsg_sc']->prefix."posts` AS PO, `".WPSG_TBL_PRODUCTS."` AS P
-                        WHERE T.`term_id` = TT.`term_id` AND TT.`term_taxonomy_id` = TR.`term_taxonomy_id` AND TR.`object_id` = PO.`ID` AND
+                    SELECT 
+						T.`term_id`, T.`name`, P.`name` AS pname, TR.`term_taxonomy_id`,
+						COUNT( T.`term_id` ) AS anzahl
+					FROM 
+						`".$GLOBALS['wpsg_sc']->prefix."terms` AS T, 
+						`".$GLOBALS['wpsg_sc']->prefix."term_taxonomy` AS TT,
+                        `".$GLOBALS['wpsg_sc']->prefix."term_relationships` AS TR, 
+                        `".$GLOBALS['wpsg_sc']->prefix."posts` AS PO, 
+                        `".WPSG_TBL_PRODUCTS."` AS P
+                    WHERE
+                        T.`term_id` = TT.`term_id` AND 
+                        TT.`term_taxonomy_id` = TR.`term_taxonomy_id` AND 
+                        TR.`object_id` = PO.`ID` AND
                         TT.`taxonomy` = '".wpsg_q($this->shop->get_option('wpsg_mod_produktartikel_pathkey_cat'))."' AND
                         PO.`wpsg_produkt_id` = P.`id` ".$strQueryWHERE."
-                        GROUP BY T.`term_id`, T.`name`
-                    ";
+                    GROUP BY 
+                        T.`term_id`, T.`name`
+                ";
 			
+				// wpsg_debug($strQuery);
+				
 				$temp = $GLOBALS['wpsg_db']->fetchAssoc($strQuery);
 				
Index: /views/mods/mod_produktartikel/settings_edit.phtml
===================================================================
--- /views/mods/mod_produktartikel/settings_edit.phtml	(revision 8057)
+++ /views/mods/mod_produktartikel/settings_edit.phtml	(revision 8059)
@@ -24,4 +24,36 @@
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel_ean', __('Darstellung der EAN aktivieren', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_ean'), array('help' => 'wpsg_mod_produktartikel_ean')); ?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel_gtin', __('Darstellung der GTIN aktivieren', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_gtin'), array('help' => 'wpsg_mod_produktartikel_gtin')); ?>
+
+<br />
+
+<?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel_cat', __('Kategorie in ProduktÃŒbersicht (Backend) anzeigen', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_cat'), array('help' => 'wpsg_mod_produktartikel_cat')); ?>
+<div id="wpsg_mod_produktartikel_cat_1">
+    <?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel_cat_first_level', __('Nur erste Ebene', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_cat_first_level'), array('help' => 'wpsg_mod_produktartikel_cat_first_level')); ?>
+    <?php echo wpsg_drawForm_Input('wpsg_mod_produktartikel_cat_ignore', __('Titelformen (Kommagetrennt) von Kategorien die ignoriert werden sollen', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_cat_ignore'), ['help' => 'wpsg_mod_produktartikel_cat_ignore']); ?>
+</div>
+    
+<script>
+    
+    let el_wpsg_mod_produktartikel_cat = document.getElementById('wpsg_mod_produktartikel_cat');
+	let el_wpsg_mod_produktartikel_cat_1 = document.getElementById('wpsg_mod_produktartikel_cat_1'); 
+	
+	el_wpsg_mod_produktartikel_cat.addEventListener('change', () => {
+		
+		if (el_wpsg_mod_produktartikel_cat.checked) {
+			
+			el_wpsg_mod_produktartikel_cat_1.style.display = 'block'; 
+            
+        } else {
+			
+			el_wpsg_mod_produktartikel_cat_1.style.display = 'none'; 
+			
+        }
+		
+    });
+	
+	el_wpsg_mod_produktartikel_cat.dispatchEvent(new Event('change'));
+    
+</script>
+
 <br />
 
Index: /views/produkt/index.phtml
===================================================================
--- /views/produkt/index.phtml	(revision 8057)
+++ /views/produkt/index.phtml	(revision 8059)
@@ -5,4 +5,19 @@
 	 */
 
+    $arTermExclude = [];
+    $wpsg_mod_produktartikel_cat_first_level = false;
+    
+    if ($this->hasMod('wpsg_mod_produktartikel') && $this->get_option('wpsg_mod_produktartikel_cat')) {
+              
+        if ($this->get_option('wpsg_mod_produktartikel_cat_first_level') === '1') $wpsg_mod_produktartikel_cat_first_level = true;
+        
+        foreach (explode(',', $this->get_option('wpsg_mod_produktartikel_cat_ignore')) as $exclude_term_id) {
+            
+            if (wpsg_isSizedString($exclude_term_id)) $arTermExclude[] = trim($exclude_term_id);
+            
+        }
+        
+    }  
+    
 ?>
 
@@ -69,7 +84,16 @@
 						<?php echo wpsg_drawForm_Input('filter[s]', __('Suchfeld', 'wpsg'), wpsg_getStr($this->view['arFilter']['s'])); ?>
 
-                        <?php $filterAll = $this->view['arFilter'];
-                        	unset($filterAll['productgroup_ids']);
+                        <?php 
+                            
+                            $filterAll = $this->view['arFilter'];
+                        	
+                            unset($filterAll['productgroup_ids']);
                         	unset($filterAll['productcategory_ids']);
+                            
+                            $filterNone = $this->view['arFilter'];
+                            $filterNone['isNoCat'] = true;
+                            $filterNone['loadCat'] = false;
+                            unset($filterNone['productcategory_ids']);
+                            
                         ?>
 
@@ -80,9 +104,14 @@
                         <?php if ($this->hasMod('wpsg_mod_produktartikel')) { ?>
                         <?php
+                            
                         $temp = $this->callMod('wpsg_mod_produktartikel', 'getProductcategorySelect', array($this->view['arFilter']));
                         $arr = array();
                         foreach ($temp as $vv) $arr[$vv['term_taxonomy_id']] = $vv['label'];
+                        
                         echo wpsg_drawForm_Select('filter[productcategory_ids]', __('Produktkategorie', 'wpsg'),
-                        		wpsg_array_merge(array('-1' => wpsg_translate(__('Alle Produktkategorien (#1#)', 'wpsg'), wpsg_product::count($filterAll))),
+                        		wpsg_array_merge(array(
+                                    '-1' => wpsg_translate(__('Alle Produktkategorien (#1#)', 'wpsg'), wpsg_product::count($filterAll)),
+                                    '-2' => wpsg_translate(__('Unzugeordnet (#1#)', 'wpsg'), wpsg_product::count($filterNone))
+                                ),
                         		$arr), @$this->view['arFilter']['productcategory_ids']); ?>
                         <?php } ?>
@@ -168,4 +197,8 @@
 						<?php } */ ?>
 	
+                        <?php if ($this->hasMod('wpsg_mod_produktartikel') && $this->get_option('wpsg_mod_produktartikel_cat') === '1') { ?>
+                        <th class="wpsg_order" data-order="cat"><?php echo __('Kategorie', 'wpsg'); ?></th>
+                        <?php } ?>
+                        
 						<?php if ($this->hasMod('wpsg_mod_produktartikel') && $this->get_option('wpsg_mod_produktartikel_gtin') == '1') { ?>
 						<th class="wpsg_order" data-order="gtin-nr"><?php echo __("GTIN", "wpsg"); ?></th>						
@@ -270,5 +303,33 @@
 						</td>
 						<?php } ?>
-						<th class="wpsg_order" data-order="anr"><?php echo $oProduct->getNr(); ?></th>
+						<td><?php echo $oProduct->getNr(); ?></td>
+                        <?php if ($this->hasMod('wpsg_mod_produktartikel') && $this->get_option('wpsg_mod_produktartikel_cat')) { ?>
+                        <td>
+                            <?php
+                            
+                                $post_id = $this->callMod('wpsg_mod_produktartikel', 'getPostIdFromProductId', [$d['id']]);
+                                $post_terms = \get_the_terms($post_id, $this->get_option('wpsg_mod_produktartikel_pathkey_cat'));                   
+                                
+                                $arTermDisplay = [];
+                                
+                                foreach ($post_terms as $term) {
+                                    
+                                    if (!in_array($term->slug, $arTermExclude)) {
+                                        
+                                        if ($wpsg_mod_produktartikel_cat_first_level && $term->parent !== 0) continue;
+                                        
+                                        $arTermDisplay[] = $term->name;
+                                        
+                                    }
+                                    
+                                }
+                                
+                                asort($arTermDisplay);
+                                
+                                echo implode(', ', $arTermDisplay);
+                                
+                            ?>
+                        </td>
+                        <?php } ?>
 						<?php if ($this->hasMod('wpsg_mod_produktartikel') && $this->get_option('wpsg_mod_produktartikel_gtin') == '1') { ?>
 							<td><?php echo wpsg_hspc($d['gtin']); ?></td>
