为什么要重写
wordpress 自身的 permalink 对 SEO 非常不友好,我抓取了不同关键词在 Gooogle 的搜索列表,发现一个良好的 URL 是要基本的范式的,不能太长,也不能太短,有基本的语义,wordpress 的URL的自定义样式就只有几种,如果想用更多的,就要买插件,相关插件一年一个站点接近 60 欧元,所以我决定自己实现。
URL常见的格式
上面这些是系统自带的,基本上没有一个是 URL 友好的,我用 WooCommerce 卖发布产品,对于产品的自定义 URL,就更少,我想实现产品详情页面的 URL如下:
https://www.qishiya.com/product-detail/How-To-Diy-Yoke-For-Model3_1600793866871.html
这个商品详情页面的 URL 有如下几个优点:
- 简短
- 结构清晰
- 有语义。
product-detail 这个结构,明确了是一个商品详情页面。
How-To-Diy-Yoke-For-Model3 明确了语义。
整体URL的字符在某一个范围里面。
怎么实现
首先要设计一下你的所有URL,因为一旦提交到搜索引擎,你要变更的成本有点大,以实现如下的 URL 为例:
https://www.qishiya.com/product-detail/How-To-Diy-Yoke-For-Model3_1600793866871.html
设计完成之后,如果不用插件,那就是按如下要求更改代码就可以。
修改Nginx
location / {
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$args;
}
这样就支持了rewrite 的所有配置。
添加重写规则并刷新
function custom_rewrite_rules($rules) {
$newrules = array();
$newrules['product-detail/(.+?)_(\d+)\.html$'] = 'index.php?post_type=product&p=$matches[2]';
return $newrules + $rules;
}
add_filter('rewrite_rules_array', 'custom_rewrite_rules');
// 刷新permalinks规则
add_action( 'admin_init', 'flush_rewrite_rules_123' );
function flush_rewrite_rules_123() {
flush_rewrite_rules();
}
添加permalink生成函数
function custom_woocommerce_product_post_type_link( $permalink, $post ) {
// 只针对商品修改永久链接
if ( $post->post_type !== 'product' || empty($permalink) ) {
return $permalink;
}
$timestamp = $post->ID;
$product_name = get_the_title( $post );
// 获取商品名称
$product_name = explode( ' ', $product_name );
$product_name = array_slice( $product_name, 0, 6 );
$product_name = implode( ' ', $product_name );
// 构建自定义URL
$permalink = trailingslashit( home_url( '/product-detail/' . $product_name . '_' . $timestamp . '.html' ) );
// 替换 URL 中的空格
$permalink = str_replace( ' ', '-', $permalink );
$permalink = trim( $permalink, '/' );
// 构建自定义URL
//$permalink = trailingslashit( home_url( '/product-detail/' . $product_name . '_' . $timestamp . '.html' ) );
return $permalink;
}
add_filter( 'post_type_link', 'custom_woocommerce_product_post_type_link', 10, 2 );
注意事项
- 代码我统一放到了Code Snippets 这个插件下统一管理,而不是直接修改主题。
- 添加了规则一定要刷新规则,是用代码刷新。
- 对于重写规则的性能我还没有太多的关注,因为我的机器是物理机,暂时发现没有什么影响。