投稿アーカイブをホーム以外で扱うケース

投稿アーカイブをホーム以外で扱うケース

今回は少々面倒なケースです。

ワードプレスは、元来ブログのためのシステムなので、「ホーム」は投稿の一覧(アーカイブ)であることがデフォルトです。ですが、企業サイトを制作する際にはホームは、単なるアーカイブではないことが殆どであるため、投稿カテゴリーとして「ブログ」などを作成、その下にさらに子カテゴリーを追加して、その下に記事をぶら下げていることが多いのです。が、投稿=ブロク記事にするならば、そもそも「ブログ」カテゴリーは不要だよな、と思っておりました。今回親カテゴリーの「ブログ」を削除、投稿のカテゴリーを直接作成し、記事を入れていくことにしました。ここで、ワードプレスをかじった人なら「では投稿一覧のURLって何になるの?」と思いますよね。

調べたところ、ワードプレスのデフォルト設定では、投稿アーカイブは無効になっているらしい。home=投稿アーカイブなのだから、当然か・・・そこで下記をfunctions.phpに追加すると投稿アーカイブが使えるようになります。

/* 投稿アーカイブページの作成 */
function post_has_archive( $args, $post_type ) {

	if ( 'post' == $post_type ) {
		$args['rewrite'] = true;
		$args['has_archive'] = 'blogs'; //任意のスラッグ名
	}
	return $args;

}
add_filter( 'register_post_type_args', 'post_has_archive', 10, 2 );

ここではスラッグを「blogs」にしていますので、「URL/blogs」で投稿の一覧を表示することができました。これで目出度く解決か?と思いきや・・・Breadcrumb NavXTに、「ブログ」が入らない。当然か・・・・アーカイブ一覧は「ホーム」なので、Breadcrumb NavXT管理画面の「ホームページテンプレート」箇所に無理に「ブログ」をつければ一応解決するのですが、同じサイトにカスタム投稿タイプが存在する場合、カスタム投稿タイプにも「ブログ」がついてしまい問題です。そこでBreadcrumb NavXTのフィルターフックを使うことにしました。

if (function_exists('bcn_display_list')){
    //デフォルトのHOMEパンくずを除去
    add_action('bcn_after_fill', 'foo_pop');
    function foo_pop($trail)
    {
        array_pop($trail->breadcrumbs);
    }

    //パンくずを追加
    add_action('bcn_after_fill', 'my_static_breadcrumb_adder');
    function my_static_breadcrumb_adder($breadcrumb_trail)
    {
        if( is_post_type_archive( 'post' )||is_singular('post') ) {
            //投稿タイプ post の時、2番目に/blog/のパンくず
            $breadcrumb_trail->add(new bcn_breadcrumb('ブログ', null, array('post-clumn-archive'), home_url('/blog'), null, true));
        }
        // HOMEを追加
        $breadcrumb_trail->add(new bcn_breadcrumb('Home', null, array('post-clumn-archive'), home_url('/'), null, true));
    }
}

デフォルトのHOMEを消してまた追加するので、そもそも消さなくてもいいのでは?と思ったのですが、これを省くと

ブログ > Home

と、順序が逆にになってしまうんです。。。。

更に投稿アーカイブのタイトルが「投稿」になってしまう問題がありまして、こちらはあまりスマートではない方法で解決しました。(以下は条件分岐の一部です)

<?php } elseif( is_post_type_archive('topics') ) { ?>
<?php echo esc_html(get_post_type_object(get_post_type())->label); ?>
<?php } elseif( is_post_type_archive() ) { ?>
ブログ

メニューにアーカイブを追加する場合は、「投稿一覧」を選ぶとホームに飛んでしまうので、カスタムリンクで入れるしかなさそうです。

これで一応全ての問題はクリアしたかな。ううむ、意外と面倒だった。