1. 程式人生 > >利用wordpress資料庫寫API,附加文章redis快取[菜雞簡單粗暴版]

利用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.尋找資料所在表,以及表之間關係
這個還是上圖吧,老規矩,用不到的沒在圖中顯示
wordpress 部分表關係圖

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
來個結構圖吧
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);//從資料庫獲取資料
        }
    }

更新快取這裡,寫的挺渣的,希望有大牛可以指正,先謝為敬