wp_get_archives()でのpost_type指定
Rev.1を表示中。最新版はこちら。
WordPress4.4でwp_get_archives()関数のパラメータでpost_typeの指定ができるようになった。ただし一つだけ。
WordPressには月間アーカイブのリンクを出力するのに使う、wp_get_archives()という関数がある。本関数は従来(〜4.3.1)、投稿タイプ(post_type)を指定できず、デフォルトの'post'に対してしか、記事数を取得できなかった。このため、カスタム投稿タイプに対して月間アーカイブを出力しようとした場合、getarchives_whereフィルターでSQLのWHERE句を書き換えるのが常套手段とされていた。私も以下のようなフィルタ関数を使ってカスタム投稿タイプの月間アーカイブを作成していた。
post_type指定を可能にするgetarchives_whereフィルタ関数
function custom_post_type_getarchives_where($where, $args){ $post_type = isset($args['post_type']) ? $args['post_type'] : 'post'; if (is_array($post_type)) { $conds = array(); foreach ($post_type as $type) { $conds[] = "post_type = '".esc_sql($type)."'"; } $cond = '('.implode(' OR ', $conds).')'; } else { $cond = "post_type = '".esc_sql($post_type)."'"; } return "WHERE $cond AND post_status = 'publish'"; } add_filter('getarchives_where', 'custom_post_type_getarchives_where', 10, 2);
post_typeを指定しての月間アーカイブHTMLの生成
$args = array('type' => 'monthly', 'limit' => '', 'format' => 'html', 'before' => '', 'after' => '', 'show_post_count' => true, 'echo' => 0, 'order' => 'DESC', // post_type引数はcustom_post_type_getarchives_where()で参照される # 'post_type' => 'common', // 投稿タイプの指定 'post_type' => array('common', 'post'), // 複数指定する場合 ); echo wp_get_archives($args);
WordPress4.4からはwp_get_archives()にpost_typeパラメータが追加になり、投稿タイプを指定できるようになったので、指定したい投稿タイプが一つだけなら、わざわざgetarchives_whereフィルタを書く必要はなくなった。ただし、複数指定したい場合は、相変わらずフィルタに頼ることになる。
ところで、WordPress4.4からは上記の例のフィルタ関数だと、'post_type'に array('common', 'post')のように複数指定をした場合、月間アーカイブのHTMLを生成できなくなってしまった。これは、post_typeパラメータがサポートされたことにより、wp_get_archives()内でpost_typeの値がチェックされるようになったため、配列データを受けるとエラー終了してしまう。フィルタに渡すためのパラメータの名称を'post_type'からなにか別の名称('filter_post_type'とか)に変えてやる必要がある。