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 相关文章推荐
MySQL数据源表结构图示
Jun 05 PHP
php 执行系统命令的方法
Jul 07 PHP
php 正则匹配函数体
Aug 25 PHP
php定时删除文件夹下文件(清理缓存文件)
Jan 23 PHP
PHP人民币金额数字转中文大写的函数代码
Feb 27 PHP
浅析PHP原理之变量(Variables inside PHP)
Aug 09 PHP
php计算给定日期所在周的开始日期和结束日期示例
Feb 06 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
May 21 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
Jun 16 PHP
php用wangeditor3实现图片上传功能
Aug 22 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
Nov 22 PHP
php的单例模式及应用场景详解
Feb 27 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
解析将多维数组转换为支持curl提交的一维数组格式
2013/07/08 PHP
利用js的Node遍历找到repeater的一个字段实例介绍
2013/04/25 Javascript
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
js函数在frame中的相互调用详解
2014/03/03 Javascript
jquery实现动态画圆
2014/12/04 Javascript
JavaScript 里的类数组对象
2015/04/08 Javascript
详解javascript实现瀑布流列式布局
2016/01/29 Javascript
Bootstrap 粘页脚效果
2016/03/28 Javascript
微信支付 JS API支付接口详解
2016/07/11 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
2016/09/23 Javascript
通过jsonp获取json数据实现AJAX跨域请求
2017/01/22 Javascript
js 颜色选择插件
2017/01/23 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
2017/02/16 Javascript
详解用node搭建简单的静态资源管理器
2017/08/09 Javascript
解决vue数组中对象属性变化页面不渲染问题
2018/08/09 Javascript
Vue中使用canvas方法总结
2019/02/12 Javascript
JS简单表单验证功能完整示例
2020/01/26 Javascript
python网络编程学习笔记(五):socket的一些补充
2014/06/09 Python
Python格式化压缩后的JS文件的方法
2015/03/05 Python
Python批量转换文件编码格式
2015/05/17 Python
python编程通过蒙特卡洛法计算定积分详解
2017/12/13 Python
Python3.6中Twisted模块安装的问题与解决
2019/04/15 Python
如何基于Python批量下载音乐
2019/11/11 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
python中_del_还原数据的方法
2020/12/09 Python
pycharm 如何取消连按两下shift出现的全局搜索
2021/01/15 Python
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
学校火灾防控方案
2014/06/09 职场文书
幼儿园教师节演讲稿
2014/09/03 职场文书
人大代表选举标语
2014/10/07 职场文书
幼儿学前班评语
2014/12/29 职场文书
大学毕业生个人总结
2015/02/28 职场文书
2015年出纳工作总结与计划
2015/05/18 职场文书
党小组考察意见
2015/06/02 职场文书
导游词之杭州西湖
2019/09/19 职场文书
一文搞懂MySQL索引页结构
2022/02/28 MySQL