WordPress分頁(yè)偽靜態(tài)加html后綴
問(wèn)題
當(dāng)文章有分頁(yè)的時(shí)候,WordPress生成的永久鏈接是page.html/2的形式,前面一段是文章的$link,后面的數(shù)字代表分頁(yè)$number。那么問(wèn)題來(lái)了,挖掘……不對(duì),從邏輯上講這到底是個(gè)html文件還是一個(gè)目錄呢?
難看
在.html這個(gè)靜態(tài)文件后面加上一個(gè)/和數(shù)字簡(jiǎn)直令人摸不著頭腦,這還只是其次,重要的是,我發(fā)現(xiàn)搜索引擎根本不收錄這樣奇怪的鏈接,這個(gè)真是無(wú)法接受,我寫(xiě)的東西首尾都很重要,不能因?yàn)榉謧€(gè)頁(yè)就被忽視了。
不收錄
拿這篇文章來(lái)看,搜索文章第一頁(yè)的內(nèi)容,谷歌收錄了:

搜索文章第二頁(yè)和第三頁(yè)的內(nèi)容,根本沒(méi)有收錄:

解決方案
于是我決定DIY WordPress的鏈接生成與解析規(guī)則。
思路
利用filter wp_link_pages_link 將分頁(yè)鏈接/123456重寫(xiě)為page-[123456].html。
利用WordPress或者服務(wù)器的RewriteRule將page-[123456].html還原為/123456
添加鉤子redirect_canonical,防止WordPress從page-[123456].html到/123456的強(qiáng)行跳轉(zhuǎn)。
生成分頁(yè)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分頁(yè)鏈接的格式
* @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;
}
/**
* 為新的鏈接格式增加重定向規(guī)則,移除原始分頁(yè)鏈接的重定向規(guī)則,防止重復(fù)收錄
*
* 訪問(wèn)原始鏈接將返回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將頁(yè)面分頁(yè)鏈接跳轉(zhuǎn)到原來(lái)的格式
* @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();
這樣就得到了將類(lèi)似http://www.domain.com/program/tokyodaigaku.html/2/ 的分頁(yè)鏈接轉(zhuǎn)化為形如 http://www.domain.com/program/tokyodaigaku/page-2.html 的鏈接。
注意,我的偽靜態(tài)規(guī)則是/%category%/%postname%.html,如果你的規(guī)則不同,請(qǐng)自行修改代碼或者偽靜態(tài)規(guī)則。
重寫(xiě)URL規(guī)則
如果不重寫(xiě)規(guī)則的話,WordPress是不認(rèn)識(shí)這個(gè)鏈接的,它以為有個(gè)目錄叫tokyodaigaku,里面有篇文章叫page-2.html,結(jié)果會(huì)給出一個(gè)無(wú)情的404錯(cuò)誤:

利用服務(wù)器的重寫(xiě)規(guī)則
如果是SAE的話,在config.yaml的第一行加入:
如果不是的話,可以利用WordPress自帶的rewrite_rules:
登陸后臺(tái)——設(shè)置——固定鏈接:

什么也不用填,直接保存更改即可。代碼會(huì)自動(dòng)在數(shù)據(jù)庫(kù)中硬性加入一條規(guī)則:
最終效果
無(wú)論是用http://www.domain.com/program/tokyodaigaku.html/2/ 還是 http://www.domain.com/program/tokyodaigaku/page-2.html,都可以訪問(wèn)第二頁(yè)。
具體效果放在第二頁(yè),順便測(cè)試一下分頁(yè)后綴效果

好了,基本功能已經(jīng)實(shí)現(xiàn)了,小伙伴們是否明白了呢,如有問(wèn)題,請(qǐng)留言
相關(guān)文章
php使用redis的有序集合zset實(shí)現(xiàn)延遲隊(duì)列應(yīng)用示例
這篇文章主要介紹了php使用redis的有序集合zset實(shí)現(xiàn)延遲隊(duì)列,結(jié)合具體實(shí)例形式分析了PHP基于redis的有序集合zset實(shí)現(xiàn)延遲隊(duì)列的具體原理、應(yīng)用場(chǎng)景及相關(guān)操作技巧,需要的朋友可以參考下2020-02-02
php 遍歷數(shù)據(jù)表數(shù)據(jù)并列表橫向排列的代碼
下面是個(gè)例子:表格橫向排列例子2009-09-09
php使用scandir()函數(shù)掃描指定目錄下所有文件示例
這篇文章主要介紹了php使用scandir()函數(shù)掃描指定目錄下所有文件,涉及scandir()函數(shù)目錄掃描、文件遍歷及文件類(lèi)型判斷等相關(guān)操作技巧,需要的朋友可以參考下2019-06-06
PHP調(diào)用Webservice實(shí)例代碼
NuSoap是PHP環(huán)境下的WebService編程工具,用于創(chuàng)建或調(diào)用WebService。2011-07-07
php版銀聯(lián)支付接口開(kāi)發(fā)簡(jiǎn)明教程
這篇文章主要介紹了php版銀聯(lián)支付接口開(kāi)發(fā)的方法,結(jié)合實(shí)例形式分析了php銀聯(lián)支付接口開(kāi)發(fā)的具體流程與相關(guān)操作技巧,需要的朋友可以參考下2016-10-10

