読者です 読者をやめる 読者になる 読者になる

ファイヤードブログ

ディジタル・パブリッシングという観点から、Webサイト制作、電子書籍制作などを。※ブログリニューアル中

WordPressでカラムの値を指定して選択的に記事を引っ張ってくる方法

pitfalls WordPress

問題

 WordPressって複雑な問い合わせって無理なのかな…カラムの値を指定して条件に当てはまるものだけ並べたいんだけど。

解決法

 WP_Query()をカスタムフィールドと組み合わせて使えばいい。関数リファレンス/WP Query - WordPress Codex 日本語版

ケース

 サッカーチームをサイトで扱うとします。この場合、J1のチームだけ、J2のチームだけそれぞれのページで一覧として引き出したいというケースが出てくるはずです。WordPressではないケースであれば(スキーマを自由に作成できる場合であれば)、clubsテーブルを使って、そのうちのカラムの1つに「league」なり「division」なりを用意して、そこに「j1」「j2」と選別のための値を入れて、J1のチームを表示するならば繰り返し処理の前に「clubsテーブルのleagueカラムがj1か?」というチェックを、Railsならばerbかモデルクラスの中でやればいい*1。簡単な話。
 で、私はこういう処理(カラムの値をチェックして選択的に引き出す処理)はWordPressではできないのかな、と思っていました。少なくとも今回私が頼ったWordPressの入門書*2には上の方法は書かれていませんでした。まぁ、WordPessは元々はブログツールだしそこまで複雑な問い合わせはできないか、と半ば諦めていました*3。ですがそれと同時に、カスタムフィールドで選別用のカラムを用意することができるのだから、原理的には不可能なはずはない、という考えもいつまでも残っていました。そしてようやく昨日WP_Query()と出会った、というわけです。
 やり方としては、未だ実際に試してみてはいないのですが、codexの例を真似て以下のようにやればちゃんとj1のチームだけ引っ張ってきてくれるでしょう。WP_Queryがテンプレートタグではなくてクラスであることに留意します。

<?php
// クエリ
$the_query = new WP_Query( array( 'meta_key' => 'league', 'meta_value' => 'j1' ) );
// ループ
while ( $the_query->have_posts() ) : $the_query->the_post();
//<table>や<ul>などでチーム名やロゴを一覧表示する処理
endwhile;
// 投稿データをリセット
wp_reset_postdata();
?>

 ※実際にこれで成功したらいずれ以下に追記します。ただ、複雑な問い合わせが無理だと言う前提で開発してきたので、抜本的に手入れしないとだめだろうなと危惧している…

                            • -

宣伝

WordPress実装でこのたび女子サッカーの情報サイトを作成いたしました。
nelkeoeillet.com (ねるけういえどっとこむ)
中断している連載で言っていたサイトです。

*1:ああ、もうすっかり忘れてしまっている。やろうと思えばコントローラーでもできるよな…。

*2:WordPressの教科書2』(プライムストラテジー株式会社著)と『WordPressをちゃんと使うための教科書』の2冊です。

*3:奥の手として、j1はj1で、j2はj2でそれぞれカスタム投稿として定義するか、あるいはID値をget_permalink()で指定するかという回避策を考えていました