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 相关文章推荐
xml+php动态载入与分页
Oct 09 PHP
模拟OICQ的实现思路和核心程序(一)
Oct 09 PHP
php&amp;java(三)
Oct 09 PHP
php checkbox 取值详细说明
Aug 19 PHP
PHP字符串的编码问题的详细介绍
Apr 27 PHP
Yii把CGridView文本框换成下拉框的方法
Dec 03 PHP
php中使用gd库实现下载网页中所有图片
May 12 PHP
php简单图像创建入门实例
Jun 10 PHP
php注册和登录界面的实现案例(推荐)
Oct 24 PHP
php array_key_exists() 与 isset() 的区别
Oct 24 PHP
laravel实现查询最后执行的一条sql语句的方法
Oct 09 PHP
PHP 自动加载类原理与用法实例分析
Apr 14 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
漂亮但不安全的CTB
2006/10/09 PHP
PHP 截取字符串专题集合
2010/08/19 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
2014/06/10 PHP
js类中的公有变量和私有变量
2008/07/24 Javascript
json 实例详细说明教程
2009/10/31 Javascript
js 得到文件后缀(通过正则实现)
2013/07/08 Javascript
js实现局部页面打印预览原理及示例代码
2014/07/03 Javascript
Bootstrap每天必学之前端开发框架
2015/11/19 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
2016/07/09 Javascript
基于JSON格式数据的简单jQuery幻灯片插件(jquery-slider)
2016/08/10 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
2016/10/13 Javascript
理解AngularJs篇:30分钟快速掌握AngularJs
2016/12/23 Javascript
基于JavaScript实现拖动滑块效果
2017/02/16 Javascript
vue2.0 axios跨域并渲染的问题解决方法
2018/03/08 Javascript
解决element-ui的下拉框有值却无法选中的情况
2020/11/07 Javascript
Python简单日志处理类分享
2015/02/14 Python
分享Python字符串关键点
2015/12/13 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
2016/06/02 Python
python利用正则表达式搜索单词示例代码
2017/09/24 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
python树莓派红外反射传感器
2019/01/21 Python
对python while循环和双重循环的实例详解
2019/08/23 Python
如何在python中写hive脚本
2019/11/08 Python
python绘制玫瑰的实现代码
2020/03/02 Python
python实现磁盘日志清理的示例
2020/11/05 Python
python 逆向爬虫正确调用 JAR 加密逻辑
2021/01/12 Python
MCM英国官网:奢侈皮具制品
2017/04/18 全球购物
实习教师自我鉴定
2013/09/27 职场文书
活动策划求职信模板
2014/04/21 职场文书
学校门卫岗位职责范本
2014/06/30 职场文书
学生喝酒检讨书500字
2014/11/02 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
我对PyTorch dataloader里的shuffle=True的理解
2021/05/20 Python
MySQL系列之十三 MySQL的复制
2021/07/02 MySQL
Nginx工作模式及代理配置的使用细节
2022/03/21 Servers
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫