お手軽に管理しやすいwordpressテーマを目指す

こんにちは。 みなさん、phpを書いていますか? 簡単なphpコードとwordpressの関数を使用すれば、とっても管理しやすい、 Wordpressのテーマが出来上がることを知っていますか? 今日は、あまりphpの詳しくない方でも簡単に今から初められるモダンなwordpress環境 への手引きを記載していきたいと思います。

home.phpなどのテンプレートファイルにWP_Queryとかたくさん書いてあってグチャグチャ

何でもかんでもテンプレートファイルに書くのはやめて、functions.phpに書こう

この書き方をすることによって得られるメリットはご覧になって分かる通り、 home.phpのコード量が減るだけでなく、関数名を付けることができるので、 「このWP_Queryが何を取得しているのか」を非常に把握しやすくなる。

[before]

before_home.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$query = new WP_Query(array(
  'post_type' => 'post',
  'tax_query' => array(
      'relation' => 'OR',
      array(
          'taxonomy' => 'category',
          'field'    => 'slug',
          'terms'    => array( 'quotes' ),
      ),
      array(
          'relation' => 'AND',
      array(
              'taxonomy' => 'post_format',
            'field'    => 'slug',
            'terms'    => array( 'post-format-quote' ),
      ),
      array(
          'taxnoomy' => 'category',
        'field'    => 'slug',
        'terms'    => array( 'wisdom' ),
      ),
      ),
  ),
));

if ( $query->have_posts() ): $query->the_post();
?>

[after]

home.php
1
2
3
4
5
<?php
  $query = getMainLoop();

  if ($query->hava_posts() ) : $query->the_post();
?>
functions.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  function getMainLoop()
  {
      return new WP_Query(array(
          'post_type' => 'post',
          'tax_query' => array(
              'relation' => 'OR',
              array(
                  'taxonomy' => 'category',
                  'field'    => 'slug',
                  'terms'    => array( 'quotes' ),
              ),
              array(
                  'relation' => 'AND',
            array(
                      'taxonomy' => 'post_format',
                    'field'    => 'slug',
                    'terms'    => array( 'post-format-quote' ),
            ),
            array(
              'taxnoomy' => 'category',
              'field'    => 'slug',
              'terms'    => array( 'wisdom' ),
            ),
              ),
          ),
      ));
  }

WP_Queryの設定値が配列地獄になってしまうのはどうしようもないので、後方互換性を切り捨てた、次世代型のwordpressに期待してみよう。

functions.phpがカオスになってきてしまった。

各役割ごとにファイルを分ける

具体的なコード例

functions.php
1
2
3
<?php
  require_once('/lib/functions/admin.php');
  require_once('/lib/functions/model.php');
lib/functions/admin.php
1
2
3
<?php

      //管理画面に関する処理....
lib/functions/model.php
1
2
3
4
5
6
7
8
9
10
<?php

  //WP_Queryを中心とした、データを取得・操作する処理....

  function getCategories()
  {
      return WP_Query(array(
          //....
      ));
  }

別にルールとかはなんでもいいのだけど、 1ファイルに全部まとまらないように書いていくのが重要だと思っている。

ちなみに僕は小規模なテーマであれば、クラスとかは使わないで、 データを取得するロジックは lib/functions/model.php, 管理画面に機能を追加するロジックは lib/functions/admin.phpに … と言った感じにざっくり分けて書いている。 そんなに大規模なものでないなら、クラス設計しないで、そのまま書いたほうが多分早い。

2.無名関数で書く

※ これはphp5.3以降で使用できるTipsなので、使用する場合はphpのバージョンを確認してから使用するようにしましょう。

これはwordpressのhook処理を追加する時に重宝するTipsです。 関数名が他のものと被ってしまうと処理がうまく行かなかったりするかもしれません。 この書き方ではそれを解決し、それぞれのadd_filterを追加する時に関数名を気にしないでもいいことに有ります。

しこれを使用すると、他の部分で使いまわすことができなくなるので、いろいろなhookで同じ処理を使い回したいときは、この書き方をするべきではないでしょう。 他のHook処理等に使いまわしていない処理はこのように積極的に無名関数で書いていって良いと思います。

before.php
1
2
3
4
5
6
7
8
9
add_filter('the_excerpt_rss','add_thumbnail');

function add_thumbnails($content){
  global $post;
  if(has_post_thumbnail($post->ID)) {
      $content = '<p>' . get_the_post_thumbnail($post->ID) . '</p>' . $content;
  }
  return $content;
}
after.php
1
2
3
4
5
6
7
add_filter('the_excerpt_rss',function($content){
  global $post;
  if(has_post_thumbnail($post->ID)) {
      $content = '<p>' . get_the_post_thumbnail($post->ID) . '</p>' . $content;
  }
  return $content;
});