WordPressでキャッシュをプリロードするプラグイン 「Generate Cache」

WordPressでキャッシュをプリロードするシンプルなプラグイン 「Generate Cache」を紹介します。古いプラグインなので現在のWordPressでも実行できるように改良します。ついでに日本語版も提供します。

広告 (下に続く)

需要はあるのか

W3 Total Cache プラグインなどでプリロードする機能は搭載されています。しかしながら、複雑さゆえ、負荷が大きくなったり、動作しているのかしていないのかよくわからなかったり…といった欠点があります。

広告 (下に続く)

シンプルな仕組みのプリロードプラグイン

「Generate Cache」のプリロード作業は、卓球のように、2つのPHPがお互いに呼び合ってサイトにアクセスし続けます。そのシンプルさ故、タイムアウトが短く設定されたサーバーだったり、弱いサーバーだったりしてもわりと安定して動作します。ちなみに、画像内「ran」はすべて「run」のスペルミスです。見逃してください…。

Generate Cache の仕組み

しかしそのままでは使えない…

しかしながら、最新版が登場してから5年以上更新されていません。そのままではデータベースエラーが発生して現在のWordPressではエラーが発生します。(動作はします)

不具合を修正する

※プラグインフォルダ内の「functions.php」です。テーマフォルダの「functions.php」ではありません。

functions.phpの次を修正します。「global $wpdb;」が定義される前に「$wpdb」が参照されていることによるデータベースエラーを修正します。

67-71行目

if ( $options['gen_cache_pages'] == 1 ) {
 $querystr = "SELECT $wpdb->posts.* FROM $wpdb->posts WHERE $wpdb->posts.post_status = 'publish' AND $wpdb->posts.post_type = 'page' ORDER BY $wpdb->posts.post_title ASC";
 
 global $wpdb;
 $pageposts = $wpdb->get_results($querystr, OBJECT);

 $querystr = "SELECT $wpdb->posts.* FROM $wpdb->posts WHERE $wpdb->posts.post_status = 'publish' AND $wpdb->posts.post_type = 'page' ORDER BY $wpdb->posts.post_title ASC";

 $pageposts = $wpdb->get_results($querystr, OBJECT);

の太文字部分を削除します。

if ( $options['gen_cache_pages'] == 1 ) {
 global $wpdb;

 $querystr = "SELECT $wpdb->posts.* FROM $wpdb->posts WHERE $wpdb->posts.post_status = 'publish' AND $wpdb->posts.post_type = 'page' ORDER BY $wpdb->posts.post_title ASC";

 $pageposts = $wpdb->get_results($querystr, OBJECT);

また、functions.phpの次を修正します。既に非推奨となった関数が使用されていることによるNoticeを修正します。

54行目

$category_ids = get_all_category_ids();

を次のように修正します。

$category_ids = get_terms('category');

さらに、設定のチェックを外すと発生するNotice「Undefined index」を防止したい場合はfunctions.phpの次を修正します。

40行目の次の行に次を追加します。無理矢理ですが…。

if(!isset($options['gen_cache_home']))$options['gen_cache_home']=0;
if(!isset($options['gen_cache_posts']))$options['gen_cache_posts']=0;
if(!isset($options['gen_cache_cats']))$options['gen_cache_cats']=0;
if(!isset($options['gen_cache_tags']))$options['gen_cache_tags']=0;
if(!isset($options['gen_cache_pages']))$options['gen_cache_pages']=0;

さらに、未設定の状態で発生するNotice「Undefined index」を防止したい場合はgenerate-cache.phpを修正します。

234行目

if ( isset( $options['gen_cache_final_dir'] ) ) {

を次のように修正します。

if ( empty ( $options['gen_cache_final_dir'] ) == false ) {

機能追加をする

Autoptimizeプラグインのように、ツールバーにステータスを表示できるようにします。generate-cache.phpの最下部に追加します。

function generate_cache_admin_bar_menu($wp_admin_bar){
 if(file_exists(WP_PLUGIN_DIR . '/generate-cache/generation_running'))$ab_label='Generating Cache...';
 else $ab_label='Generate Cache';
 $wp_admin_bar->add_menu(array(
 'id'=>'generate_cache_admin_bar_menu',
 'meta'=>array(),
 'title'=>'<span class="ab-icon"></span><span class="ab-label">'.$ab_label.'</span>',
 'href'=>site_url().'/wp-admin/options-general.php?page=generate-cache%2Fgenerate-cache.php',
 ));
}
add_action('admin_bar_menu', 'generate_cache_admin_bar_menu', 999);

普段はこのようになってます。

ツールバー

実行中は次のように表示されます。

screenshot_1

さらに、初期状態ではトリガー発動はテーマのwp_footerでしかフックがかけられていませんが、管理画面のwp_footer、さらにwp-cronの1時間ごとにもフックをかけます。

generate-cache.phpの最下部に追加します。

add_action('admin_footer', 'triggerCache');
add_action('generate_cache_hourly', 'triggerCache');
if (is_admin()) {
 register_activation_hook(__FILE__,'generate_cache_activation');
 register_deactivation_hook(__FILE__,'generate_cache_deactivation');
}
function generate_cache_activation() {
 wp_schedule_event(time(), 'hourly', 'generate_cache_hourly');
}
function generate_cache_deactivation() {
 wp_clear_scheduled_hook('generate_cache_hourly');
}

最後に、任意の文字列にユーザーエージェントを設定します。面倒くさいのでハードコードします。

functions.phpの116行目に改行して次を追加します。

$out.= "User-Agent: Generate-cachern";

さらに、27行目に改行して次を追加します

curl_setopt($ch,CURLOPT_USERAGENT,'Generate-Cache');

広告 (下に続く)

日本語化

私が現在使用している、ここまでの修正と日本語化を行ったプラグインをこちらからダウンロードできます。そのままプラグイン管理画面にアップロードしてインストールできます。ライセンスなどは元プラグインと同様です。

部分のみ適用されていません。お手数をおかけしますが手動で追加してください。

ダウンロード (ウイルスチェック結果)

日本語化

シェアする