利用wordpress資料庫寫API,附加文章redis快取[菜雞簡單粗暴版]
前言:
公司接了個活,於是乎老大給了個任務了,給XX做一個個人的APP,用PHP寫API,文章釋出系統用wordpress,要求有快取。
看了一下網上的‘wordpress快取’主要是針對於web端的外掛,個人覺得拿來寫到API中不是很方便,於是乎自己瞎寫了一部分。各位看官大牛,歡迎指正,畢竟第一次用wordpress。
環境要求:
1.wordpress
WordPress 4.4.1版本
2.redis快取
2.8.8
3.系統
Linux iZ25tyupojmZ 2.6.32-220.23.2.al.ali1.1.alios6.x86_64 #1 SMP Sun Jan 4 15:01:53 CST 2015 x86_64
沒錯就是阿里雲的
4.apach
Apache/2.4.10
5.php
5.5.7
6.mysql
沒錯也是阿里雲的, MySQL5.6
開始吧!
就事論事,這裡只寫涉及到專案的東西。
1.明確目標:
要求請求之後返回一個文章的:標題,摘要,配圖(特色影象),發表時間,最後修改時間,內容
2.尋找資料所在表,以及表之間關係
這個還是上圖吧,老規矩,用不到的沒在圖中顯示
3.修改原始碼,記錄操作涉及的文章
這裡主要是記錄文章的操作資訊
主要有new,edit,trash,untrash,delete。
使用redis記錄
所以在每個需要記錄的檔案中都要加上
$redis = new redis();
$redis -> connect('127.0.0.1', 6379);
記錄點:
1.新發表的文章
檔案:/wp_admin/post-new.php
在最後的兩個include之前新增
$new_post_id = $redis->get('new_post');
$new_post_id = json_decode($new_post_id);
$new_post_id[] = $post_ID;
$redis->set('new_post',json_encode($new_post_id));
2.edit
檔案:/wp_admin/post.php
case 'editpost':
...
// Session cookie flag that the post was saved
if ( isset( $_COOKIE['wp-saving-post'] ) && $_COOKIE['wp-saving-post'] === $post_id . '-check' ) {
setcookie( 'wp-saving-post', $post_id . '-saved', time() + DAY_IN_SECONDS, ADMIN_COOKIE_PATH, COOKIE_DOMAIN, is_ssl() );
}
//增加部分
$editpost_id = $redis->get('editpost');
$editpost_id = json_decode($editpost_id);
$editpost_id[] = $post_id;
$redis->set('editpost',json_encode($editpost_id));
redirect_post($post_id); // Send user on their way while we keep working
//增加部分
exit();
3.trash
檔案:/wp_admin/post.php
case 'trash':
...
if ( ! wp_trash_post( $post_id ) )
wp_die( __( 'Error in moving to Trash.' ) );
//增加部分
$trash_id = $redis->get('trash');
$trash_id = json_decode($trash_id);
$trash_id[] = $post_id;
$redis->set('trash',json_encode($trash_id));
//增加部分
wp_redirect( add_query_arg( array('trashed' => 1, 'ids' => $post_id), $sendback ) );
exit();
4.untrash
檔案:/wp_admin/post.php
case 'untrash':
...
if ( ! wp_untrash_post( $post_id ) )
wp_die( __( 'Error in restoring from Trash.' ) );
//增加部分
$untrash_id = $redis->get('untrash');
$untrash_id = json_decode($untrash_id);
$untrash_id[] = $post_id;
$redis->set('untrash',json_encode($untrash_id));
//增加部分
wp_redirect( add_query_arg('untrashed', 1, $sendback) );
exit();
5.delete
檔案:/wp_admin/post.php
case 'delete':
...
if ( $post->post_type == 'attachment' ) {
$force = ( ! MEDIA_TRASH );
if ( ! wp_delete_attachment( $post_id, $force ) )
wp_die( __( 'Error in deleting.' ) );
} else {
if ( ! wp_delete_post( $post_id, true ) )
wp_die( __( 'Error in deleting.' ) );
}
//增加部分
$delete_id = $redis->get('delete');
$delete_id = json_decode($delete_id);
$delete_id[] = $post_id;
$redis->set('delete',json_encode($delete_id));
//增加部分
wp_redirect( add_query_arg('deleted', 1, $sendback) );
exit();
記錄點設定好之後就可以開始寫API了
5.API
來個結構圖吧
其實這裡已經脫離wordpress了,只是用了wordpress的資料。
具體的程式碼就不貼上了,無非是這麼幾個操作
快取操作:
redis->get
redis->set
json_decode
json_encode
資料庫操作:
SELECT xx FROM xxx WHERE xx = xx
對,你沒看錯,就是query查詢語句。
OK,結束。
說一些自己的不足,因為第一次使用wordpress,所以對原始碼瞭解不多,
在更新快取中的文章時候,只用快取記錄了更新的ID,並沒有記錄這篇文章所屬的欄目,所以每次更新,就更新所有的欄目。
也是因為沒有設定記錄欄目的id,所以更新其實就是從資料庫中獲取所有的資料,或者說是重寫快取,而不是修改快取。
貼一下程式碼吧- -。。不知道說的,各位能不能看懂
class api{
public function getPostsCache($term_id){
$trash = json_decode($this->redis->get('trash'));
$untrash = json_decode($this->redis->get('untrash'));
$edit = json_decode($this->redis->get('editpost'));
if (sizeof($trash)+sizeof($edit)+sizeof($untrash) >0) {
//用來記錄操作的陣列,若長度大於0,說明資料被修改過
$this->updateCache();
}
$data = $this->redis->get('post_' . $term_id);
$data = json_decode($data,TRUE);
return $data;
}
public function updateCache(){
$TERM_ARRAY = $this->TERM_ARRAY;//陣列記錄了所有欄目的term_id
foreach ($TERM_ARRAY as $key => $value) {
$this->rewriteCache($value);
}
}
public function rewriteCache($term_id){
$this->redis->del('trash');
$this->redis->del('untrash');
$this->redis->del('editpost');
$this->getPostsDB($term_id);//從資料庫獲取資料
}
}
更新快取這裡,寫的挺渣的,希望有大牛可以指正,先謝為敬