WordPressの処理毎にキャッシュして軽量化

WordPress

W3 Total CacheやQuick Cacheといった、
サイトをまるごとキャッシュ化してくれるプラグインはあるのですが、
基幹システム等、キャッシュできない処理があった場合には、
ページ全体ではなく個別にキャッシュしたい時があります。

スポンサーリンク

Transients API

データの取得(保存名)
get_site_transient(‘post_list_data’)

データの保存(保存名, 実行データ, キャッシュタイム)
set_site_transient(‘post_list_data’, $$post_data, 3600 * 24 );

データの破棄(保存名)
delete_site_transient(‘post_list_data’);

<?php
    //保存データが在れば、データを読み込んで処理をスルー
    $post_data = get_site_transient('post_list_data');
    if ( !$post_data ) {
        
        //保存データがない場合処理を実行
        $args = array(
            'numberposts'   => 5
        );
        $posts = get_posts($args);
        if($posts){
            foreach($posts as $post){
                setup_postdata($post);
                $post_data .= '<p>'. get_the_time("Y/n/j") .'<a href="'. get_permalink() .'">'. $post->post_title .'</a></p>';
            }
            wp_reset_query();
        }
        
        //実行した結果情報をDBに保存
        set_site_transient( 'post_list_data', $post_data, 3600 * 24 );
    }
    
    //データを表示
    echo $post_data;
?>

Transients APIでは、wp_options テーブルにデータを保存しておくので、
アクセス超過で、根本的にトラフィック不足で、DBへの接続がままならない場合は、
オブジェクトキャッシュを使うなどその他の対策も必要になってきます。

キャッシュクリア方法

上記の内容だけでは、キャッシュタイムが切れるまで、表示部分が変わることはありません。
記事を更新したり、削除した際にも変わらないので、更新した際に保存データを破棄する必要があります。

データの破棄する下記コードをfunctions.phpに入れてください。

function clear_transient_cache() {
    delete_site_transient( 'post_list_data' );
}

//投稿が公開された際、または公開済み投稿の情報が編集された際に実行する。
add_action( 'publish_post', 'clear_transient_cache' );

//投稿またはページが削除された直後に実行する。
add_action( 'deleted_post', 'clear_transient_cache' );

実行タイミングのアクション時のフック一覧は、こちらを参照ください。

コメント

スポンサーリンク
タイトルとURLをコピーしました