この記事は2年以上前の投稿になります。
記載された情報が古くなっている可能性がございますので十分ご注意ください。
記載された情報が古くなっている可能性がございますので十分ご注意ください。
一般的なパラメータ制御では物足りないという方向けに、query_posts やget_posts で取得に使われるSQLをカスタマイズする方法があります。
こちらはかなり、専門知識が必要なので、「SQLって?」という方はオススメしない内容です。
具体的には、query_posts やget_posts で取得に使われるSQLをFillerフックすることでコントロールします。
これを使えば、カスタムフィールドでもタグでも何でも自由に絞り込みや並び替えができるわけです。
◎表示フィールドをカスタマイズする場合
function my_posts_fields( $sql ) { return $sql . ", 追加したい項目"; } add_filter( 'posts_fields', 'my_posts_fields' );
◎結合テーブルをカスタマイズする場合(例:postmeta テーブル)
function my_posts_join( $sql ) { global $wpdb; return $sql . " INNER JOIN $wpdb->postmeta AS pmeta ON (pmeta.post_id = $wpdb->posts.id) "; } add_filter( 'posts_join', 'my_posts_join' );
◎抽出条件をカスタマイズする場合
function my_posts_where( $sql ) { global $wpdb; return $sql . " AND 追加条件'"; } add_filter( 'posts_where', 'my_posts_where' );
◎並び順をカスタマイズする場合
function my_posts_orderby( $sql ) { global $wpdb; return "条件"; } add_filter( 'posts_where', 'my_posts_where' );
※SQLなのでこれなら複雑な条件指定も可能です。
【ポイント】
カスタマイズしたSQL全体をイメージしておく必要があります。フィールドや抽出条件、並び順など、結合していないテーブルのカラムは当然取得できません。また、既存のSQL文に追加する形式を取るのであれば、そのSQL文も把握していないと、名前指定でバッティングしたり、構文エラーして何も表示されないこともあり得ます。
もっと複雑なデータを取得させたい人は「posts_groupby」なんかもあるようです。
詳しい情報はこちらから。
WordPress 日本語Codex カスタムクエリ
パラメータ制御だけでは、どうにもならなくなったら、この方法で解決するのも良いでしょう。