Ich habe eine E-Commerce-Website in WordPress. Es gibt viele Produkte darin und viele Produkte fallen in mehrere Kategorien, wie z Egal ob ich durch die IT-Kategorie gehe, am Ende zeigt es mir ein Auto wie dieses Home / Shop / Industrie / Automobil / 600 mAh Power Bank. Aber ich bin über IT zu diesem Produkt gekommen, also sollte es mir so angezeigt werden Home / Shop / Industrie / IT / 600 mah Power Bank. Wie kann ich den Pfad erhalten, von dem ich von der vorherigen Seite komme?
Woocommerce Breadcrumbs mehrere Kategorien
SuRaj Schöpfer
Reich
Wenn Sie Woocommerce verwenden, können Sie Folgendes direkt verwenden, wenn nicht, muss es angepasst werden, aber Sie haben die Idee:
if (get_post_type() == 'product' && is_single() && ! is_attachment()) {
echo $prepend;
if ($terms = get_the_terms($post->ID, 'product_cat')) {
$referer = wp_get_referer();
foreach ($terms as $term) {
$referer_slug = (strpos($referer, $term->slug));
if ($referer_slug == true) {
$category_name = $term->name;
$ancestors = get_ancestors($term->term_id, 'product_cat');
$ancestors = array_reverse($ancestors);
foreach ($ancestors as $ancestor) {
$ancestor = get_term($ancestor, 'product_cat');
if (! is_wp_error($ancestor) && $ancestor) {
echo $before . '<a href="' . get_term_link($ancestor->slug, 'product_cat') . '">' . $ancestor->name . '</a>' . $after . $delimiter;
}
}
echo $before . '<a href="' . get_term_link($term->slug, 'product_cat') . '">' . $category_name . '</a>' . $after . $delimiter;
}
}
}
echo $before . get_the_title() . $after;
}
Der Hauptteil der Arbeit wird hier von erledigt wp_get_referer
die die verweisende URL des Produkts erhält, zu dem Ihr Besucher navigiert ist. Der Rest des Codes prüft, ob eine gültige Kategorie in der URL enthalten ist, und verwendet sie im Breadcrumb.
Siehe Jonathon Js Beitrag hier für weitere Informationen http://www.cryoutcreations.eu/forums/t/wrong-breadcrumbs-displayed
Aktualisierte Antwort für alle, die immer noch auf dieses Problem in einer neueren Version von WooCommerce stoßen, diese Lösung hat bei WooCommerce 3.5.4 für mich funktioniert.
Dieser Code sollte in den folgenden Dateipfad (dh ein untergeordnetes Thema) /wp-content/themes/your-child-theme/woocommerce/global/breadcrumb.php eingefügt werden
Es überschreibt den standardmäßigen WooCommerce-Breadcrumb-Code.
http://pastebin.com/raw/bemM8ZNF
/**
* Shop breadcrumb
*
* This template can be overridden by copying it to yourtheme/woocommerce/global/breadcrumb.php.
*
* HOWEVER, on occasion WooCommerce will need to update template files and you
* (the theme developer) will need to copy the new files to your theme to
* maintain compatibility. We try to do this as little as possible, but it does
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
* @author WooThemes
* @package WooCommerce/Templates
* @version 2.3.0
* @see woocommerce_breadcrumb()
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( $breadcrumb ) {
echo $wrap_before;
if ( is_single() && get_post_type() == 'product' ) {
echo $prepend;
if ( $terms = get_the_terms( $post->ID, 'product_cat' ) ) {
$referer = wp_get_referer();
$printed = array();
foreach( $terms as $term){
if(in_array($term->id, $printed)) continue;
$referer_slug = (strpos($referer, "https://stackoverflow.com/".$term->slug."https://stackoverflow.com/"));
if(!$referer_slug==false){
$printed[] = $term->id;
$category_name = $term->name;
$ancestors = get_ancestors( $term->term_id, 'product_cat' );
$ancestors = array_reverse( $ancestors );
foreach ( $ancestors as $ancestor ) {
$ancestor = get_term( $ancestor, 'product_cat' );
if ( ! is_wp_error( $ancestor ) && $ancestor )
echo $before . '<a href="' . get_term_link( $ancestor->slug, 'product_cat' ) . '">' . $ancestor->name . '</a>' . $after . $delimiter;
}
echo $before . '<a href="' . get_term_link( $term->slug, 'product_cat' ) . '">' . $category_name . '</a>' . $after . $delimiter;
}
}
}
echo $before . get_the_title() . $after;
} else {
foreach ( $breadcrumb as $key => $crumb ) {
echo $before;
if ( ! empty( $crumb[1] ) && sizeof( $breadcrumb ) !== $key + 1 ) {
echo '<a href="' . esc_url( $crumb[1] ) . '">' . esc_html( $crumb[0] ) . '</a>';
} else {
echo esc_html( $crumb[0] );
}
echo $after;
if ( sizeof( $breadcrumb ) !== $key + 1 ) {
echo $delimiter;
}
}
}
echo $wrap_after;
}
C/O: Joris Wittemann
-
Ich habe das gerade versucht, bekomme aber zwei Fehler: “Undefined variable: post” und “Trying to get property of non-object in breadcrumb.php” in Zeile 25. Irgendwelche Ideen?
– rcneil
31. Oktober 2019 um 10:36 Uhr
Ich habe den Code ein wenig überarbeitet, um eine primäre und eine verwiesene Kategorie mit unendlichen Eltern zu berücksichtigen.
Ich habe den Breadcrumb-Filter verwendet, da er ziemlich sauber ist, direkt in der Vorlage für einzelne Produkte, aber falls Sie ihn an anderer Stelle benötigen, können Sie die einzelne Bedingung verwenden.
function breadcumbs_referred_or_primary ($main, $terms)
{
// Our primary term is 520 (hardcoded)
$referer = wp_get_referer();
$referredTerm = -1;
$referredTermIndex = -1;
$primaryTermId = 520; // hardcoded
$primaryTermIndex = -1;
foreach($terms as $key => $term) {
if ($referredTerm != -1) break; // we found it in a previous iteration!
$ancestors = get_ancestors( $term->term_id, 'product_cat');
array_unshift($ancestors, $term->term_id);
if ($primaryTermIndex == -1 && in_array($primaryTermId, $ancestors)) $primaryTermIndex = $key;
foreach ($ancestors as $ancestor) {
if($referredTerm != -1) break 2; // we found it in a previous iteration!
$ancestor = get_term( $ancestor, 'product_cat' );
$referer_slug = (strpos($referer, "https://stackoverflow.com/".$ancestor->slug."https://stackoverflow.com/"));
if (!$referer_slug==false) { // it's found in the current level
$referredTerm = $term->term_id;
$referredTermIndex = $key;
}
}
}
// we return either the browsed terms or the primary term
if ($referredTermIndex != -1) {
return $terms[$referredTermIndex];
} else {
return $terms[$primaryTermIndex];
}
}
add_filter('woocommerce_breadcrumb_main_term', 'breadcumbs_referred_or_primary', 10, 2);
Dmitri
Meine Lösung ist:
if (!empty($breadcrumb)) {
echo $wrap_before;
if (is_single() && get_post_type() == 'product') {
$breadcrumb_diff = [];
$breadcrumb_diff[] = $breadcrumb[0];
if ($terms = get_the_terms($post->ID, 'product_cat')) {
$referer = wp_get_referer();
$site_url = site_url();
$referer = str_replace($site_url . '/zoomagazin/', '', $referer);
$referer_array = explode("https://stackoverflow.com/", $referer);
foreach ($referer_array as $term_slug) {
$get_term_by_slug = get_term_by('slug', $term_slug, 'product_cat');
$breadcrumb_diff[] = [$get_term_by_slug->name, get_term_link($term_slug, 'product_cat')];
}
$breadcrumb_diff[]= $breadcrumb[count($breadcrumb) - 1];
foreach ($breadcrumb_diff as $key => $crumb) {
echo $before;
if (!empty($crumb[1]) && sizeof($breadcrumb_diff) !== $key + 1) {
echo '<a href="' . esc_url($crumb[1]) . '">' . esc_html($crumb[0]) . '</a>';
} else {
echo esc_html($crumb[0]);
}
echo $after;
if (sizeof($breadcrumb) !== $key + 1) {
echo $delimiter;
}
}
}
} else {
foreach ($breadcrumb as $key => $crumb) {
echo $before;
if (!empty($crumb[1]) && sizeof($breadcrumb) !== $key + 1) {
echo '<a href="' . esc_url($crumb[1]) . '">' . esc_html($crumb[0]) . '</a>';
} else {
echo esc_html($crumb[0]);
}
echo $after;
if (sizeof($breadcrumb) !== $key + 1) {
echo $delimiter;
}
}
}
echo $wrap_after;
}
Das Produkt ist also in 2 Kategorien? Es gibt keinen Weg für
get_categories()
um zu wissen, welche Kategorie Ihrer Meinung nach angezeigt werden sollte.– Helgathewikinger
6. Dezember 2014 um 13:01 Uhr
@helgatheviking Wenn ich Automobil auswähle, sollte es Automobil und für dasselbe Produkt anzeigen, wenn ich IT auswähle, sollte es IT anzeigen
– SuRaj Schöpfer
12. Dezember 2014 um 9:01 Uhr
Ich bin mir nicht 100 % sicher, ob ich das verstehe, aber meine beste Vermutung wäre: Fügen Sie auf der Kategorieseite einen Parameter zu den Produkt-URLs hinzu, um ihre Quelle zu identifizieren. ex:
mysite.com/product/some-product?src=automobile
. Wenn Sie dann auf der einzelnen Produktseite nach “irgendeinem Produkt” suchen, überprüfen Sie dies$_GET
-Variable und verwenden Sie sie, um den Breadcrumb festzulegen.– Helgathewikinger
12. Dezember 2014 um 19:04 Uhr
Um die Idee von @helgatheviking zu ergänzen. Stellen Sie sicher, wenn Sie durch die passieren
$_GET
-Variable zurück, um anzuzeigen, dass Sie die Eingabe bereinigen, bevor Sie sie auf dem Bildschirm anzeigen, oder Sie öffnen Ihre Website XSS– Rebecca Dessonville
24. Januar 2015 um 3:30 Uhr