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安装为Apache DSO
Oct 09 PHP
php中随机显示图片的函数代码
Jun 23 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
Nov 21 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
Jun 12 PHP
php程序员应具有的7种能力小结
Nov 27 PHP
php实现监控varnish缓存服务器的状态
Dec 30 PHP
php与Mysql的一些简单的操作
Feb 26 PHP
php实现httpRequest的方法
Mar 13 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
Jul 29 PHP
PHP迭代器和迭代的实现与使用方法分析
Apr 19 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
May 23 PHP
PHP调用微博接口实现微博登录的方法示例
Sep 22 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 多个submit提交表单 处理方法
2009/07/07 PHP
PHP 开发环境配置(测试开发环境)
2010/04/28 PHP
解析CodeIgniter自定义配置文件
2013/06/18 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
Thinkphp关闭缓存的方法
2015/06/26 PHP
PHP多进程之pcntl_fork的实例详解
2017/10/15 PHP
用js做一个小游戏平台 (一)
2009/12/29 Javascript
textarea中的手动换行处理的jquery代码
2011/02/26 Javascript
javascript动态向网页中添加表格实现代码
2014/02/19 Javascript
jquery小火箭返回顶部代码分享
2015/08/19 Javascript
javascript实现查找数组中最大值方法汇总
2016/02/13 Javascript
js获取html的span标签的值方法(超简单)
2016/07/26 Javascript
微信小程序 教程之wxapp 视图容器 view
2016/10/19 Javascript
jquery使用EasyUI Tree异步加载JSON数据(生成树)
2017/02/11 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
2020/11/24 Javascript
Angular开发者指南之入门介绍
2017/03/05 Javascript
bootstrap Table服务端处理分页(后台是.net)
2017/10/19 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
2018/08/06 Javascript
深入解析微信小程序开发中遇到的几个小问题
2020/07/11 Javascript
解决vux 中popup 组件Mask 遮罩在最上层的问题
2020/11/03 Javascript
python基于右递归解决八皇后问题的方法
2015/05/25 Python
Python编程中使用Pillow来处理图像的基础教程
2015/11/20 Python
用OpenCV进行年龄和性别检测的实现示例
2021/01/29 Python
英国领先的票务代理商之一:The Ticket Factory
2019/02/09 全球购物
英国标准协会商店:BSI Shop
2019/02/25 全球购物
药剂学专业应届生自荐信
2013/09/29 职场文书
资料员的岗位职责
2013/11/20 职场文书
50岁生日感言
2014/01/23 职场文书
代理商会议邀请函
2014/01/27 职场文书
远程研修随笔感言
2014/02/10 职场文书
中学生运动会口号
2014/06/07 职场文书
幸福家庭标语
2014/06/27 职场文书
贷款工资证明范本
2015/06/12 职场文书
导游词之珠海轮廓
2019/10/25 职场文书
python中的3种定义类方法
2021/11/27 Python
Android存储中最基本的文件存储方式
2022/04/30 Java/Android