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 相关文章推荐
第十三节--对象串行化
Nov 16 PHP
关于在php.ini中添加extension=php_mysqli.dll指令的说明
Jun 14 PHP
mysql_num_rows VS COUNT 效率问题分析
Apr 23 PHP
php缓存技术详细总结
Aug 07 PHP
PHP屏蔽过滤指定关键字的方法
Nov 03 PHP
PHP SESSION的增加、删除、修改、查看操作
Mar 20 PHP
php制作简单模版引擎
Apr 07 PHP
php简单实现数组分页的方法
Apr 30 PHP
php实现图片以base64显示的方法
Oct 13 PHP
PHP使用PDO访问oracle数据库的步骤详解
Sep 29 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
Jul 19 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
单点登录 Ucenter示例分析
2013/10/29 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
2014/08/19 PHP
PHP基于数组实现的分页函数实例
2014/08/20 PHP
php读取目录及子目录下所有文件名的方法
2014/10/20 PHP
php新浪微博登录接口用法实例
2014/12/23 PHP
firefox中JS读取XML文件
2006/12/21 Javascript
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
一步一步制作jquery插件Tabs实现过程
2010/07/06 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
jQuery过滤选择器经典应用
2016/08/18 Javascript
js实现文字列表无缝滚动效果
2017/06/23 Javascript
vue基于mint-ui实现城市选择三级联动
2020/06/30 Javascript
vue双向绑定数据限制长度的方法
2019/11/04 Javascript
[48:52]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第一局
2016/02/25 DOTA
Python操作MySQL简单实现方法
2015/01/26 Python
在python的类中动态添加属性与生成对象
2016/09/17 Python
Python标准库shutil用法实例详解
2018/08/13 Python
Python 脚本获取ES 存储容量的实例
2018/12/27 Python
用Cython加速Python到“起飞”(推荐)
2019/08/01 Python
使用Python脚本zabbix自定义key监控oracle连接状态
2019/08/28 Python
FFT快速傅里叶变换的python实现过程解析
2019/10/21 Python
python实现视频读取和转化图片
2019/12/10 Python
Pycharm debug调试时带参数过程解析
2020/02/03 Python
基于python3生成标签云代码解析
2020/02/18 Python
使用PyQt5实现图片查看器的示例代码
2020/04/21 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
软件测试面试题
2015/10/21 面试题
通信工程毕业生自荐信
2013/11/01 职场文书
土木工程专业个人求职信
2013/12/05 职场文书
党支部书记先进事迹
2014/01/17 职场文书
打架检讨书2000字
2014/02/22 职场文书
2014法制宣传日活动总结范文
2014/11/01 职场文书
2014年妇女工作总结
2014/12/06 职场文书
2016年社区国庆节活动总结
2016/04/01 职场文书
DIV CSS实现网页背景半透明效果
2021/12/06 HTML / CSS
vue ref如何获取子组件属性值
2022/03/31 Vue.js