問題
當文章有分頁的時候,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,都可以訪問第二頁。
具體效果放在第二頁,順便測試一下分頁後綴效果
好了,基本功能已經實現了,小伙伴們是否明白了呢,如有問題,請留言