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.ini中文版(2)
Oct 09 PHP
dedecms模板标签代码官方参考
Mar 17 PHP
PHP可变函数的使用详解
Jun 14 PHP
解析PHP正则提取或替换img标记属性
Jun 26 PHP
php网页标题中文乱码的有效解决方法
Mar 05 PHP
ThinkPHP提交表单时默认自动转义的解决方法
Nov 25 PHP
PHP实现Javascript中的escape及unescape函数代码分享
Feb 10 PHP
php版微信公众平台开发之验证步骤实例详解
Sep 23 PHP
PHP 闭包详解及实例代码
Sep 28 PHP
PHP简单计算两个时间差的方法示例
Jun 20 PHP
PHP实现的堆排序算法详解
Aug 17 PHP
Laravel创建数据库表结构的例子
Oct 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
PHP调用三种数据库的方法(1)
2006/10/09 PHP
PHP实现倒计时功能
2020/11/16 PHP
js树形控件脚本代码
2008/07/24 Javascript
jquery清空表单数据示例分享
2014/02/13 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
js实现select跳转功能代码
2014/10/22 Javascript
JavaScript中string对象
2015/06/12 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
2017/02/27 Javascript
Node.js实现文件上传的示例
2017/06/28 Javascript
iscroll实现下拉刷新功能
2017/07/18 Javascript
微信小程序url与token设置详解
2017/09/26 Javascript
手动用webpack搭建第一个ReactApp的示例
2018/04/11 Javascript
解决vue router组件状态刷新消失的问题
2018/08/01 Javascript
js+css实现全屏侧边栏
2020/06/16 Javascript
JavaScript Image对象实现原理实例解析
2020/08/26 Javascript
使用js和canvas实现时钟效果
2020/09/08 Javascript
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
python3利用tcp实现文件夹远程传输
2018/07/28 Python
pycharm运行和调试不显示结果的解决方法
2018/11/30 Python
使用Puppeteer爬取微信文章的实现
2020/02/11 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
各大浏览器 CSS3 和 HTML5 兼容速查表 图文
2010/04/01 HTML / CSS
Wedgwood美国官网:英国骨瓷,精美礼品及家居装饰
2018/02/17 全球购物
KELLER SPORTS荷兰:在线订购最好的运动产品
2020/10/13 全球购物
企业法人授权委托书
2014/09/25 职场文书
公司领导班子四风对照检查材料
2014/09/27 职场文书
2014年电信员工工作总结
2014/12/19 职场文书
工人先锋号事迹材料
2014/12/24 职场文书
2014年度个人工作总结范文
2015/03/09 职场文书
2015年留守儿童工作总结
2015/05/22 职场文书
小学班主任心得体会
2016/01/07 职场文书
Vue实现动态查询规则生成组件
2021/05/27 Vue.js
用Python selenium实现淘宝抢单机器人
2021/06/18 Python
使用springMVC所需要的pom配置
2021/09/15 Java/Android
Go微服务项目配置文件的定义和读取示例详解
2022/06/21 Golang