wordpress 怎么样重写 URL

为什么要重写

wordpress 自身的 permalink 对 SEO 非常不友好,我抓取了不同关键词在 Gooogle 的搜索列表,发现一个良好的 URL 是要基本的范式的,不能太长,也不能太短,有基本的语义,wordpress 的URL的自定义样式就只有几种,如果想用更多的,就要买插件,相关插件一年一个站点接近 60 欧元,所以我决定自己实现。

URL常见的格式

20240306TLMZbU

上面这些是系统自带的,基本上没有一个是 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 );

注意事项

  1. 代码我统一放到了Code Snippets 这个插件下统一管理,而不是直接修改主题。
  2. 添加了规则一定要刷新规则,是用代码刷新。
  3. 对于重写规则的性能我还没有太多的关注,因为我的机器是物理机,暂时发现没有什么影响。

发表评论