get_posts()のトラブルシューティング
WordPressをカスタマイズしたことのある方であれば、条件を決めて記事データを取得できる関数 get_posts() や、クラス WP_Query を使ったことがあるのではないでしょうか?
get_posts()(またはWP_Query)は記事を検索して取り出すための非常に使い勝手の良いコマンド(クラス)です。
しかし、せっかく条件を決めてコードを実行しても、思うように検索結果が出てこない・検索結果がゼロになる、という状況に出くわすこともあるでしょう。
というわけで、get_posts()が思うように動作しない方に向け、簡単なトラブルシューティングをお届けしたいと思います。
get_posts()の基本的な使い方については公式サイトの解説をご参照ください。
☑️ get_post()と間違えていませんか?
get_posts()と似て非なる関数に
get_post()
というものがあります。スペルは最後の「s」がないだけの違いです。
get_post()は投稿IDを渡して投稿オブジェクトを受け取るだけのシンプルな関数で、主にWPのコアや他の関数内で使われています。
get_posts()の代わりにget_post()を使おうとすると、特にエラーも出さずに結果がゼロになると思います(エラー表示設定による)。
当然結果はゼロになり画面には何も出てきません。
☑️ 条件パラメータにスペルミスはありませんか?
意外とこれが多いです。
categoryがcategryになっていたり、posts_per_pageがpost_per_pageになっていたり・・・
get_posts()のパラメータはほぼWP_Queryと同じですので、公式サイトあるいは以下のようなサイトを参照して、スペルが合っているか確認してみましょう。
http://notnil-creative.com/blog/archives/1288
☑️ カスタム投稿タイプを使っていませんか?
get_posts()はデフォルトでは投稿タイプ’post’つまり一般の「投稿」のみを検索の対象としています。
つまり、デフォルトでは固定ページや、自分で設定したカスタム投稿タイプ(カスタムポストタイプ)の投稿は検索結果に出て来ません。
カスタム投稿タイプを検索結果に含めるには、検索条件に以下のパラメータを加えます。
'post_type' => '{投稿タイプのスラッグ}'
☑️ カスタム・タクソノミーを使っていませんか?
カスタム投稿タイプを使用している場合、その分類方法として「カスタム・タクソノミー」を使うのが一般的です。
しかし、その事を忘れて‘cat’や‘category_name’ などのパラメータで条件を決めていませんか?
カスタム・タクソノミーによって条件を指定する場合、’tax_query’の書式で条件を指定することになります。
'tax_query' => array(
array(
'taxonomy' => 'people',//タクソノミーのスラッグ
'field' => 'slug',//タームの指定方法'ID'または'slug'
'terms' => 'bob',//ターム名
),
),
さらにこの部分をつなげて、複数のタクソノミーで絞り込み検索をかけることも出来ます。具体的な方法は
公式サイトをご参照ください。
また、複数のタクソノミーを繋げた条件を指定している場合、AND検索かOR検索かを確認して、以下のパラメータが正しく指定されているかどうかを見てみましょう。
'relation' => 'AND',//'AND'または'OR'
☑️ 投稿が「下書き」などになっていませんか?
get_posts()のデフォルトでは ‘post_status’ パラメータが ‘publish’ (公開)になっています。
よってテスト投稿をいくつか用意して表示させる場合、投稿が「公開」以外(「下書き」や「レビュー待ち」、「非公開」等)になっていると検索結果に出て来ません。
投稿状態を確認し、すべて「公開」にするか、 ‘post_status’ パラメータを ‘any’ などに変更します。
☑️ 投稿が「先頭に固定表示」になっていませんか?
WPの投稿には、投稿日付に関わりなく特定の投稿をトップに出すことができる、「先頭に固定表示」の属性があります。
ところがget_posts()ではデフォルトでは固定表示された投稿を検索結果から除外します(WP_Queryでは除外しません)。
もし特定の記事だけ検索結果に現れない場合、その投稿に「先頭に固定表示」にチェックが入ってしまっている可能性もありますので確認してみましょう。
ちなみに、固定表示された投稿を検索結果に含めるには、以下のパラメータを指定します。
'ignore_sticky_posts' => false
それでもうまくいかない場合・・・
まずは緩い条件からテストをして行って、徐々に条件を狭めていく方法をお勧めします。
たとえば、
$args = array(
'post_type' => 'any',
'post_status' => 'any',
'posts_per_page' => -1
);
$res = get_posts($args);
var_dump($res);
こうすれば、あらゆる投稿が吐き出されるはずです。
この状態から、ひとつずつ条件を書き加えて->結果を確認 を繰り返していけば間違いなく思い通りに記事が取れると思いますが、いかがでしょうか?
get_posts()でうまく行かなかったみなさん、幸運を祈ります!