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 相关文章推荐
用文本文件制作留言板提示(上)
Oct 09 PHP
PHP程序员编程注意事项
Apr 10 PHP
PHP操作xml代码
Jun 17 PHP
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
Jun 17 PHP
Yii调试SQL的常用方法
Jul 09 PHP
ThinkPHP字符串函数及常用函数汇总
Jul 18 PHP
浅谈php冒泡排序
Dec 30 PHP
php类的扩展和继承用法实例
Jun 20 PHP
浅谈php提交form表单
Jul 01 PHP
php简单统计中文个数的方法
Sep 30 PHP
php 字符串中是否包含指定字符串的多种方法
Apr 12 PHP
基于php解决json_encode中文UNICODE转码问题
Nov 10 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-5.2 的 php.ini 中文版[金步国翻译]
2011/04/17 PHP
php function用法如何递归及return和echo区别
2014/03/07 PHP
PHP截取指定图片大小的方法
2014/12/10 PHP
详解js异步文件加载器
2016/01/24 PHP
php封装一个异常的处理类
2017/06/08 PHP
javaScript(JS)替换节点实现思路介绍
2013/04/17 Javascript
javascript中call和apply方法浅谈
2013/09/27 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
javascript中普通函数的使用介绍
2013/12/19 Javascript
使用javascript获取页面名称
2014/12/23 Javascript
javascript实现checkbox复选框实例代码
2016/01/10 Javascript
JS取模、取商及取整运算方法示例
2016/10/13 Javascript
详解为Angular.js内置$http服务添加拦截器的方法
2016/12/20 Javascript
AngularJS实现路由实例
2017/02/12 Javascript
JavaScript实现无穷滚动加载数据
2017/05/06 Javascript
mongoose中利用populate处理嵌套的方法
2017/05/26 Javascript
解决Vue+Element ui开发中碰到的IE问题
2018/09/03 Javascript
基于vue和react的spa进行按需加载的实现方法
2018/09/29 Javascript
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
2018/10/17 NodeJs
如何使用less实现随机下雪动画详解
2019/01/02 Javascript
浅谈vue项目用到的mock数据接口的两种方式
2019/10/09 Javascript
js实现提交前对列表数据的增删改查
2020/01/16 Javascript
python+pandas分析nginx日志的实例
2018/04/28 Python
Python3列表内置方法大全及示例代码小结
2019/05/10 Python
pyqt5之将textBrowser的内容写入txt文档的方法
2019/06/21 Python
Python装饰器用法与知识点小结
2020/03/09 Python
深入了解python列表(LIST)
2020/06/08 Python
CSS3 @media的基本用法总结
2019/09/10 HTML / CSS
Kathmandu澳洲户外商店:新西兰户外运动品牌
2017/11/12 全球购物
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
《草虫的村落》教学反思
2014/02/16 职场文书
战略性融资合作协议书范本
2014/10/17 职场文书
2014年档案管理工作总结
2014/11/17 职场文书
五年级下册复习计划
2015/01/19 职场文书
元宵节寄语大全
2015/02/27 职场文书
Python游戏开发实例之graphics实现AI五子棋
2021/11/01 Python