WordPressでちょっとした項目をキャッシュしておく関数

WordPressでちょっとした項目をキャッシュしたい!というそんな要望からキャッシュ関数を作りました。

/**
* To cache data on wp_options.
* $callback function is call and store its data as serialized object.
* An optionname used in this function is  _periodic_cache_.$callback as defaul\
t.
*
* @return mixed */
function cache_($cache, $periodic = '1 hour', $param = array(),
$optionname = ''){
$optionname = $optionname
? $optionname
: '_periodic_cache_'.$callback;
$obj = get_option($optionname);
// revert $periodic to present time
if ($obj->modified < (time()*2 - strtotime($periodic)) ) {
$obj = new StdClass();
$obj->data = call_user_func_array($callback, $param);
$obj->modified = time();
update_option($optionname, $obj);
} else {
}
return $obj->data;
}

function c_($callback, $periodic='',$param = array(), $optionname=''){
return periodic_cache($callback, $periodic, $param, $optionname);
}

}

使い方は至って簡単。この関数の戻り値をキャッシュしたいな~、という時にこのキャッシュ関数を経由して呼び出せばOK。

例えばget_recent_posts()なんていう、最近の投稿一覧を取得する関数を作って、その値をキャッシュしたいのであれば


$posts = cach_('get_recent_posts', '20 hour', $param);

とすればおk。内部ではget_recent_posts()を$paramを引数として呼び出す。前回の呼び出しから20時間以内であればキャッシュを使用する。

これで簡単なものはキャッシュから読み出せるね。

削除の関数とかは作ってないよ。必要になったら作るかな~。

wordpressでよく引っかかる関数とか

ブログ全体に存在するカテゴリ(カスタムタクソノミー)全体の取得: get_categories()
ブログ全体に存在するカテゴリ(カスタムタクソノミー)全体の取得: get_terms()
ある記事のカテゴリ(カスタムタクソノミー)全体の取得: get_the_terms()
ある記事のカテゴリ(カスタムタクソノミー)全体の表示: the_terms()

あるタクソノミーのリンクを取得: get_term_link();
あるタクソノミーのオブジェクトを取得(id指定): get_term();
あるタクソノミーのオブジェクトを取得(名前他指定): get_term_by();

eximで”temporarily rejected RCPT”というエラーに遭遇

メール送信、受信のSMTPサーバ、eximをテストしているときにエラーに遭遇した。


2013-05-08 00:36:05 H=mail.example.net [192.0.2.1] F=<[email protected]> temporarily rejected RCPT <[email protected]>: LDAP search: no results

どうやらメールを一時的に拒否している、というメッセージのようだ。
courier-mtaの時もそうだったが、存在しないアドレスに一定数送信するとエラーになる模様。
courier-mtaの頃にはbanリストの表示とbanリストからの削除コマンドがあったけれど、eximには無いらしい。

代わりにサービスを再起動するとリストはクリアされた。
送信試験などをしているときにこれにハマるとやっかいなのでメモメモ。


> sudo service exim restart

ブログの記事が見つからなかったときトップページに飛ばす方法

WordPressの記事が見つからなかったときにトップページに飛ばす方法について。404 on chrome

WordPressで記事を書いたり作ったりしていると記事が無いことがある。原因は主に二通りで、一つはリンク先のアドレスを間違えてしまったリンクミス、もう一つは過去には存在したけれど削除されてしまったケース。

これらのケースにおいてWordPressではどんな対応を取るべきなだろうか。

WordPressではデフォルトで404.phpというテーマファイルがくっついてくる。
これはHTTP Status Codeが404の場合、つまり記事が見つからなかった場合に表示されるページのテーマだ。
“おっと、失礼しました。”と表示されるのはこの404.phpが表示されるケースだ。

ブログの運営方針にもよるが、今回は記事が見つからなかった場合にトップページに飛ばすことにした。
ここで注意しなければいけないことが二点。
一つはトップページに“飛ばす”ということ。実はテンプレートヒエラルキーなんていうムズカシイ言葉があって、404.phpを削除するだけで”記事が見つからなかった場合にトップページを表示“させることができる。このやり方だと見た目はトップページなんだけれどURLが無くなった記事そのままになってしまう。これはダサい。
注意点の二つ目はHTTP Status Code。HTTPステータスコードというのはブラウザに送る機械的な意味だ。良く目にする404というのは”記事が見つかりませんでした”という意味を確実に的確に機械的にブラウザに伝えるための番号なのだ。
さて実はこのHTTPステータスコードなんだけれど、その確実性ゆえ、検索エンジンにも番号は理解される。つまり記事ID123番のページに検索エンジンのボットが来た、でも記事がないよーというとき、404を返しておけば「このページは削除されたんだね」と解釈してくれる。(厳密にはそうで無い場合もあるのだけれど)
なので極力このステータスコードを返してあげた方が良い。

というわけでfunctinons.phpあたりにこのへんをまとめて書いてみた。


add_action('wp_head', 'redirectToIndex');
function redirectToIndex() {
if (is_404()) {
header('HTTP/1.0 404 Not Found');
header('Location: '.get_bloginfo('url').'/');
}
}

これで404を送りつつLocationを指定してページをジャンプさせることができる。Locationの行を変えることでジャンプ先を任意のページにすることもできる。

 

おわりに
HTTPステータスコードはなんだかなじみが無くてなかなか利用価値がわからなかったりするんだけれど、例えばサーバの負荷を減らすためのキャッシュの制御だったりだとか、一時的なメンテナンスを通知したりだとか、そういった用途に使える。
とくにメンテナンス通知に使われる503は日時指定もできて何時何分ごろには復旧しますよー、なんてこともできたりする。
検索エンジンにメンテナンス画面がキャッシュされてしまうことも防げたり、これは防げないこともあったり。でも気を遣うに超したことはないよね。

 

というわけで404をリダイレクトでジャンプさせる、でした。