HOME>WEBプログラム覚書>[WordPress] get_header()とwp_head()を捨てる。

[WordPress] get_header()とwp_head()を捨てる。

捨てることで何かメリットがあるかと言うと残念ながら特にありませんので、この内容をオススメしてるわけではありません。

僕はWordPressらしさ?を求められる場合は別ですが、個人的に利用する場合はget_header()、wp_head()は使いません。 理由としてはフロントに干渉しすぎでウザいのとプラグインに頼らず生きていく術を身につけるためです。

といってもwp_head()は公開サイト用の関数なので標準的なサイト制作の能力がある人であれば、ほとんど困ることはないんじゃないでしょうか。

というわけでget_header()とwp_head()は捨ててCakePHPのエレメントっぽくしてみます。

header.phpとfooter.php

header.phpとfooter.phpはこんな感じにしておきます。

header.php

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title><?php echo isset($title) ? $title . ' &lt; ': ''; ?>WordPress3.3.1日本語版</title>
  6. <link rel="stylesheet" type="text/css" media="all" href="http://331.wordpress.com/wp-content/themes/default/style.css" />
  7. <?php
  8. if (isset($page_css)) {
  9.    printf('<link rel="stylesheet" type="text/css" media="all" href="http://331.wordpress.com/wp-content/themes/default/%s.css" />' . PHP_EOL, $page_css);
  10. }
  11. ?>
  12. <link rel="pingback" href="<?php bloginfo( 'pingback_url' ); ?>" />
  13. <?php do_action('my_wp_head'); ?>
  14. </head>
  15.  
  16. <body>
  17.  

do_action('my_wp_head')は保険で付けてるだけなので無くてもいいです。

footer.php

  1. </body>
  2. </html>
  3.  

functions.php

でfunctions.phpにはget_header()の代わりに使うWP_MyUtil::load()を定義しときます。

functions.php

  1. <?php
  2. class WP_MyUtil
  3. {
  4.     /**
  5.      * ファイルの場所。基本的にTEMPLATEPATH
  6.      * @var string
  7.      */
  8.     private $include_path = '';
  9.  
  10.     public function __construct()
  11.     {
  12.         $this->include_path = dirname(__FILE__);
  13.     }
  14.  
  15.     /**
  16.      * ファイル読み込み用のメソッド
  17.      *
  18.      * @param string $type elements
  19.      * @param string $filename filename
  20.      * @return string
  21.      */
  22.     public function load($type, $filename, $vars = array())
  23.     {
  24.         switch ($type) {
  25.             case 'elements':
  26.                 return $this->loadElements($filename, $vars);
  27.                 break;
  28.         }
  29.     }
  30.  
  31.     /**
  32.      * PHPファイルの読み込み結果を返す。
  33.      *
  34.      * @param string $filename 読み込むファイル名
  35.      * @param array_type $vars 読み込むファイルで利用する変数
  36.      * @throws Exception
  37.      * @return string
  38.      */
  39.     private function loadElements($filename, $vars = array())
  40.     {
  41.         $path_to_file = $this->include_path . DIRECTORY_SEPARATOR . $filename;
  42.  
  43.         if (file_exists($path_to_file) && is_readable($path_to_file)) {
  44.             ob_start();
  45.             extract($vars);
  46.             require_once $path_to_file;
  47.             return ob_get_clean();
  48.         } else {
  49.             throw new Exception($path_to_file . 'が存在しないか読み込めません。');
  50.         }
  51.     }
  52. }
  53.  
  54. class CallBacks
  55. {
  56.     public static function my_wp_head()
  57.     {
  58.         // 本当に必要なものだけフックする。
  59.         // とりあえずエディタだけ表示してみる。
  60.  
  61.         //add_action( 'my_wp_head',             'wp_enqueue_scripts',              1     );
  62.         //add_action( 'my_wp_head',             'feed_links',                      2     );
  63.         //add_action( 'my_wp_head',             'feed_links_extra',                3     );
  64.         //add_action( 'my_wp_head',             'rsd_link'                               );
  65.         //add_action( 'my_wp_head',             'wlwmanifest_link'                       );
  66.         //add_action( 'my_wp_head',             'adjacent_posts_rel_link_wp_head', 10, 0 );
  67.         //add_action( 'my_wp_head',             'locale_stylesheet'                      );
  68.         //add_action( 'my_wp_head',             'noindex',                          1    );
  69.         //add_action( 'my_wp_head',             'wp_print_styles',                  8    );
  70.         //add_action( 'my_wp_head',             'wp_print_head_scripts',            9    );
  71.         add_action( 'my_wp_head',             'wp_generator'                           );
  72.         //add_action( 'my_wp_head',             'rel_canonical'                          );
  73.         //add_action( 'my_wp_head',             'wp_shortlink_wp_head',            10, 0 );
  74.     }
  75. }
  76.  
  77. $wmu = new WP_MyUtil();
  78. add_action('my_wp_head', CallBacks::my_wp_head());
  79. ?>

home.php

でhome.php。load()の第3引数で設定している連想配列のキーは、呼び出すファイル内で変数名として利用できます。

home.php

  1. <?php
  2. echo $wmu->load('elements', 'header.php', array(
  3.                                             'title'    => 'HOME',
  4.                                             'page_css' => 'home'
  5.                                           ));
  6. ?>
  7.  
  8. test
  9.  
  10. <?php
  11. echo $wmu->load('elements', 'footer.php');
  12. ?>
  13.  

でもってホームにアクセスすると出力はこうなります。

home.php

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>HOME &lt; WordPress3.3.1日本語版</title>
  6. <link rel="stylesheet" type="text/css" media="all" href="http://331.wordpress.com/wp-content/themes/default/style.css" />
  7. <link rel="stylesheet" type="text/css" media="all" href="http://331.wordpress.com/wp-content/themes/default/home.css" />
  8. <link rel="pingback" href="http://331.wordpress.com/xmlrpc.php" />
  9. <meta name="generator" content="WordPress 3.3.1" />
  10. </head>
  11. <body>
  12. test
  13. </body>
  14. </html>
  15.  

get_header()を利用するときと何が違うかというと、タイトルやロードするCSSをheader.phpで決定するのではなくhome.phpで決めてるという点です。

投稿ページでkeywordとdescriptionを表示したい場合

header.phpに下記を追記します。

header.php

  1. <?php
  2. if (isset($keyword)) {
  3.     printf('<meta name="keywords" content="%s" />', $keyword);
  4. }
  5.  
  6. if (isset($desc)) {
  7.     printf('<meta name="description" content="%s" />', $desc);
  8. }
  9. ?>

single.phpでのheader.phpの呼び出しを下記のように記述します。

single.php

  1. <?php
  2. // カスタムフィールド
  3. $_fields = get_post_custom((int) $post->ID);
  4.  
  5. echo $wmu->load('elements', 'header.php', array(
  6.                                             'title'    => $post->post_title,
  7.                                             'page_css' => 'single',
  8.                                             'keywords' => $_fields['keyword'],
  9.                                             'desc'     => $_fields['desc']
  10.                                           ));
  11. ?>

で、投稿時にカスタムフィールドでkeywordとdescを設定すればOK。

これをちょっと応用すると特定の投稿でcssやjavascriptをロードすることも可能です。

テンプレートからheader.phpに変数を送ることでどういうことができるか見えますでしょうか。 できることに違いはないんですが、面倒だったことが意外とあっさりすっきりできる気がしません?

捨てることで得られるもの失われるもの。

得られるもの。

  • add_action()してremove_action()とか、excelを立ち上げては消す暇な上司みたいな無駄なことをしなくてよくなる。
  • is_home()、is_single()とかの条件分岐やら関数やらでアクセスしないとheader.phpの出力がわからないとかがなくなる。

失われるもの。

  • WordPressらしさ。フックしてなんぼのWordPressのなかでも重要なwp_head()を外す行為は他人にしたらいい迷惑。なので仕事では使えません。
  • 便利なプラグインが使えない場合がある。

ちなみにheader.phpとfooter.phpは自分のテーマ以外からも呼ばれることがあるのでそのことは意識した方がよいです。デフォルト値を設定しておくとか。

この先。

やらなくてもわかりますが、これはそれほどいいものではありませんw

なのでもっと良くしようと進めていくと、やっぱり僕の大好きなビューとレイアウトを分けるに行きつきます。 誰かにプログラムをやって良かったことは?と聞かれたら、真っ先にビューとレイアウトを分ける方法を覚えられたことですと答えると思います。エンジニアのみなさん頭良すぎです。

ウェブ制作に携わる人は絶対覚えたほうがいいとおもってます。 CakePHP 2系も出たことだし、まだ触れたことない方はCakePHPに触れてみるいいチャンスだとおもいます。

そして2系の情報をブログに書いてもらえると僕はうれしい。

投稿日 2012年2月15日 04:19
カテゴリ PHP
タグ WordPress
トラックバック URL http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1269

コメント

コメントする
Name
Email Address
URL