オライリー・ジャパン: WordPressによるWebアプリケーション開発 (Rakhitha Nimesh Ratnayake,2014)

データベースへのクエリの発行

P.82
WP_Queryのデフォルトの使い方は、まず、配列にすべてのフフィルタリング条件を追加しなかればなりません。WP_Queryクラスを使うとカテゴリ、タグ、投稿メタデータなど、複数のテーブルにまたがって条件を指定できる。このテクニックを活用すると、SQLコードのことを心配せずに非常に複雑なクエリを作ることができる。

   $args = array(
     'post_type' => 'projects',
     'meta_query' => array(
       'key' => 'language'),
       'key' => 'PHP'),
     )
    )
   );

 WP_Queryクラスのメリットは、拡張(継承)してアプリケーション固有の要件をサポートするカスタムクラスを作れることだ。

P.83
デフォルトのWP_Queryクラスは、あらゆるカスタム投稿タイプに対して同じように動作する。Webアプリケーションでは、特定の性質を備えた複数のカスタム投稿タイプが必要になることが多い。たとえば、開発者は私たちのポートフォリオ管理アプリケーションのなかにサービスを作ることができる。各サービスには、価格とプロセスがある。それらの情報のないサービスを取り出しても意味がない。

WP_Queryクラスを使ったデフォルトの方法は、データベースからサービスを取り出すという仕事を完璧にこなす。しかし、サービスを取り出す過程でテーブルの結合(ジョイン)をするために毎回価格とプロセスのキーを渡さなければならない。これはサービス固有の要件なので、WP_Queryを拡張するカスタムクラスを作れば、すべてのサービス関連で共通している引数の指定を省略できる。WP_Queryを拡張するカスタムクラスは、次のようにして実装する。

class WPWA_Service_Query extends WP_Query
 function __construct( $args = array() )
 {
   $args = wp_parse_args( $args, array(
     'post_type' => 'service',
     'meta_query' => array(
       array( 'key' => 'price'),
       array( 'key' => 'process'),
     ),
    )
   );
  parent::__construct($args) ;
 }
}

これで、共通条件はすべてWPWA_Service_Queryのなかに抽象化された。いちいち条件を渡す必要はなくなったのである。上の例はクラスの継承の基本的な形態を示している。これでサービスには引数なしで次のコードを呼び出せばアクセスできるようになった。

$query = new WPWA_Service_Query() ;

この文献を参照している記事

WP_Queryの拡張