现在才发现设置的固定链接有问题

  • A+
所属分类:建博笔记

在说这个问题之前请允许我先讲两个东西:wordpress常用的固定链接设置方式及其利弊、关于固定链接中的“category”前缀。

 

wordpress常用的固定链接设置方式及其利弊

wordpress默认提供了以下几种常用的固定链接设置方式:

  • 朴素:https://isdola.com/?p=123
  • 日期和名称型:https://isdola.com/2018/09/24/sample-post/
  • 月份和名称型:https://isdola.com/2018/09/sample-post/
  • 数字型:https://isdola.com/archives/123
  • 文章名:https://isdola.com/sample-post/
  • 自定义结构:https://isdola.com[自定义标签]

自定义标签可以是下面这些:

%year%%monthnum%%day%%hour%%minute%%second%%post_id%%postname%%category%%author%

 

通常情况下,固定链接的设置应遵循以下几个原则:

  1. 不要让日期出现在固定链接里面,因为这会让搜索引擎认为你的文章是很早之前发布的,文章很旧了
  2. 不要让分类的链接出现在固定链接里面,这个我不太懂为什么
  3. 链接不要太深,链接太深对搜索引擎来说不友好
  4. 链接中不要出现中文,虽说搜索引擎能识别中文链接,但是从优化的角度来说不建议使用中文而且链接看上去也会不美观
  5. 文章最后可以加一个.html,一是伪静态URL搜索引擎容易收录,二是用户已经习惯了带.html的网址

 

常用的设置方式一般有两种:

  • /%postname%.html

这种方式设置起来比较麻烦,因为在编辑文章时需要手动给每篇文章设置链接,通常情况下都是将标题翻译成英文(或拼音)以此来作为文章的链接,当文章多了以后URL容易重复,而且对于英文不好的我来说翻译是一件脑瓜疼的事。

  • /%post_id%.html

相比之下,这种方式设置起来就简单多了,因为根本不需要设置,每次发布一篇新文章时,wordpress会自动分配一个唯一的id给这篇文章。而且这种方式十分简短、好记、易用,也易于复制网址,文章多了之后也不怕URL重复。

从SEO优化的角度来说,这两种设置方式没有本质上的区别,但也有部分博主认为/%post_id%形式要比/%post_id%形式好,理由是搜索引擎可以更进一步的从这个链接来识别文章的主要内容。这个就仁者见仁,智者见智吧。

目前我使用的是/%post_id%.html这种形式的固定链接。

 

关于固定链接中的“category”前缀

默认情况下,当我们设置好固定链接后,在前台点击某篇文章时,这篇文章的固定链接看上去应该是类似这样的:https://isdola.com/123.html,而点击某个分类时,这个分类的固定链接看上去应该是类似这样的:https://isdola.com/category/soft。

其中:123是这篇文章的ID,soft是“软件”分类的别名。

可以明显看到,在分类链接中多了一个category前缀,这个前缀是wordpress帮我们加上去的,只要你设置的固定链接不是默认的形式,那么在点击某个分类后,就会在这个分类的前面出现这个前缀。wordpress这样做的目的是为了担心博主在后台编辑、整理文章和分类时,不小心删光了分类导致文章找不到“归宿”,从而造成数据丢失。

看起来不错,但是多了这个前缀后,这个链接就会变的很长,而且看上去也很不美观。从SEO的角度来说,搜索引擎也希望你的链接简洁明了,于是网上就出现了使用代码或插件的方法来去除这个前缀。

  • 方法一:修改固定链接设置

操作方法:依次点击设置--固定链接,找到分类目录前缀,在其后面的输入框内输入.(英文状态下的句号)

优点:设置简单,老少皆宜,不需要修改代码,也不需要安装插件,升级时也不影响,不会增加运行负担,适用于初建成的博客或刚打算使用固定链接的博客。

缺点:原链接无法打开,出现404错误。对于被搜索引擎收录良好或分类链接有较多外链链入的博客会损失大量外链及权重。因此不建议使用这种方法。

  • 方法二:修改wordpress函数

wordpress3.2之前版本操作方法:

在程序目录wp-includes/category-template.php文件中搜索代码

  1. $catlink = $wp_rewrite->get_category_permastruct();

在其下面添加代码

  1. $catlink = str_replace('/category', "", $catlink);

保存即可。

wordpress3.2及其之后版本操作方法:

在程序目录wp-includes/category-template.php文件中搜索代码块

  1. function get_category_link( $category )

在这段代码块最后的

  1. return $category;

语句之前添加代码

  1. $category = str_replace('/category', "", $category);

然后保存。

优点:仅加入一段代码,性能影响忽略不计,适用于对代码稍熟悉的博客。

缺点:程序升级后需要重新修改代码,且原地址仍可以访问,或会造成谷歌网站管理员工具里提到的,重复的标题。因此也不推荐这种方法。

  • 方法三:借助wordpress插件

插件一:WP No Category Base

作者iDope,是为去除固定链接中分类链接里的category而开发出来的一款wordpress插件,被下载近5万次。安装启用此插件后,对原来的分类地址做了301跳转,对SEO优化有好处,把降权风险降到最低。

插件二:No category parents

作者milardovich,插件一的升级版,不仅能去掉分类链接的前缀category,还能去掉父分类 parent-category。例如能把“/category/parent-category/my-category/”换成“/my-category/”形式。

两款插件可以直接在插件安装界面搜索下载,安装完成后启用即可,无需设置也没有相关的设置选项,启用后记得去固定链接界面重新点一下保存按钮。

优点:适用于新老博客,不需要修改代码,也没有升级时的后顾之忧。通过301跳转把原链接跳转到新链接上,最大程度防止搜索引擎降权,防止原链接打不开。

不足:插件或许会造成空间负担。这里不说是缺点是因为造成的“空间负担”微乎其微,不应该是缺点。强迫症的童鞋不推荐使用。

 

我所遇到的固定链接问题

讲完了上面两个东西,接下来就讲讲我在设置固定链接后遇到的问题吧。

在建博初期,我就已经将固定链接的格式设置成了/%post_id%这种形式,点击具体的某篇文章时,对应的地址是类似isdola.com/123.html这样的,一直以来没什么问题。只是当我点击分类目录时,才发现遇到了问题。具体的情况是这样的:

我的博客有几个分类目录,其中有一个分类目录叫影视资源(movies)。在这个分类下,又设置了动漫(anime)、电影(movie)、电视剧(television)、专题合集(union)四个子分类。同时,我使用的主题的设置选项里有一个“不显示分类链接中的"category"”的选项,我勾选了这个选项。当我点击上面的影视资源这个分类和其下面的四个子分类以其具体的某篇文章时,看到的固定链接地址分别是这样的:

  • 影视资源:https://isdola.com/movies/
  • 动漫:https://isdola.com/anime/
  • 电影:https://isdola.com/movies/movie/
  • 电视剧:https://isdola.com/television/
  • 专题合集:https://isdola.com/union/
  • 具体的文章:https://isdola.com/123.html

我发现电影这个子分类的固定链接格式和另外三个子分类的固定链接的格式不一致,在其别名movie前多了一个父分类movies前缀(也可以说是那三个子分类的固定链接格式与电影子分类的固定链接格式不一致,少了父分类movies前缀)。

一开始以为是哪里没设置好才出错,可是不论我怎么设置怎么弄都没弄一致(当时还没想到用插件)。后来猜想是不是主题选项里的那个选项有什么问题,导致链接替换不一致,尝试着看了相关的代码,无奈看不懂,不明白,就没有继续再深究代码方面的问题。

后来请教了一下群里的各位大神,大神们也帮忙出谋划策,甚至帮我远程查看,问题依旧没有得到很好的解决。但是大神提出来让我试试插件no category base wpml(与前面提到的插件名字不太一样),我试着用了一下这个插件,同时取消了主题选项里的那个设置选项,这个问题居然解决了。用了插件后,上面的地址分别变成了:

  • 影视资源:https://isdola.com/movies/
  • 动漫:https://isdola.com/anime/
  • 电影:https://isdola.com/movie/
  • 电视剧:https://isdola.com/television/
  • 专题合集:https://isdola.com/union/
  • 具体的文章:https://isdola.com/123.html

也就是说这个插件在去掉cagegory前缀的同时把父分类的前缀movies也一并去掉。这样一来问题就已经解决了。但是我心里别扭,一方面是觉得既然主题已经集成了这个功能,那我为什么还要多安装一个插件呢,这样功能就重复了,而且我也不是很喜欢安装太多的插件。另一方面是因为这样的固定链接格式与其他文章类型的固定链接格式不一致。比如,视频(video)这个文章类型,我在其下面建了一个叫视听盛宴(avonline)的分类,在这个分类下又新建了纯音乐(absolutemusic)、流金岁月(goldentimes)、翻唱歌曲(coveredmusic)、影视漫金曲(greathit)四个子分类,他们的固定链接格式分别是:

  • 视听盛宴:https://isdola.com/videos/avonline/
  • 纯音乐:https://isdola.com/videos/absolutemusic/
  • 流金岁月:https://isdola.com/videos/goldentimes/
  • 翻唱歌曲:https://isdola.com/videos/coveredmusic/
  • 影视漫金曲:https://isdola.com/videos/greathit/
  • 视频文章类型下的具体的文章:https://isdola.com/video/192.html

Ps:分类目录前缀之所以是videos而不是video是因为主题有一个设置自定义文章类型分类前缀的功能,我设置“视频”固定链接前缀是video,“视频分类”固定链接前缀是videos

可以看到普通的日志文章类型的分类目录固定链接格式与自定义的视频文章类型的分类目录固定链接格式不一致,同样是二级目录,一个有前缀,一个没有前缀。于是我又想让普通的日志文章类型的二级目录也加上前缀。

因为上面的这两个原因使我一直耿耿于怀,而我也不会改插件,于是索性就把这个插件给删了。删了以后链接的问题就又回到了原来最初时的样子。后来,我又回去看了一下这个插件,发现这个插件只有两个PHP文件,且其中一个文件只有一句代码,我也不知道有没有用,只是心里感觉没什么用,所以也没当回事,把注意力集中在剩下的另外一个文件里。

我在想要是能把主题选项里的那个功能和插件结合起来该有多好,这样上面的原因就不存在了,而且固定链接的问题也可以得到解决。于是又回头去看了一下主题选项里那个功能涉及的文件,发现刚好也只涉及一个PHP文件,虽然这个文件里的代码和插件里的剩下的那个文件的代码不一样,但是我觉得他们实现的功能应该是差不多的,主题制作者应该只是简单的集成了一个可以去掉category前缀功能的插件而已(至于集成的是哪个插件就不太清楚了,我也没有去进一步的研究),并没有对这个插件作本质上的修改(当然,细节的修改还是存在的,比如为了配合主题整体的代码规范,修改变量名,增加判断语句什么的)。

于是,我尝试着把插件里剩下的那个文件里的所有代码覆盖到主题选项里那个功能涉及的文件里,同时重新保存了一次固定链接,刷新前台,依次点击各个分类目录及具体的文章进行测试,发现问题居然解决了,他们的格式都变得统一了,都变成下面这样了:

  • 影视资源:https://isdola.com/movies/
  • 动漫:https://isdola.com/movies/anime/
  • 电影:https://isdola.com/movies/movie/
  • 电视剧:https://isdola.com/movies/television/
  • 专题合集:https://isdola.com/movies/union/
  • 具体的文章:https://isdola.com/123.html

 

  • 视听盛宴:https://isdola.com/videos/avonline/
  • 纯音乐:https://isdola.com/videos/absolutemusic/
  • 流金岁月:https://isdola.com/videos/goldentimes/
  • 翻唱歌曲:https://isdola.com/videos/coveredmusic/
  • 影视漫金曲:https://isdola.com/videos/greathit/
  • 视频文章类型下的具体的文章:https://isdola.com/video/192.html

于是,问题就这样稀里糊涂的解决了。

也许有童鞋会问,按你意思来的话,视频文章类型对应的是日志文章类型,视听盛宴对应影视资源,下面的四个子分类也相互对应(都是二级分类),那么视频文章类型的固定链接的前缀应该是avonline而不是videos才对啊,你现在的前缀是videos这样不就不一致了吗。另外,为什么视频文章类型下的具体的文章地址中多了一个video的前缀,而日志文章类型下的具体的文章地址中就没有前缀呢。

关于这两个问题,其实我也不是很明白,可能是主题制作者觉得作为一个普通的(个人)博客/网站来说,博客主要还是用来发布普通的文章(日志)吧,视频的内容应该不会成为博客的主要内容。所以觉得视频的一级分类应该只要一个就可以了,所以固定链接中就没必要出现这个一级分类的别名了,直接用视频这个文章类型的别名代替反而更好些。而在具体的文章地址中添加一个video前缀可以让浏览者更直观的从地址中区分这个地址所对应的文章是一个视频还是一个普通的日志吧。

我自己是这么理解的,其实我也不知道对不对,哎管不了那么多了,脑瓜疼脑瓜疼,哎呀妈呀,脑瓜疼。。。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:4   其中:访客  2   博主  2

    • avatar 刘大喵 1

      :razz: 来看看 人气有点低哈

        • avatar isdola Admin

          @刘大喵 是啊,欢迎常来踩踩,加点人气,哈哈

            • avatar 刘大喵 1

              @isdola 嘿嘿 交换友链吗

                • avatar isdola Admin

                  @刘大喵 主要是我还没测试友链这块功能,所以暂时不交换了,后续等启用该功能的时候再交换好了,谢谢你!