homehome

template_redirectが便利

Published

TocMenu目次

WordPressのアクションフックでtemplate_redirectというものがある。タイミングはページを表示する直前で、よく利用するwp_headなどよりも若干早い。

  1. wp
  2. template_redirect
  3. get_header
  4. wp_head
  5. wp_enqueue_scripts
  6. wp_print_styles
  7. wp_print_scripts

投稿データは取得できており、投稿内容に応じて後の処理を分岐させることができる。

個人的な使い方

例えば表示ページの中に特定のタグやクラスが含まれるかを判別し、存在するならば特定のスクリプトコードやスタイルシートを読み込むといったことが可能。このブログも特定のコードが出てきたときのみ、必要なJavascriptとCSSを読み込むようにしている。以下は必要分のみ簡単に抜き出したコード。

// グローバルなフラグ
var $my_flag = false;

// 記事の中に特定のタグがあるか判別する
function my_template_redirect() {
  global $my_flag;
  $queried = get_queried_object();
  if ( is_single() ) {
    $cont = $queried->post_content;
    $ptn = //"何かしらの正規表現";
    if ( preg_match($ptn, $cont) ) {
      $my_flag = true;
    }
  }
}
add_action( 'template_redirect', 'my_template_redirect' );

// JavascriptとCSSの読み込み
function my_load() {
  global $my_flag;
  if ( !is_admin() ) {
    // 個別ページでフラグがTRUEならコードを読み込む
    if ( is_single() && $my_flag ) {
      wp_enqueue_style( 'xxx-css', get_template_directory_uri() . '/css/xxx.css');
      wp_enqueue_script( 'xxx-js',  get_template_directory_uri() . '/js/xxx.js');
    }
  }
}
add_action('wp_enqueue_scripts', 'my_load', 1);

こうすることで不要な外部ファイルを読み込まないようにして、HTTPリクエストの数を減らすことができる。要はデータベース処理のように、必要なときに必要な分だけ取ってくるという感じで使える。ただし、正規表現のため負荷はかかる。1000文字程度の記事だとほとんど変わらないけれども、あまりにも長文で解読に負荷がかかりすぎるものの場合は、素直に外部ファイルをロードした方がいいかもしれない。