分享笔记:

删除WooCommerce商店的产品链接

删除/product-category/和/product/

文章目录

之前和大家讲过如何去除文章分类链接自带的/category/,这里跟大家说一下相同的操作,不过是针对WooCommerce的产品(/product/)和产品分类(/product-category/)

更改WooCommerce商店的产品链接

WooCommerce自带的产品链接设置

当你安装WooCommerce来做一个基于WordPress的在线商店时,你的产品链接是这样的:

  • https://jhchen.top/product/产品名/

以及产品分类是这样的,包括产品标签:

  • https://jhchen.top/product-category/分类名/
woocommerce固定链接
woocommerce固定链接

产品分类,标签以及产品链接(自定义基础链接)这些都是可以自定义的,你可以随意修改,不过你是不能删除留白的,它们默认文本就是/product-category/和/product/

也就是说,即使你在固定链接里把字段留空,你的分类URL也还是会包含:

  • https://jhchen.top/product-category/分类名/
  • https://jhchen.top/product-tag/标签名/

这种方法是不能去掉那个多余的 /product-category/ 和 /product-tag/,它完全没有任何作用。

产品的 /producto/ 也是无法更改的。

为什么不能删除这些链接?

首先我要告诉你,我并不知道一个必需删除这些链接的强有力理由,除了能有更短的链接之外。这确实对搜索引擎优化有一些好处,不过我之前也说过,这个帮助并不大。

我甚至都不建议你们删除这些链接。

WooCommerce 的开发者 Automattic 也在他们的github文档里说过不建议这样做。这也就是为什么在固定链接不能删除WooCommerce自动设置的链接原因,如果产品的链接和 WordPress 的文章或页面的链接一样的话,这些文章或页面就访问不了了,因为访问该URL时将会跳转到产品页面。

什么时候删除自带的链接?

如果你决定更改自己网站上的链接的话,一定要想清楚,最好在一开始做网站时就确定这些事情,然后不要再改了,因为如果不做好(特别是在设置重定向时),可能会导致404错误,内容不被搜索引擎抓取索引等问题,给搜索引擎排名带来麻烦。

以上是免责声明,现在我们来看看如何进行更改。

删除自带的 /product-category/ 和 /product/

我们刚刚在上面也看到了,通过WordPress后台的固定链接设置删除不了这些链接,那么最简单的方法肯定是用插件啊,你还在期待什么别的?

这次我们就用 Premmerce Permalink Manager,它是一款专门给WooCommerce使用的插件,而且是完全免费的。它可以帮我们删除产品的 /product/ 和产品分类的 /product-category/ ,不过标签的 /product-tag/ 删不掉。

Premmerce Permalink Manager
Premmerce Permalink Manager 插件

下载安装插件后直接启用就行了,它会自动帮你跳到下面的页面,没有的话也不难找,左侧面板会多一个叫“Premmerce”的界面,就这儿。

删除产品链接

想要删除分类的 /product-category / 选择第二个选项 “Category slug”

删除woocommerce category slug

想要删除产品的 /product/ 选择第二个选项 “Product slug”

删除woocommerce product slug

自动生成的重复内容页面

你要是做了上面的操作可以去看看产品和分类,它们确实都删除掉了之前自带的链接变成了这样:

  • https://jhchen.top/产品名/
  • https://jhchen.top/产品分类名/

可你输入原地址也看看:

  • https://jhchen.top/product/产品名/
  • https://jhchen.top/product-category/分类名/

你会发现这些页面也都还在,有两个链接有着相同的内容,这个叫重复内容或重复页面,对搜索引擎优化是不利的。不过这个插件也是挺智能的,它会对之前的链接加上 rel=canonical 标签指向新链接,这个的意思你可以看看这篇重复内容对搜索引擎优化的影响,你也可以选择对旧链接做个301重定向到新链接。

Premmerce Permalink Manager 页面添加canonical

如果它没有自动加上canonical标签,你把下面这个设置点上,就在你刚刚设置链接的下面。

Premmerce Permalink Manager 插件add canonical

用代码删除自带链接

这个方法不知道有没有人用,因为大多数人都是选择直接用插件,不过我放这了。复制到你的主题function.php或者用代码插件来插入。

/* 删除WooCommerce产品链接 */
function jhchen_delete_slug_product( $post_link, $post, $leavename ) {
if ( 'product' != $post->post_type || 'publish' != $post->post_status ) {
return $post_link;
}
$post_link = str_replace( '/product/', '/', $post_link );
return $post_link;
}
add_filter( 'post_type_link', 'jhchen_delete_slug_product', 10, 3 );
function change_slug_struct( $query ) {
if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
return;
}
if ( ! empty( $query->query['name'] ) ) {
$query->set( 'post_type', array( 'post', 'product', 'page' ) );
} elseif ( ! empty( $query->query['pagename'] ) && false === strpos( $query->query['pagename'], '/' ) ) {
$query->set( 'post_type', array( 'post', 'product', 'page' ) );
$query->set( 'name', $query->query['pagename'] );
}
}
add_action( 'pre_get_posts', 'change_slug_struct', 99 );

删除产品分类的有点特别,我们要在产品基本类别加一个点,然后再加下面的代码。

/*  删除WooCommerce产品分类链接 */
add_filter( 'request', function( $vars ) {
global $wpdb;
if( ! empty( $vars['pagename'] ) || ! empty( $vars['category_name'] ) || ! empty( $vars['name'] ) || ! empty( $vars['attachment'] ) ) {
$slug = ! empty( $vars['pagename'] ) ? $vars['pagename'] : ( ! empty( $vars['name'] ) ? $vars['name'] : ( !empty( $vars['category_name'] ) ? $vars['category_name'] : $vars['attachment'] ) );
$exists = $wpdb->get_var( $wpdb->prepare( "SELECT t.term_id FROM $wpdb->terms t LEFT JOIN $wpdb->term_taxonomy tt ON tt.term_id = t.term_id WHERE tt.taxonomy = 'product_cat' AND t.slug = %s" ,array( $slug )));
if( $exists ){
$old_vars = $vars;
$vars = array('product_cat' => $slug );
if ( !empty( $old_vars['paged'] ) || !empty( $old_vars['page'] ) )
$vars['paged'] = ! empty( $old_vars['paged'] ) ? $old_vars['paged'] : $old_vars['page'];
if ( !empty( $old_vars['orderby'] ) )
$vars['orderby'] = $old_vars['orderby'];
if ( !empty( $old_vars['order'] ) )
$vars['order'] = $old_vars['order']; 
}
}
return $vars;
});

为笔记评分

平均评分 5 / 5. 摘星者: 2

有疑问?留个言吧!

更多结果...

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors

更多结果...

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors