WordPress分页伪静态加html后缀


Posted in PHP onJune 08, 2016

问题

当文章有分页的时候,WordPress生成的永久链接是page.html/2的形式,前面一段是文章的$link,后面的数字代表分页$number。那么问题来了,挖掘……不对,从逻辑上讲这到底是个html文件还是一个目录呢?

难看

在.html这个静态文件后面加上一个/和数字简直令人摸不着头脑,这还只是其次,重要的是,我发现搜索引擎根本不收录这样奇怪的链接,这个真是无法接受,我写的东西首尾都很重要,不能因为分个页就被忽视了。

不收录

拿这篇文章来看,搜索文章第一页的内容,谷歌收录了:

WordPress分页伪静态加html后缀

搜索文章第二页和第三页的内容,根本没有收录:

WordPress分页伪静态加html后缀

解决方案

于是我决定DIY WordPress的链接生成与解析规则。

思路

利用filter wp_link_pages_link 将分页链接/123456重写为page-[123456].html。

利用WordPress或者服务器的RewriteRule将page-[123456].html还原为/123456

添加钩子redirect_canonical,防止WordPress从page-[123456].html到/123456的强行跳转。

生成分页html后缀链接

给WordPress主题加入:

class Rewrite_Inner_Page_Links
{
  var $separator;
  var $post_rule;
 
  function __construct()
  {
    $this->separator = '/page-';
    // (.+?)/([^/]+).html(/[0-9]+)?/?
    $this->post_rule = '(.+?)/([^/]+)(' . $this->separator . '([0-9]+))+.html/?$';
    if (!is_admin() || defined('DOING_AJAX')) :
      add_filter('wp_link_pages_link', array($this, 'inner_page_link_format'), 10, 2); // for inner pages
      add_filter('redirect_canonical', array($this, 'cancel_redirect_for_paged_posts'), 10, 2);
    endif;
    if (is_admin()) :
      add_filter('rewrite_rules_array', array($this, 'pagelink_rewrite_rules'));
    endif;
  }
 
  /**
   * 修改post分页链接的格式
   * @param string $link
   * @param int $number
   * @return string
   */
  function inner_page_link_format($link, $number)
  {
    if ($number > 1)
    {
      if (preg_match('%<a href=".*\.html/\d*"%', $link))
      {
        $link = preg_replace("%(\.html)/(\d*)%", $this->separator . "$2$1", $link);
      }
    }
    return $link;
  }
 
  /**
   * 为新的链接格式增加重定向规则,移除原始分页链接的重定向规则,防止重复收录
   *
   * 访问原始链接将返回404
   * @param array $rules
   * @return array
   */
  function pagelink_rewrite_rules($rules)
  {
    $new_rule[$this->post_rule] = 'index.php?name=$matches[2]&page=$matches[4]';
    return $new_rule + $rules;
  }
 
  /**
   * 禁止WordPress将页面分页链接跳转到原来的格式
   * @param string $redirect_url
   * @param string $requested_url
   * @return bool
   */
  function cancel_redirect_for_paged_posts($redirect_url, $requested_url)
  {
    global $wp_query;
    if (is_single() && $wp_query->get('page') > 1)
    {
      return false;
    }
    return true;
  }
}
 
new Rewrite_Inner_Page_Links();

这样就得到了将类似http://www.domain.com/program/tokyodaigaku.html/2/ 的分页链接转化为形如 http://www.domain.com/program/tokyodaigaku/page-2.html 的链接。

注意,我的伪静态规则是/%category%/%postname%.html,如果你的规则不同,请自行修改代码或者伪静态规则。

重写URL规则

如果不重写规则的话,WordPress是不认识这个链接的,它以为有个目录叫tokyodaigaku,里面有篇文章叫page-2.html,结果会给出一个无情的404错误:

WordPress分页伪静态加html后缀

利用服务器的重写规则

如果是SAE的话,在config.yaml的第一行加入:

- rewrite: if ( !is_dir() && path ~ "(.+?)/([^/]+)(/page-([0-9]+))+.html/?$") goto "index.php?name=$2&page=$4"

如果不是的话,可以利用WordPress自带的rewrite_rules:

登陆后台——设置——固定链接:

WordPress分页伪静态加html后缀

什么也不用填,直接保存更改即可。代码会自动在数据库中硬性加入一条规则:

"(.+?)/([^/]+)(/page-([0-9]+))+.html/?$" => "index.php?name=$matches[2]&page=$matches[4]"

最终效果

无论是用http://www.domain.com/program/tokyodaigaku.html/2/ 还是 http://www.domain.com/program/tokyodaigaku/page-2.html,都可以访问第二页。

具体效果放在第二页,顺便测试一下分页后缀效果

WordPress分页伪静态加html后缀

好了,基本功能已经实现了,小伙伴们是否明白了呢,如有问题,请留言

PHP 相关文章推荐
一个查看session内容的函数
Oct 09 PHP
NOT NULL 和NULL
Jan 15 PHP
PHP 判断变量类型实现代码
Oct 23 PHP
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
Jul 23 PHP
PHP保留两位小数并且四舍五入及不四舍五入的方法
Sep 22 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
Sep 22 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
Feb 14 PHP
YII Framework框架教程之国际化实现方法
Mar 14 PHP
PHP实现获取第一个中文首字母并进行排序的方法
May 09 PHP
PHP使用redis消息队列发布微博的方法示例
Jun 22 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
May 27 PHP
php apache开启跨域模式过程详解
Jul 08 PHP
php 流程控制switch的简单实例
Jun 07 #PHP
php 使用curl模拟登录人人(校内)网的简单实例
Jun 06 #PHP
PHP session 会话处理函数
Jun 06 #PHP
thinkphp,onethink和thinkox中验证码不显示的解决方法分析
Jun 06 #PHP
PHP编写的图片验证码类文件分享
Jun 06 #PHP
Laravel框架实现发送短信验证功能代码
Jun 06 #PHP
JSON字符串传到后台PHP处理问题的解决方法
Jun 05 #PHP
You might like
教你IIS6的PHP最佳配置方法
2006/09/05 PHP
php adodb介绍
2009/03/19 PHP
PHP中用hash实现的数组
2011/07/17 PHP
thinkPHP实现多字段模糊匹配查询的方法
2016/12/01 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
javascript 页面划词搜索JS
2009/09/28 Javascript
JavaScript的jQuery库中ready方法的学习教程
2015/08/14 Javascript
js获取及修改网页背景色和字体色的方法
2015/12/29 Javascript
详解JavaScript对象序列化
2016/01/19 Javascript
超实用的JavaScript表单代码段
2016/02/26 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
jquery实时获取时间的简单实例
2017/01/26 Javascript
拖动时防止选中
2017/02/03 Javascript
JavaScript数组操作详解
2017/02/04 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
Vue.js 2.5新特性介绍(推荐)
2017/10/24 Javascript
zTree树形菜单交互选项卡效果的实现方法
2017/12/25 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
详解vue中使用vue-quill-editor富文本小结(图片上传)
2019/04/24 Javascript
微信小程序上传多图到服务器并获取返回的路径
2019/05/05 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
2019/09/02 Javascript
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
Python做文本按行去重的实现方法
2016/10/19 Python
Python操作MongoDB详解及实例
2017/05/18 Python
解决Django migrate No changes detected 不能创建表的问题
2018/05/27 Python
python画图系列之个性化显示x轴区段文字的实例
2018/12/13 Python
利用python实现凯撒密码加解密功能
2020/03/31 Python
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
个人房屋买卖协议书(范本)
2014/10/04 职场文书
上市公司董事长岗位职责
2015/04/16 职场文书
2015年客房服务员工作总结
2015/05/15 职场文书
2016年母亲节寄语
2015/12/04 职场文书
python3 sqlite3限制条件查询的操作
2021/04/07 Python
Apache Hudi 加速传统的批处理模式
2022/04/24 Servers
windows server2016安装oracle 11g的图文教程
2022/07/15 Servers