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 相关文章推荐
PHP中空字符串介绍0、null、empty和false之间的关系
Sep 25 PHP
浅析php中如何在有限的内存中读取大文件
Jul 02 PHP
php缓冲 output_buffering和ob_start使用介绍
Jan 30 PHP
浅谈php安全性需要注意的几点事项
Jul 17 PHP
PHP的cURL库简介及使用示例
Feb 06 PHP
CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录
Mar 25 PHP
PHP数组编码gbk与utf8互相转换的两种方法
Sep 01 PHP
PHP date()格式MySQL中插入datetime方法
Jan 29 PHP
php防止表单重复提交实例讲解
Feb 11 PHP
PHP扩展Swoole实现实时异步任务队列示例
Apr 13 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
Aug 27 PHP
PHP代码覆盖率统计详解
Jul 22 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
咖啡的化学
2021/03/03 咖啡文化
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
2014/12/25 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
PHP使用pdo实现事务处理操作示例
2018/09/05 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
2019/05/05 PHP
JavaScript版TAB选项卡效果实例
2013/08/16 Javascript
js网页实时倒计时精确到秒级
2014/02/10 Javascript
nodejs命令行参数处理模块commander使用实例
2014/09/17 NodeJs
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
angularjs 中$apply,$digest,$watch详解
2016/10/13 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
jQuery设计思想
2017/03/07 Javascript
Javascript中将变量转换为字符串的三种方法
2017/09/19 Javascript
解决vue scoped scss 无效的问题
2020/09/04 Javascript
微信小程序实现自定义底部导航
2020/11/18 Javascript
Nodejs 数组的队列以及forEach的应用详解
2021/02/25 NodeJs
[02:39]我与DAC之Newbee.Moogy:从论坛到TI
2018/03/26 DOTA
Python用模块pytz来转换时区
2016/08/19 Python
Win10+GPU版Pytorch1.1安装的安装步骤
2019/09/27 Python
Python爬虫爬取微信朋友圈
2020/08/06 Python
浅析NumPy 切片和索引
2020/09/02 Python
Mytheresa中国官网:德国时尚奢侈品商城
2017/08/04 全球购物
英国当代时尚和街头服饰店:18montrose
2018/12/15 全球购物
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
俄罗斯金苹果网上化妆品和香水商店:Goldapple
2019/12/01 全球购物
Ruby如何创建一个线程
2013/03/10 面试题
家佳咖啡店创业计划书
2013/12/27 职场文书
《学会合作》教学反思
2014/04/12 职场文书
金融保险专业求职信
2014/09/03 职场文书
2015年初中教务处工作总结
2015/07/21 职场文书
新郎结婚感言
2015/07/31 职场文书
2016年端午节校园广播稿
2015/12/18 职场文书
redis不能访问本机真实ip地址的解决方案
2021/07/07 Redis
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电
纯CSS实现一个简单步骤条的示例代码
2022/07/15 HTML / CSS