WordPress分页伪静态加html后缀

 更新时间:2016年06月08日 10:32:23   作者:hankcs   我要评论
本文给大家分享的是在使用WordPress的过程中,发现其内容页分页的形式非常的不友好,于是就动手进行修改的过程以及详细代码,非常的实用,推荐给大家。

问题

当文章有分页的时候,WordPress生成的永久链接是page.html/2的形式,前面一段是文章的$link,后面的数字代表分页$number。那么问题来了,挖掘……不对,从逻辑上讲这到底是个html文件还是一个目录呢?

难看

在.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错误:

利用服务器的重写规则

如果是SAE的话,在config.yaml的第一行加入:

复制代码 代码如下:
- rewrite: if ( !is_dir() && path ~ "(.+?)/([^/]+)(/page-([0-9]+))+.html/?$") goto "index.php?name=$2&page=$4"

如果不是的话,可以利用WordPress自带的rewrite_rules:

登陆后台——设置——固定链接:

什么也不用填,直接保存更改即可。代码会自动在金沙国际官网中硬性加入一条规则:

复制代码 代码如下:
"(.+?)/([^/]+)(/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,都可以访问第二页。

具体效果放在第二页,顺便测试一下分页后缀效果

好了,基本功能已经实现了,小伙伴们是否明白了呢,如有问题,请留言

相关文章

  • php Xdebug的安装与使用详解

    php Xdebug的安装与使用详解

    本篇文章是对php Xdebug的安装与使用进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • php UTF-8、Unicode和BOM问题

    php UTF-8、Unicode和BOM问题

    经常遇到的问题是,使用了BOM编码后,PHP脚本执行错误,或使用fileStream读取并转换为XML会报错"The markup in the document following the root element must be well-formed."。
    2010-05-05
  • php实现计算百度地图坐标之间距离的方法

    php实现计算百度地图坐标之间距离的方法

    这篇文章主要介绍了php实现计算百度地图坐标之间距离的方法,涉及php字符串、数组及数学运算的相关技巧,需要的朋友可以参考下
    2016-05-05
  • PHP中soap的用法实例

    PHP中soap的用法实例

    这篇文章主要介绍了PHP中soap的用法,实例讲述了PHP使用soap的两种方式,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • PHP基于swoole多进程操作示例

    PHP基于swoole多进程操作示例

    这篇文章主要介绍了PHP基于swoole多进程操作,结合实例形式分析了php使用swoole多进程实现多个任务同时执行以及大任务划分成多个小任务相关操作技巧,需要的朋友可以参考下
    2019-08-08
  • php中unlink()、mkdir()、rmdir()等方法的使用介绍

    php中unlink()、mkdir()、rmdir()等方法的使用介绍

    unlink()函数删除文件 、mkdir()函数创建目录、rmdir()函数删除目录这些方法在文件相关的处理方法会经常使用到,本文整理了一些,需要的朋友可以了解下
    2012-12-12
  • php中根据某年第几天计算出日期年月日的代码

    php中根据某年第几天计算出日期年月日的代码

    在PHP中,使用内置的date()函数很容易得到任意一天是当前年的第几天,格式为date('z'),为此,很多PHP程序会用一年中的第几天作为金沙国际官网的索引(index)。
    2011-02-02
  • 记录PHP错误日志 display_errors与log_errors的区别

    记录PHP错误日志 display_errors与log_errors的区别

    错误回显,一般常用语开发模式,但是很多应用在正式环境中也忘记了关闭此选项。错误回显可以暴露出非常多的敏感信息,为攻击者下一步攻击提供便利。推荐关闭此选项
    2012-10-10
  • PHP文件上传操作实例详解

    PHP文件上传操作实例详解

    这篇文章主要介绍了PHP文件上传操作,结合实例形式详细分析了php文件传输操作的实现技巧与相关注意事项,需要的朋友可以参考下
    2016-09-09
  • php遍历删除整个目录及文件的方法

    php遍历删除整个目录及文件的方法

    这篇文章主要介绍了php遍历删除整个目录及文件的方法,涉及php操作目录及文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03

最新评论