結構特殊なのかもしれませんが、特定の投稿タイプの場合に、”次の記事”をタクソノミーではなく、カスタムフィールドで絞り込みたいという状況になりましたので、調べた結果のメモ
(ほんとはカテゴリかタグなんでしょうが…)
- get_next_post()のコードを読んでみると
- get_next_post()は単にget_adjacent_post()のラッパでしたので、get_adjacent_post()を確認
- get_adjacent_post()を読んでみると、フィルタとして get_{$adjacent}post_join と get{$adjacent}_post_where が使える感じ
ということで、特定の投稿タイプの場合にフィルタを設定してみることに。フィルタ自体はfunctions.phpにこんな感じで追加
function ex_next_post_join($join, $in_same_cat, $excluded_categories) { global $post, $wpdb; $post_type = get_post_type($post); if ($post_type == 'content') { // 投稿タイプ "content" の場合だけ、wp_postmetaをJOIN return $wpdb->prepare("LEFT JOIN wp_postmeta ON (p.ID = wp_postmeta.post_id) "); } return $join; // その他はそのままreturn } function ex_next_post_where($where, $in_same_term, $excluded_terms) { global $post, $wpdb; $post_type = get_post_type($post); $key_id = get_post_meta($post->ID, 'key_id'); if ($post_type == 'content') { // 投稿タイプ "content" の場合で、カスタムフィールドkey_idに値が設定されている場合のみ、条件を追加 if (!empty($key_id[0])) { return $wpdb->prepare("$where AND meta_key = %s AND meta_value = %s", 'key_id', $key_id[0]); } } return $where; // その他はそのままreturn } add_filter('get_next_post_where', 'ex_next_post_where', 10, 3); add_filter('get_next_post_join', 'ex_next_post_join', 10, 3);
結果、無事絞り込んでの次の記事が取得できました。