程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> WordPress分頁偽靜態加html後綴

WordPress分頁偽靜態加html後綴

編輯:PHP綜合

問題

當文章有分頁的時候,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,都可以訪問第二頁。

具體效果放在第二頁,順便測試一下分頁後綴效果

好了,基本功能已經實現了,小伙伴們是否明白了呢,如有問題,請留言

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved