お手軽に管理しやすいWordPressテーマを目指すとっても簡単なTips

これは前に書いたブログの記事を再編集したものです。

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

ちなみに自分はfunctions.phpに1万行も書かれているような案件には配属されたことなくて、せいぜい1000行くらいだったきがする。(もう書くことは殆ど無いけど)

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

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

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

before

<?php

// home.php

$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

<?php
  // home.php
  $query = getMainLoop();

  if ($query->hava_posts() ) : $query->the_post();
?>
<?php 
// functions.php
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の設定値が配列地獄になってしまうのはどうしようもないので、後方互換性を切り捨てた、次世代型のWP_Queryに期待しましょう。

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

各役割ごとにファイルを分けてfunctions.phpを管理する

具体的なコード例

<?php
  // functions.php
  require_once('/lib/functions/admin.php');
  require_once('/lib/functions/model.php');
<?php
   // /lib/functions/admin.php
   //管理画面に関する処理....
<?php
// /lib/functions/model.php

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

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

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

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

そんなに大規模なものでないならクラス設計しないで、そのまま雑にさっさと書いたほうが早いし、簡単。

個人的にはWordPressMVCみたいなのをいちいち書くのはアホらしいと感じてて、そこまでするんだったら、さっさとWordPress捨てて、何かフレームワーク使ったほうが絶対に幸せなのにな。っていつも思ってる。(事情があって使っているのはわかるけれども…)

無名関数を使ってフィルターイベントを書く

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

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

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

before

<?php

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

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;
});

配列の短縮構文をちゃんと使おう

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

ちゃんとサポートされているバージョンで開発しているのであれば、積極的に利用しましょう。 php 5.4以下をサポートする必要がないのに、使わない理由はまったくないと思ってください。 arrayなんでタイプしている暇があればもっと他のことに時間を使いましょう。

PHP: 配列 - Manual

before

<?php 
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' ),
        ),
      ),
    ),
  ));
}

after

<?php 
function getMainLoop()
{
  return new WP_Query([
    'post_type' => 'post',
    'tax_query' => [
      'relation' => 'OR',
      [
        'taxonomy' => 'category',
        'field'    => 'slug',
        'terms'    => [ 'quotes' ],
      ],
      [
        'relation' => 'AND',
        [
          'taxonomy' => 'post_format',
          'field'    => 'slug',
          'terms'    => [ 'post-format-quote' ],
        ],
        [
          'taxnoomy' => 'category',
          'field'    => 'slug',
          'terms'    => [ 'wisdom' ],
        ],
      ],
    ],
  ]);
}