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提取视频网站页面中的FLASH地址的代码
Apr 17 PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
Apr 23 PHP
PHP对象Object的概念 介绍
Jun 14 PHP
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
May 08 PHP
PHP Session 变量的使用方法详解与实例代码
Sep 11 PHP
PHP return语句另类用法不止是在函数中
Sep 17 PHP
PHP+jQuery 注册模块的改进(一):验证码存入SESSION
Oct 14 PHP
php解析字符串里所有URL地址的方法
Apr 03 PHP
PHP实现QQ登录实例代码
Jan 14 PHP
Yii2使用swiftmailer发送邮件的方法
May 03 PHP
php利用fsockopen GET/POST提交表单及上传文件
May 22 PHP
Yii框架的路由配置方法分析
Sep 09 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
网站当前的在线人数
2006/10/09 PHP
php遍历所有文件及文件夹的方法深入解析
2013/06/08 PHP
php格式输出文件var_export函数实例
2014/11/15 PHP
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
2017/01/12 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
静态的动态续篇之来点XML
2006/12/23 Javascript
[推荐]javascript 面向对象技术基础教程
2009/03/03 Javascript
由document.body和document.documentElement想到的
2009/04/13 Javascript
jquery tools 系列 scrollable学习
2009/09/06 Javascript
JS 判断undefined的实现代码
2009/11/26 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
2013/06/19 Javascript
JavaScript实现的图像模糊算法代码分享
2014/04/22 Javascript
jquery mobile页面跳转后样式丢失js失效的解决方法
2014/09/06 Javascript
浅谈jquery.fn.extend与jquery.extend区别
2015/07/13 Javascript
详解Angular开发中的登陆与身份验证
2016/07/27 Javascript
浅谈js函数的多种定义方法与区别
2016/11/29 Javascript
Vue Echarts实现可视化世界地图代码实例
2019/05/07 Javascript
JavaScript实现图片轮播特效
2019/10/23 Javascript
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
python使用wxPython打开并播放wav文件的方法
2015/04/24 Python
Python实时获取cmd的输出
2015/12/13 Python
Python 一键获取百度网盘提取码的方法
2019/08/01 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
Tensorflow之MNIST CNN实现并保存、加载模型
2020/06/17 Python
python 模拟登陆github的示例
2020/12/04 Python
WatchShop法国:英国排名第一的独立手表零售商
2020/02/17 全球购物
RUIFIER官网:英国奢侈高级珠宝品牌
2020/06/12 全球购物
十八大感想感言
2014/02/10 职场文书
暑期培训随笔感言
2014/03/10 职场文书
《鸟岛》教学反思
2014/04/26 职场文书
小班下学期个人总结
2015/02/12 职场文书
电子商务专业求职信范文
2015/03/19 职场文书
2015年卫生院健康教育工作总结
2015/07/24 职场文书
追悼会答谢词范文
2015/09/29 职场文书
python关于集合的知识案例详解
2021/05/30 Python