Woocommerce Breadcrumbs mehrere Kategorien

Lesezeit: 6 Minuten

Benutzer-Avatar
SuRaj Schöpfer

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?

  • 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

Benutzer-Avatar
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);

Benutzer-Avatar
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;

}

1352500cookie-checkWoocommerce Breadcrumbs mehrere Kategorien

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy