如何id变动自动保存html软件,Wordpress折腾小记:彻底解决ID不连续的问题-自动保存、自动修订 | 地瓜哥博客网...
使用Wordpress,尤其從3.0走入Wordpress世界的朋友,也許都遇到過一個問題:自動保存(Auto-Save)和文章修訂(Post-Revisioning)功能導致文章ID不連續的問題。有時還特別夸張。例如,我的“‘地瓜哥’博客網”,第一篇文章是1,第二篇文章已經一下子跳到了19。這樣對于像D瓜哥這樣的“ID潔癖”的人來說,實在很不爽!經過D瓜哥的多次嘗試后,終于很徹底地解決了這個問題。并且,還可以把以前被自動備份的ID重新利用起來!
去掉自動草稿的功能
造成發布文章ID不連續的原因有三:
自動保存功能 Auto-Save;
歷史版本 Post Revisions;
自動草稿功能 Auto-Draft!
針對WordPress 3.4.x,這里給大家介紹一個解決ID不連續發方法:
打開%WP%/wp-config.php文件,在 “$table_prefix = ‘wp_’;” 前面添加如下代碼(注意,一定是”$table_prefix = ‘wp_’;”這行的前面):
define('WP_POST_REVISIONS', false);
define('AUTOSAVE_INTERVAL', false);
找到并打開%WP%/wp-admin/post-new.php 和%WP%/wp-admin/post.php 這兩個文件,將其 “wp_enqueue_script(‘autosave’);” 注釋或刪除掉。如下:
//wp_enqueue_script('autosave');
經過上面的修改后,文章的自動保存和歷史版本都關閉了。不過,這里也帶來了一個副作用:預覽不能使用了,需要手動保存草稿后才行。美中不足吧。
另外,還有個自動草稿功能,我們下面會介紹如何處理。
在這里D瓜哥要糾正一個曾經犯的錯誤。D瓜哥在“關閉WordPress自動保存和文章修訂功能”中提到了一種方法,但是經過D瓜哥的使用經驗來看,這種方式不好使!請大家停止使用。
刪除無用的草稿
在“刪除草稿”方面,有一些相應的插件,比如Delete-Revision,但是給Wordpress安裝過多的插件會降低她的速度。所以,D瓜哥盡量少安裝插件,如果通過簡單的代碼修改就能解決問題,就盡量修改代碼。另外,由于“刪除草稿”這樣的操作,也許只需要操作一次,而且只需要簡單的SQL。所以,D瓜哥認為必要安裝插件。這次,我們就通過編碼來完成我們的工作。
注意,請在進行如下工作前,備份數據庫!防止把數據搞壞。
我們先來看一下冗余數據(無用的自動修訂、草稿等)。登陸phpMyAdmin(一般虛擬主機都會提供的),然后選中相應的數據庫,然后在里面執行如下SQL:
-- 查看自動修訂產生的冗余數據
-- 注意,請根據自己的情況,修改表名(主要是表前綴)
SELECT * FROM `wp_posts` WHERE `post_type` = 'revision';
這里顯示內容都是一些冗余的數據,可以直接刪除。刪除SQL如下:
-- 刪除冗余數據
DELETE FROM `wp_posts` WHERE `post_type` = 'revision';
另外,需要給大家提醒一點。在D瓜哥查找刪除冗余數據的資料中,見到過如下的寫法:
DELETE FROM `wp_posts` WHERE `post_status` != 'publish' OR `post_type` = 'revision';
經過D瓜哥對實際數據的觀察發現,這個SQL是不對的。它會把上傳的圖片等信息刪除掉。所以,請大家注意!!
經過這次清理后,數據庫干凈了許多。同時,也在表中的ID不再連續,還空出來好多沒被用掉的ID數。那么,我們該如何重用這些被空出來的ID呢?
重用被浪費掉的ID
根據D瓜哥的個人經驗,Wordpress會每隔一段時間,自動在wp_posts表中添加一條草稿記錄。并且,對于用戶來說是不可見的。這也是一種浪費。浪費的還有上一節被刪掉后空出來的ID。所以,有必要想辦法重新這些被浪費掉的ID。
重用自動草稿產生的ID
既然,Wordpress能產生不可見的草稿記錄。那么,我們修改一下代碼,在添加文章的時候,把自動產生的草稿記錄讀取出來,重新添加文章內容即可。下面,D瓜哥給大家介紹一下方法:
打開%WP%/wp-admin/includes/post.php文件,將如下內容(Wordpress 3.4.2):
// 原始Wordpress代碼
if ( $create_in_db ) {
$post_id = wp_insert_post( array( 'post_title' => __( 'Auto Draft' ), 'post_type' => $post_type, 'post_status' => 'auto-draft' ) );
$post = get_post( $post_id );
if ( current_theme_supports( 'post-formats' ) && post_type_supports( $post->post_type, 'post-formats' ) && get_option( 'default_post_format' ) )
set_post_format( $post, get_option( 'default_post_format' ) );
} else {
替換為如下內容:
// 替換后,可以重用自動草稿
if ( $create_in_db ) {
global $current_user; // 獲取當前登錄管理用戶
$post = $wpdb->get_row( "SELECT * FROM $wpdb->posts WHERE post_status = 'auto-draft' AND post_type = '$post_type' AND post_author = $current_user->ID ORDER BY post_date ASC, ID ASC LIMIT 1" ); // 獲取最早一條自動草稿
if ( !$post ) {
$post_id = wp_insert_post( array( 'post_title' => __( 'Auto Draft' ), 'post_type' => $post_type, 'post_status' => 'auto-draft' ) );
$post = get_post( $post_id );
}
if ( current_theme_supports( 'post-formats' ) && post_type_supports( $post->post_type, 'post-formats' ) && get_option( 'default_post_format' ) )
set_post_format( $post, get_option( 'default_post_format' ) );
} else {
請注意上面代碼中使用的SQL語句:
SELECT * FROM $wpdb->posts WHERE post_status = 'auto-draft' AND post_type = '$post_type' AND post_author = $current_user->ID ORDER BY post_date ASC, ID ASC LIMIT 1
這里,之所以使用post_date排序,是因為自動草稿超過七天后會自動刪除。所以,先使用比較舊的記錄。可能,你會問,那不是有ID在排序嗎?這個問題,我們在下一小節再解釋。
生成添加“草稿”的數據
經過上面的折騰,空出來一些ID。既然自動草稿的記錄能使用,那么空出來的ID更加可以隨意使用。現在,我們就想辦法把這些空出來的ID也使用起來。
根據網友測試結果顯示,經過修改上面的代碼修改后,只要手動保持wp_posts表中數據的三個字段內容如下,那么這些空出來的ID也可以被使用起來。
post_status='auto-draft'
guid='http://youdomain/?p={$ID}'
post_type='post'
// ID不能為空,還有和{$ID}保持一致;
ID
// post_author字段也要填上相應作者的ID。
post_author
將空出來的ID分別安裝上面的要求,將對應一列數據造出來即可。我們上面提到,Wordpress會自動添加自動草稿的記錄,并且七天后就自動刪除。那么,我們要在兩個時間相關的字段post_date和post_modified上,填上一個盡可能打一點的值,防止Wordpress自動刪除。但是,系統還有可能產生自動草稿。那么,為了防止被刪除,系統產生的這些自動草稿記錄要優先使用掉。所以,我們上面的SQL中,有按照時間排序的條件。
既然有了上面這些要求,那么我們就寫一個SQL語句,來自動生成數據。SQL如下:
-- 生成100以內的空ID對應的記錄
CREATE TABLE post_bk as
SELECT iid AS ID,
'auto-draft' as post_status,
CONCAT('http://www.diguage.com/?p=', iid) AS guid,
'post' AS post_type,
1 as post_author,
str_to_date('11.25.2015 00:00:00',
'%m.%d.%Y %H:%i:%s') as post_date,
str_to_date('03.26.2015 21:44:00',
'%m.%d.%Y %H:%i:%s') as post_modified
from ( select b.dd * 10 + a.dd as iid
from ( select 1 as dd
union all select 2
union all select 3
union all select 4
union all select 0
union all select 5
union all select 6
union all select 7
union all select 8
union all select 9) a,
(select 0 as dd
union all select 1
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6
union all select 7
union all select 8
union all select 9) b
) num
WHERE iid > 0 and iid NOT IN
( SELECT ID from wp_posts )
ORDER BY iid ASC;
這個SQL語句只能生成100以內的空ID的記錄;另外,這里制造100以內的整數時,有點麻煩,可以考慮直接用編程語言生成以逗號分隔的數字序列。
這個生成工作最好在本地進行。生成完后,使用phpMyAdmin將生成出來的post_bk表的數據都導出成腳本,然后登陸服務器上的phpMyAdmin,將腳本導入到服務器上的表中。
這里,給大家展示兩條我導出出來的數據。需要的話,直接拷貝使用:
-- 添加空白記錄對應,重用ID
INSERT INTO `wp_posts` (`ID`, `post_status`, `guid`, `post_type`, `post_author`, `post_date`, `post_modified`) VALUES(3, 'auto-draft', 'http://www.diguage.com/?p=3', 'post', 1, '2015-11-25 00:00:00', '2015-03-26 21:44:00');
INSERT INTO `wp_posts` (`ID`, `post_status`, `guid`, `post_type`, `post_author`, `post_date`, `post_modified`) VALUES(4, 'auto-draft', 'http://www.diguage.com/?p=4', 'post', 1, '2015-11-25 00:00:00', '2015-03-26 21:44:00');
參考資料
總結
以上是生活随笔為你收集整理的如何id变动自动保存html软件,Wordpress折腾小记:彻底解决ID不连续的问题-自动保存、自动修订 | 地瓜哥博客网...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宇泽电影工作室网页HTML语言,4.4宇
- 下一篇: excel函数公式html文档,Exce