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中文汉字验证码
Apr 08 PHP
PHP+MySQL 手工注入语句大全 推荐
Oct 30 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
Aug 22 PHP
Linux fgetcsv取得的数组元素为空字符串的解决方法
Nov 25 PHP
php变量范围介绍
Oct 15 PHP
分享下PHP register_globals 值为on与off的理解
Sep 26 PHP
Laravel5中contracts详解
Mar 02 PHP
php curl 上传文件代码实例
Apr 27 PHP
CodeIgniter配置之routes.php用法实例分析
Jan 19 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
Mar 02 PHP
php去除数组中为0的元素的实例分析
Nov 17 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
php 正确解码javascript中通过escape编码后的字符
2010/01/28 PHP
PHP数组函数知识汇总
2016/05/12 PHP
jQuery中使用了document和window哪些属性和方法小结
2011/09/13 Javascript
JS字符串累加Array不一定比字符串累加快(根据电脑配置)
2012/05/14 Javascript
在Javascript中 声明时用&quot;var&quot;与不用&quot;var&quot;的区别
2013/04/15 Javascript
jQuery打印指定区域Html页面并自动分页
2014/07/04 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
smartcrop.js智能图片裁剪库
2015/10/14 Javascript
Javascript闭包与函数柯里化浅析
2016/06/22 Javascript
BootStrap与validator 使用笔记(JAVA SpringMVC实现)
2016/09/21 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
vue 本地环境跨域请求proxyTable的方法
2018/09/19 Javascript
vue中slot(插槽)的介绍与使用
2018/11/12 Javascript
总结4个方面优化Vue项目
2019/02/11 Javascript
Node.js+Express+Mysql 实现增删改查
2019/04/03 Javascript
小程序获取当前位置加搜索附近热门小区及商区的方法
2019/04/08 Javascript
Vue记住滚动条和实现下拉加载的完美方法
2020/07/31 Javascript
[46:48]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第三局
2016/02/25 DOTA
python中将字典转换成其json字符串
2014/07/16 Python
Python 迭代器与生成器实例详解
2017/05/18 Python
pandas筛选某列出现编码错误的解决方法
2018/11/07 Python
Python微医挂号网医生数据抓取
2019/01/24 Python
详解如何管理多个Python版本和虚拟环境
2019/05/10 Python
Django框架自定义模型管理器与元选项用法分析
2019/07/22 Python
Python 改变数组类型为uint8的实现
2020/04/09 Python
Python selenium爬取微博数据代码实例
2020/05/22 Python
New Balance澳大利亚官网:运动鞋和健身服装
2019/02/23 全球购物
英国高街奥特莱斯:Highstreet Outlet
2019/11/21 全球购物
介绍一下SQL Server里面的索引视图
2016/07/31 面试题
司机的工作范围及职责
2013/11/13 职场文书
房屋出售授权委托书
2014/10/12 职场文书
党员个人总结自评
2015/02/14 职场文书
不同意离婚代理词
2015/05/23 职场文书
2016党员干部政治学习心得体会
2016/01/23 职场文书
2016年暑期社会实践活动总结报告
2016/04/06 职场文书