summaryrefslogtreecommitdiff
path: root/views
diff options
context:
space:
mode:
authorRoger Rehnelt <noreply@maennchen1.de>2026-10-03 13:15:56 +0200
committerRoger Rehnelt <noreply@maennchen1.de>2026-10-03 13:15:56 +0200
commit9518f19b14011be59983110c806980820e049b7c (patch)
treec78f09912dc06e754e1d5cd5d3b8c80e450b8db3 /views
parentc46dd213226ac8b077a27def76205f7e3ffeb42a (diff)
Produktseite: Brotkrumen im Modus „neu“
Start, Kategorie und Produkt über dem Produkt. Steht das Produkt in mehreren Kategorien, zeigt sie die, von der der Besucher kam, sonst die erste. Ähnliche Produkte bekommen keine. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'views')
-rw-r--r--views/css/wpsg-theme.css4
-rw-r--r--views/js/frontend.js41
-rw-r--r--views/produktseite/produkt.phtml10
3 files changed, 54 insertions, 1 deletions
diff --git a/views/css/wpsg-theme.css b/views/css/wpsg-theme.css
index 23f6942..2d9ac93 100644
--- a/views/css/wpsg-theme.css
+++ b/views/css/wpsg-theme.css
@@ -317,6 +317,10 @@
.wpsg_productform :where(.wpsg_produkt_wrapper .wpsg_produkt_preishinweis) { font-size:0.75em; }
.wpsg_productform :where(.wpsg_produkt_wrapper .wpsg_mod_productview_oldprice), .product_wrap :where(.productdetails .oldprice) { text-decoration:line-through; }
.wpsg_productform :where(.wpsg_produkt_wrapper .wpsg_mod_productview_price) { font-weight:bold; }
+.wpsg-product :where(.wpsg-product__breadcrumbs) { margin:0 0 var(--wpsg-gap); font-size:var(--wpsg-font-size-small); }
+.wpsg-product :where(.wpsg-product__breadcrumbs ol) { display:flex; flex-wrap:wrap; gap:0.25em 0.5em; margin:0; padding:0; list-style:none; }
+.wpsg-product :where(.wpsg-product__breadcrumbs li + li)::before { content:"/" / ""; margin-right:0.5em; opacity:var(--wpsg-muted-opacity); }
+.wpsg-product :where(.wpsg-product__breadcrumbs a, .wpsg-product__breadcrumbs [aria-current]) { color:inherit; opacity:var(--wpsg-muted-opacity); }
.wpsg-product :where(.wpsg-product__main) { display:flex; flex-wrap:wrap; align-items:flex-start; gap:calc(var(--wpsg-gap) * 2.5); }
.wpsg-product :where(.wpsg-product__media) { flex:1 1 22rem; min-width:0; float:none; margin:0; }
.wpsg-product :where(.wpsg-product__media .wpsg_produkt_produktbilder) { max-width:none; }
diff --git a/views/js/frontend.js b/views/js/frontend.js
index bfae2ea..fb3bdac 100644
--- a/views/js/frontend.js
+++ b/views/js/frontend.js
@@ -241,3 +241,44 @@
media.querySelectorAll('.wpsg-product__thumb').forEach(function(button) { button.setAttribute('aria-pressed', ((button === thumb)?'true':'false')); });
} );
+
+ /**
+ * Brotkrumen der Produktseite im Modus „neu“: die Kategorie, von der der Besucher kam (Punkt 8.4)
+ *
+ * Der Server gibt die erste Kategorie aus, damit die Seite für Seiten-Caches gleich bleibt.
+ */
+ function wpsg_productBreadcrumbs() {
+
+ if (!document.referrer) return;
+
+ var referrer = document.referrer.split(/[?#]/)[0].replace(/\/page\/\d+\/?$/, '/').replace(/\/?$/, '/');
+
+ document.querySelectorAll('.wpsg-product__breadcrumbs[data-wpsg-trails]').forEach(function(nav) {
+
+ var trails = JSON.parse(nav.getAttribute('data-wpsg-trails'));
+ var trail = trails.find(function(t) { return (t[t.length - 1].url.replace(/\/?$/, '/') === referrer); });
+ if (!trail) return;
+
+ var list = nav.querySelector('ol');
+ list.querySelectorAll('.wpsg-product__crumb-category').forEach(function(li) { li.remove(); });
+
+ trail.forEach(function(crumb) {
+
+ var li = document.createElement('li');
+ var a = document.createElement('a');
+ li.className = 'wpsg-product__crumb-category';
+ a.href = crumb.url;
+ a.textContent = crumb.name;
+ li.appendChild(a);
+ list.insertBefore(li, list.lastElementChild);
+
+ } );
+
+ } );
+
+ } // function wpsg_productBreadcrumbs()
+
+ if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', wpsg_productBreadcrumbs); else wpsg_productBreadcrumbs();
+
+ // Der Variantenwechsel ersetzt das Produkt per Ajax
+ jQuery(document).ajaxComplete(wpsg_productBreadcrumbs);
diff --git a/views/produktseite/produkt.phtml b/views/produktseite/produkt.phtml
index e8c83ae..24534ff 100644
--- a/views/produktseite/produkt.phtml
+++ b/views/produktseite/produkt.phtml
@@ -19,6 +19,9 @@
$oProduct = $this->view['oProduct'];
if (($this->view['data']['product_key']??'') !== '') $oProduct->setProductKey($this->view['data']['product_key']);
+ // Ähnliche Produkte usw. stehen im Hauptprodukt; nur das Hauptprodukt bekommt die Brotkrumen
+ $bMainProduct = \wpsg\ProductPage::isMain(\wpsg\ProductPage::enter(), (bool)$this->noReleatedProducts);
+
?>
<div class="wpsg_produkt_wrapper wpsg-product">
@@ -26,6 +29,10 @@
<input type="hidden" name="wpsg_post_id" value="<?php echo get_the_ID(); ?>" />
<input type="hidden" name="titleDisplayed" value="<?php echo $this->titleDisplayed; ?>" />
+ <?php if (!$bMainProduct) { ?><input type="hidden" name="wpsg_sub_product" value="1" /><?php } ?>
+
+ <?php if ($bMainProduct) echo \wpsg\ProductPage::breadcrumbs($oProduct); ?>
+
<div itemscope itemtype="http://schema.org/Product" class="wpsg_produkt wpsg_produkt_<?php echo $this->view['data']['id']; ?>">
<meta itemprop="name" content="<?php echo wpsg_hspc($oProduct->getProductName()); ?>" />
@@ -393,4 +400,5 @@
<?php $this->callMods('product_bottom_end', array(&$this->view['data']['product_key'], $this->getTemplateIndex())); ?>
-</div> \ No newline at end of file
+</div>
+<?php \wpsg\ProductPage::leave(); ?>