get_postsやquery_postsがうまくいかない

 wordpressのget_postsのquery_postsで、期待した値が取れない、というのはよくあること(?)です。今回久々にwordpressを扱っていて、すごく基本的なところでハマったので、参考用にメモしておきます。
 get_postsとquery_postsの違いについては、あちこちで書かれているのでここでは触れません。簡単に言うとglobal変数に影響するか、ということですが、今回わたしはプラグインの中で使いたかったのでget_postsでした。
 また、「get_postsのデフォルト値のせいで期待した値が取れない」というパターン(特に取得件数)もネット上によく書かれています。wp-includes/post.phpの460行目あたりにget_postsがありますが、ここにデフォルト値がベタ書きされていますので確認してみたください。

$defaults = array(
‘numberposts’ => 5, ‘offset’ => 0,
‘category’ => 0, ‘orderby’ => ‘post_date’,
‘order’ => ‘DESC’, ‘include’ => ”,
‘exclude’ => ”, ‘meta_key’ => ”,
‘meta_value’ =>”, ‘post_type’ => ‘post’,
‘suppress_filters’ => true
);

 また、setup_postdata($post)しなければならない、とか、query_postsの場合query_posts($query_string .””)やらwp_reset_query()やら初期化系の作業を入れないといけない、という解決策もあちこちでみかけますので、これらも一応チェックしてみてください。

 と言いつつ、今回のわたしのミスはもっと初歩的でした。
 get_posts渡す引数に、スペースを入れていたのです。
 例えば、get_posts
get_posts(‘category=1’)
 みたいな感じに引数を渡すと、これで絞りこまれたpost一覧が取れる、という関数ですが、うっかりこれを
get_posts(‘ category = 1 ‘)
 みたいに書いていたんですね。
 言い訳すると、何となくSQLを書いているような気分でした。SQLもイコールの両脇にスペースを入れずにギッチリ書く人と、スペースを開ける流派(笑)がありますが、わたしは後者です。何かでSQLを直接書いて文字列結合した時にトラブルの元になるとイヤなので、両脇も念のためスペース一個入れておきます。
‘ SELECT hogehoge … WHERE ID = 1 ‘
 みたいに、端っこも間もスペースを入れておかないと何か不安なのです(大抵はどっちも一緒)。
 これが今回仇になって、うっかりスペースを入れて全部パーになっていました。しかもwordpressの場合、エラーにもならずにシレッとデフォルト値みたいなのが取れてくるので、最初ぼんやりしていたら気づきませんでした。
 get_postsやquery_postsの引数は、クエリ文字列を入れる雰囲気なので、SQLの文化ではありません。そんな勘違いをする人はわたしだけかもしれませんが、一応一つのケースとして晒しておきます。
 ちなみに、wordpressのコーディングのノリには好き嫌いがあると思うのですが、個人的には大嫌いです(笑)。

4883377245WordPress レッスンブック 3.x対応
エビスコム
ソシム 2010-09-08