驚くほどシンプルでイカしたwordpressテーマ「wsc7」をカスタマイズしよう – その7 – キャッシュを利用する

一連の記事→wordpressテーマをカスタマイズしよう Archives – aoringo works

ワードプレスではあらゆる場所でphp関数が走ります。例えば一週間に一記事投稿するとしても、人が来る度に毎回「記事があるかどうか走査→新着分5件を表示」という動作をします。

勿体なくないですか? 検索ページなどは毎回単語が変わるのでその限りではありませんが、カテゴリ一覧、記事一覧、etc、etc、ちまたでは色々な高速ツール、プラグインを勧める記事がありますが、自身でも高速化の対策をしていく必要があります。

もしやもすると高速化プラグインには今回の記事の内容を行うモノもあるかもしれませんが、今回は自分で用意しますよ。

ワードプレスでキャッシュを利用するには、プラグイン、pearの該当パッケージを使う方法がありますが、wordpress自体にも用意されています。

Transients API – WordPress Codex 日本語版

指定したデータをwordpressのデータ領域に一定時間保存します。

「set_transient(‘special_query_results’, $special_query_results, 60*60*12); 」

これだけで「 $special_query_results」の内容を「special_query_results」という場所を作り12時間保存します。

if (false === ($value = get_transient('value'))) {
      // Transientが存在しない場合、この部分のコードが実行されます。
      $value = // ここで Transient の値を設定し直します
 }

とすればキャッシュがあるかどうかで分岐させることができます。簡単ですね。

早速使ってみましょう。

トップページ、インデックスは一番最初に見られる場所です。

どんなに格好良く決めても表示までの時間がかかればげんなりです。実際、そこまで時間がかかることは無いでしょうが、トップページが軽いのにこしたことはないです。

実際どれだけの時間が変わるのか? 計測用関数を作って実測していくのもよいでしょう。

/**
 * タイム計測開始
 */
function starttime(){
 return microtime(true);
}
/**
 * タイム計測終了
 */
function stoptime($time){
 echo microtime(true) - $time;
 return;
}

マイクロ時間でスタート、終了時に-計算します。

<?php $indexpage = starttime();?>
 <?php if (have_posts()) : ?>
 <?php while (have_posts()) : the_post(); ?>
↓
メイン表示:<?php stoptime($indexpage)?>

実際に利用するのはこんな感じ。

うん、むちゃくちゃ早いですな。別にこのままでもいいんじゃない? と思わなくも無い。しかしものは試しに、キャッシュ機能をつけてみます。

・・・その前に、

<?php if (have_posts()) : ?>
 <?php while (have_posts()) : the_post(); ?>
 <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
 <h2 class="entryTitle"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
 <div class="entry-summary">
 <?php if ( has_post_thumbnail() ) { ?>
 <a href="<?php the_permalink(); ?>" class="thumbnail-align"><?php the_post_thumbnail( 'thumbnail' ); ?></a>
 <?php the_excerpt(); ?>
 <?php } else { ?>
 <?php the_excerpt(); ?>
 <?php } ?>

</div>
 </div>
 <hr />
 <?php endwhile; ?>

これを一式、直接出力ではなくキャッシュに取り込むために修正しなければなりません。

・・・というかそもそも新着記事一覧、ページがあるのは確実なのだからif文なくてもいいんじゃね?

while(have_posts()) {
 the_post();
 $parm = get_permalink();
 $title = get_the_title();
 $thum_id = get_post_thumbnail_id($post->ID);
 $topimage = wp_get_attachment_image_src($thum_id, 'thumbnail');
 $exp = get_the_excerpt();
 $topsrc = $topimage[0];
 $topposts .= <<<"EOD"
 <div id="post-{$post->ID}" class="post-{$post->ID} post type-post status-publish format-standard hentry">
 <h2 class="entryTitle"><a href="$parm">$title</a></h2>
 <div class="entry-summary">
EOD;
 if(has_post_thumbnail()) {
 $topposts .= '<a href="' . $parm . '"' . 'class="thumbnail-align"><img width="150" height="150" src="' . $topsrc . '"class="attachment-thumbnail wp-post-image" alt="' . $title . '" /></a>' . $exp;
 }
 else {
 $topposts .= $exp;
 }
 $topposts .= '</div></div><hr/>';
 echo $topposts;
 } ?>

全てを変数へと代入し、それを出力するという形にしてみました。

これだけで結構変わるもんですね。一度に出力する分こちらの方が早いのかもしれません。これはキャッシュ化してもいまいち何もかわらないかもしれません。

if (false === ( $topposts = get_transient('topposts') ) ) {
 // Transient データがなかったら、データを生成して保存する
 echo "キャッシュ生成";
 while(have_posts()) {
 the_post();
 $parm = get_permalink();
 $title = get_the_title();
 $thum_id = get_post_thumbnail_id($post->ID);
 $topimage = wp_get_attachment_image_src($thum_id, 'thumbnail');
 $exp = get_the_excerpt();
 $topsrc = $topimage[0];
 $topposts .= <<<"EOD"
 <div id="post-{$post->ID}" class="post-{$post->ID} post type-post status-publish format-standard hentry">
 <h2 class="entryTitle"><a href="$parm">$title</a></h2>
 <div class="entry-summary">
EOD;
 if(has_post_thumbnail()) {
 $topposts .= '<a href="' . $parm . '"' . 'class="thumbnail-align"><img width="150" height="150" src="' . $topsrc . '"class="attachment-thumbnail wp-post-image" alt="' . $title . '" /></a>' . $exp;
 }
 else {
 $topposts .= $exp;
 }
 $topposts .= '</div></div><hr/>';
 }
 set_transient('topposts', $topposts,10);
 }
 echo $topposts
 ?>

キャッシュを導入してみました。三行程度足しただけですね。

初回。データベースに書き込むのでそれだけ時間がかかってますね。

二回目です。むっちゃ早くなってる・・・・。

0.013/0.0009130=14.444444

なので14倍の速度ですかね(計算あってるかな・・・・)。

初回は保存に時間が少しかかるが、その後はむちゃくちゃ早い。導入するかどうかは各々で決めて下さいね。

私は一ヶ月ほどの期間設定で導入しようかと思います。

一連の記事→wordpressテーマをカスタマイズしよう Archives – aoringo works