8

我有一个使用 woocommerce 的 WordPress 网站(在内部页面中),我的商店页面 URL 结构如下:

我的网站/商店/

woocommerce 页面上的面包屑仅显示主页链接,例如:您在这里:主页

和我的产品页面网址:

Mysite/product-category/category_name/

我的商店页面面包屑显示如下:

You are here: Home 

我的类别页面面包屑也显示如下:

You are here: Home

我需要让它显示为:

你在这里:家 / 购物 / category_name

我检查了永久链接选项,但似乎还可以。我检查了 breadcrumb.php 模板文件,它似乎认为 shop() 页面是我网站的主页。

我该如何解决这个问题,我应该编辑 breadcrumb.php 还是我的设置有错误?提前致谢。

4

4 回答 4

13

对于在 2019 年偶然发现此问题的任何人,如果您不想更改永久链接或编辑主题文件,有一种更简单的方法可以在“主页”面包屑之后添加项目。这可能不是一个完美的解决方案,但它对我有用。

WC_Breadcrumb 类在返回面包屑之前对其进行过滤,我们可以挂钩并修改数组。$crumbs 数组只是 [ [title, url], [title, url] ] 的数组

add_filter( 'woocommerce_get_breadcrumb', function($crumbs, $Breadcrumb){
        $shop_page_id = wc_get_page_id('shop'); //Get the shop page ID
        if($shop_page_id > 0 && !is_shop()) { //Check we got an ID (shop page is set). Added check for is_shop to prevent Home / Shop / Shop as suggested in comments
            $new_breadcrumb = [
                _x( 'Shop', 'breadcrumb', 'woocommerce' ), //Title
                get_permalink(wc_get_page_id('shop')) // URL
            ];
            array_splice($crumbs, 1, 0, [$new_breadcrumb]); //Insert a new breadcrumb after the 'Home' crumb
        }
        return $crumbs;
    }, 10, 2 );
于 2019-04-01T22:57:55.733 回答
10

我正在调试这个,不幸的是 Woocommerce (ver. 2.3.8) 没有使用任何钩子来直接调整面包屑数组。因此,如果您想修改显示的面包屑而不更改永久链接结构,最好将面包屑模板文件从插件 ( /woocommerce/templates/global/breadcrumb.php) 复制到您的主题 ( /theme_name/woocommerce/global/) 中,然后在输出循环开始之前添加代码以包含链接。我只针对产品类别、标签和详细信息执行此操作,但您可以根据需要添加其他条件。

<?php
/**
 * Shop breadcrumb
 *
 * @author      WooThemes
 * @package     WooCommerce/Templates
 * @version     2.3.0
 * @see         woocommerce_breadcrumb()
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

if ( $breadcrumb ) {

    // add shop home url to breadcrumbs
    if( is_product_category() || is_product_tag() || is_product() ) {
        $shop_page_id = wc_get_page_id( 'shop' );
        $shop_home_arr = array( get_the_title($shop_page_id), get_permalink($shop_page_id));

        // insert to breadcrumbs array on second position
        array_splice($breadcrumb, 1, 0, array($shop_home_arr));
    }

    echo $wrap_before;

    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;
}
于 2015-06-04T22:46:55.057 回答
5

这可以更容易地完成。只需要相应地更改永久链接设置 - 如 github 上的issue 3145所述:

满足这个标准:

// If permalinks contain the shop page in the URI prepend the breadcrumb with shop 
if (
  $shop_page_id
  && strstr( $permalinks['product_base'], '/' . $shop_page->post_name )
  && get_option( 'page_on_front' ) !== $shop_page_id
 ) {
   $prepend = $before 
     . '<a href="' . get_permalink( $shop_page ) . '">' 
     . $shop_page->post_title . '</a> ' 
     . $after . $delimiter;
 }

否则它永远不会放在前面。

要应用这个必须去:

→ WordPress 后端 → 设置 → 固定链接

并将 woocommerce 永久链接设置设置为以下之一:

  • 店铺基地
  • 带类别的商店基地
  • 定制基地

如果使用后者,则必须在前面加上 slug »/shop/...«。

有一个问题 6584

警告:preg_match():wc-core-functions.php 中第 533 行的未知修饰符 't'

例如,如果 »Custom Base« 看起来像这样:»/shop/product/...«,就会发生这种情况。有一个修复它的提交,它在 master 中可用,但不是 2.2.8。

slug part shop 也可以用其他东西代替,例如本地化的东西。

于 2014-11-05T13:11:35.493 回答
1

我发现面包屑代码在我的 Courture 主题文件夹的 header.php 中,并且该主题的作者没有为产品或产品类别页面编写代码,所以我添加了

elseif (is_single() && get_post_type() == 'product'){   
$posts_page_id = get_option('page_for_posts');
$posts_page_url = get_permalink($posts_page_id); 
echo '<li>';$bar = "shopping";
if(get_option_tree('blog_name', '', false))
/*$bar=get_option_tree('blog_name', '', false);*/ 
echo "<a href=".home_url()."/shopping/>$bar</a></li>";
echo "<li>";
the_title();
echo"</li>";
}

和产品类别页面

if (is_tax()) { 
$posts_page_id = get_option('page_for_posts');
$posts_page_url = get_permalink($posts_page_id); 
echo '<li>';$bar = "Shopping";
if(get_option_tree('blog_name', '', false)) 
echo "<a href=".home_url()."/shopping/>$bar</a> > </li>" ; 
echo "<li>"; 
woocommerce_page_title(); 
echo"</li>";}

我评论了获取 blog_name 的行,因为我为我的商店使用自定义页面而不是 woocommerce 默认页面。我不知道是否有另一种方法可以做到这一点,但我注意到这个主题中的大多数代码即使在小部件 css 中也不是很专业,这是一个糟糕的选择。

于 2013-07-08T22:04:29.313 回答