對於WordPress網站文章ID唔連續嘅問題困擾咗我好耐,今日將WordPress文章ID唔連續嘅原因同具體解決辦法做詳細嘅說明。
WordPress文章ID唔連續嘅原因
用WordPress做網站嘅站長可能會發現,最大嘅文章ID要遠大於文章總量,比如品自行博客而家文先350篇嘅文,但ID有超過5000,對於有些強迫症嘅我確實有些無法忍受,其實WordPress文章ID不連續主要有以下原因:
1、文嘅自動保存、修訂版本
喺WordPress後台寫文章嘅時候,每隔一段時間系統會自動保存吓文,以防止數據賴,保存一次生成一個id;
我哋對文章進行修改嘅時候,修改一次生成一個修訂版,對應一個修訂版文章id,即使刪除修訂版本,原佔用嘅ID都無法回收埋;
2、附件、餐牌、頁面佔用ID
WordPress嘅附件、導航餐牌項同頁面都係比較特殊嘅post,而且都會佔用一個post嘅id,喺wp_posts表嘅數據表結構裏面可以看出post類型種類(詳細介紹WordPress數據庫表wp_posts),呢個無法改變。
WordPress文章ID唔連續嘅解決辦法
瞭解咗WordPress文章id唔連續嘅原因以後,我哋自然就明白由於附件、導航餐牌同頁面佔用ID,理論上係冇絕對嘅方法可以畀文ID連續嘅,但係唔相差過大還是可能嘅,呢個都只能由文章自動保存和文章修訂版本進行設置埋。
一、禁用文章修訂版
所謂嘅文章修訂版就係你每次修改一次文章,它都會自動幫你保存修改之前嘅文章版本,專業術語叫做版本控制,這樣保證咗喺誤修改嘅情況下可以還原之前嘅内容,呢個喺維基文檔嘅維護方面係有好大幫助嘅,但係作為我哋嘅小博客,似乎沒多大用處,而且呢個修訂版喺數據庫中係佔據一個ID嘅,都係導致文章ID唔連續嘅問題之一。要想禁用文章修訂版,可以喺wp-config.php文件中添加:
define('WP_POST_REVISIONS', false);
都可以喺當前主題嘅functions.php添加以下PHP代碼:
// 禁用修订版本,2015年3月5日更新
add_filter( 'wp_revisions_to_keep', 'specs_wp_revisions_to_keep', 10, 2 );
function specs_wp_revisions_to_keep( $num, $post ) {
if ( 'post_type' == $post->post_type )
$num = 0;
return $num;
}二、刪除文章修訂版
禁用了文章修訂版之後,數據庫中還是保存住之前已經創建嘅文章修訂版,呢啲其實已經沒多大用處,而且霸住ID,我哋可以把它刪除。至於點樣刪除,可以喺phpmyadmin中執行以下SQL語句(會影響置顶文,慎用! 並做好備份):
DELETE a,b,c
FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
WHERE a.post_type = 'revision';三、刪除不必要的附件
相信好多博友喺發佈文章都會同時上傳/插入一些附件,如圖像、視頻、音樂等,呢啲附件可以喺WordPress管理後台 – 媒體庫中看到,不同媒體對應咗不同嘅文。但你要注意嘅係呢啲媒體都係佔據住文ID嘅,它們與文章都保存喺同一個數據庫表wp_posts中。如果你特別追求文章嘅ID一定要完美無缺地連續,請不要發佈文章緊嘅時候上傳/插入呢啲媒體,並請在WordPress管理後台 – 媒體庫中,刪除之前貼嘅媒體(注意呢個操作唔只係刪除記錄,而且會刪除你貼嘅文件),需要嘅話請用FTP重新上傳呢啲文件。
四、禁用自動保存
自動保存嘅好處係你編輯文章緊嘅時候,每隔一小段時間系統會自動幫你保存編輯嘅文,防止網頁突然關閉,導致之前寫嘅幾千字嘩啦吓冇咗晒。缺點係每篇都文章都會有一個自動保存嘅記錄,同樣佔據一個文章ID,都係文ID唔連續嘅原因之一,如果你唔需要呢個功能,可以喺當前主題嘅functions.php中添加以下代碼:
// 禁用自动保存,所以编辑长文章前请注意手动保存。
add_action( 'admin_print_scripts', create_function( '$a', "wp_deregister_script('autosave');" ) );
五、重新排列唔連續嘅文ID
方法一:可在當前主題的functions.php中加入以下PHP代碼,這樣如果你只係單純發文章,唔發頁面,唔添加餐牌,唔上傳媒体嘅話,基本上此後嘅文ID係連續嘅,而且唔改變之前已經發佈嘅文ID,唔影響SEO:登錄後複製
// WordPress 3.8测试有效
function keep_id_continuous(){
global $wpdb;
// 删掉自动草稿和修订版
$wpdb->query("DELETE FROM `$wpdb->posts` WHERE `post_status` = 'auto-draft' OR `post_type` = 'revision'");
// 自增值小于现有最大ID,MySQL会自动设置正确的自增值
$wpdb->query("ALTER TABLE `$wpdb->posts` AUTO_INCREMENT = 1");
}
add_filter( 'load-post-new.php', 'keep_id_continuous' );
add_filter( 'load-media-new.php', 'keep_id_continuous' );
add_filter( 'load-nav-menus.php', 'keep_id_continuous' );