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 相关文章推荐
一个更简单的无限级分类菜单代码
Jan 16 PHP
php木马webshell扫描器代码
Jan 25 PHP
php中的Base62类(适用于数值转字符串)
Aug 12 PHP
PHP 登录完成后如何跳转上一访问页面
Jan 14 PHP
php基于GD库画五星红旗的方法
Feb 24 PHP
android上传图片到PHP的过程详解
Aug 03 PHP
PHP快速生成各种信息提示框的方法
Feb 03 PHP
Zend Framework缓存Cache用法简单实例
Mar 19 PHP
php将print_r处理后的数据还原为原始数组的解决方法
Nov 02 PHP
替换php字符串中的单引号为双引号的方法
Feb 16 PHP
php 三大特点:封装,继承,多态
Feb 19 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
Mar 23 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面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
2009/09/30 PHP
使用PHP生成二维码的两种方法(带logo图像)
2014/03/14 PHP
php数据访问之查询关键字
2016/05/09 PHP
js 深拷贝函数
2008/12/04 Javascript
Javascript算符的优先级介绍
2013/03/20 Javascript
JS获取各种浏览器窗口大小的方法
2014/01/14 Javascript
js+html5实现canvas绘制简单矩形的方法
2015/06/05 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
详解如何配置vue-cli3.0的vue.config.js
2018/08/23 Javascript
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
2019/05/10 Javascript
jQuery实现手风琴效果(蒙版)
2020/01/11 jQuery
解决vuex刷新数据消失问题
2020/11/12 Javascript
详细介绍Python中的偏函数
2015/04/27 Python
实例Python处理XML文件的方法
2015/08/31 Python
教大家使用Python SqlAlchemy
2016/02/12 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
2016/12/10 Python
python解析基于xml格式的日志文件
2017/02/25 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
《Python学习手册》学习总结
2018/01/17 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
2018/06/22 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
基于Python+Appium实现京东双十一自动领金币功能
2019/10/31 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
python已协程方式处理任务实现过程
2019/12/27 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
2020/04/14 Python
django使用JWT保存用户登录信息
2020/04/22 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
CSS3中的display:grid,网格布局介绍
2019/10/30 HTML / CSS
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
软件工程专业推荐信
2013/10/28 职场文书
暑期社会实践学生的自我评价
2014/01/09 职场文书
思想作风纪律整顿心得体会
2014/09/04 职场文书
员工试用期自我评价
2014/09/18 职场文书
群众路线剖析材料范文
2014/10/09 职场文书
中国式结婚:司仪主持词(范文)
2019/07/25 职场文书
MySQL学习总结-基础架构概述
2021/04/05 MySQL