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一些服务器端特性的配置加强php的安全
Oct 09 PHP
用文本文件实现的动态实时发布新闻的程序
Oct 09 PHP
php 获取mysql数据库信息代码
Mar 12 PHP
PHP 采集程序原理分析篇
Mar 05 PHP
php简单的会话类代码
Aug 08 PHP
如何在symfony中导出为CSV文件中的数据
Oct 06 PHP
windows服务器中检测PHP SSL是否开启以及开启SSL的方法
Apr 25 PHP
PHP根据传入参数合并多个JS和CSS文件的简单实现
Jun 13 PHP
php获取根域名方法汇总
Oct 28 PHP
ThinkPHP实现二级循环读取的方法
Nov 03 PHP
3种php生成唯一id的方法
Nov 23 PHP
PHP开发的微信现金红包功能示例
Jun 29 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 daodb插入、更新与删除数据
2009/03/19 PHP
php 上一篇,下一篇文章实现代码与原理说明
2010/05/09 PHP
JavaScript创建命名空间的5种写法
2014/06/24 PHP
php获取用户浏览器版本的方法
2015/01/03 PHP
Laravel 队列使用的实现
2019/01/08 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
基于jquery的一行代码轻松实现拖动效果
2010/12/28 Javascript
详解参数传递四种形式
2015/07/21 Javascript
JS返回只包含数字类型的数组实例分析
2016/12/16 Javascript
jQuery EasyUi 验证功能实例解析
2017/01/06 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
2017/01/30 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
2017/02/06 Javascript
JavaScript拖动层Div代码
2017/03/01 Javascript
jQuery Easyui Treegrid实现显示checkbox功能
2017/08/08 jQuery
JavaScript判断输入是否为数字类型的方法总结
2017/09/28 Javascript
前端axios下载excel文件(二进制)的处理方法
2018/07/31 Javascript
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
2019/02/27 Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
2019/11/15 Javascript
[07:26]2015国际邀请赛第二日TOP10集锦
2015/08/06 DOTA
Python使用urllib2模块实现断点续传下载的方法
2015/06/17 Python
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
Python2.7读取PDF文件的方法示例
2017/07/13 Python
和孩子一起学习python之变量命名规则
2018/05/27 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
Python3 Tkinkter + SQLite实现登录和注册界面
2019/11/19 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
2020/06/17 Python
Python+Appium实现自动化清理微信僵尸好友的方法
2021/02/04 Python
自我评价的写作规则
2014/01/06 职场文书
银行办理业务介绍信
2014/01/18 职场文书
企业诚信承诺书
2014/05/23 职场文书
营销与策划专业求职信
2014/06/20 职场文书
高中运动会广播稿
2014/09/16 职场文书
师德师风自查材料
2014/10/14 职场文书
2014年煤矿安全工作总结
2014/12/04 职场文书
2015年幼儿园学期工作总结
2015/05/22 职场文书