new*_*mer 7 wordpress wordpress-theming woocommerce
我有一个WordPress网站,使用woocommerce(在内部页面),我的网页结构如下:
mysite的/店/
woocommerce页面上的痕迹只显示主页链接:您在这里:主页
和我的产品页面网址:
MYSITE /产品类别/ CATEGORY_NAME /
我的店铺面包屑显示如下:
You are here: Home
Run Code Online (Sandbox Code Playgroud)
我的类别页面痕迹显示如下:
You are here: Home
Run Code Online (Sandbox Code Playgroud)
我需要把它显示为:
你在这里:主页/购物/ category_name
我检查了永久链接选项,但似乎没问题.我检查了breadcrumb.php模板文件,似乎认为shop()页面是我网站的主页.
如果我编辑breadcrumb.php或我的设置中有错误,我该如何解决这个问题?提前致谢.
Seb*_*mbs 12
对于在 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 );
Run Code Online (Sandbox Code Playgroud)
我正在调试这个,不幸的是Woocommerce(版本2.3.8)没有使用任何钩子来直接调整breadcrumbs数组.因此,如果您想要修改显示的面包屑而不更改固定链接结构,最好将breadcrumbs模板文件从plugin(/woocommerce/templates/global/breadcrumb.php)复制到您的theme(/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;
}
Run Code Online (Sandbox Code Playgroud)
这可以更容易地完成。只需要相应地更改永久链接设置 - 正如在 github 上的issue 3145 中提到的:
满足以下条件:
Run Code Online (Sandbox Code Playgroud)// 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也可以用其他东西代替,例如本地化的东西。
我发现面包屑代码位于我的 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>";
}
Run Code Online (Sandbox Code Playgroud)
以及产品类别页面
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>";}
Run Code Online (Sandbox Code Playgroud)
我评论了获取 blog_name 的行,因为我为我的商店使用自定义页面而不是 woocommerce 默认页面。我不知道是否有另一种方法可以做到这一点,但我注意到这个主题中的大多数代码都不是很专业,即使在小部件 CSS 中也是如此,这是一个糟糕的选择。