(WordPress) 標準の投稿アーカイブを別スラッグにしたい (未完成)

WordPress の標準の投稿アーカイブを下層ページに該当するURLとして表示させたい、と考えたので方法を調査してみました。

コード (α版)

一応プラグインとして作ってみたものの、挙動的に不安定だったり不完全だったりするのでα版です。

条件としては以下の通り。

  • ただし、個別記事のURLはスラッグになります。
  • 投稿一覧のスラッグは get_post_type_object( 'post' )->has_archive で取得可。

フィルターフック

中身をかいつまんで説明。

<?php

/**
 * add_post_add_archive
 *
 * desc: 投稿アーカイブをスラッグとして作成する
 */
function add_post_add_archive( $args, $post_type ) {
    if ($post_type === 'post') {
        $slug                = 'news';
        $label               = '新着情報';
        $args['labels']      = [
            'name' => $label
        ];
        $args['has_archive'] = $slug;
        $args['rewrite']     = [
            'slug'       => $slug,
            'with_front' => false,
        ];
    }
    return $args;
}
add_filter( 'register_post_type_args', 'add_post_add_archive', 10, 2 );

処理としては以下の通り。

  • フィルターフックとしては register_post_type_args に自作の関数 add_post_add_archive() を引っ掛けます
  • 引っ掛けた関数の中では
    • 投稿タイプが post ならば、上述の例だと「スラッグを news に、表示されるラベルを 新着情報 に変更」としています
  • has_archive に上述のスラッグを渡し、 true 扱いに
  • with_frontfalse にセット

実際はスラッグやラベルをある程度自由にセットしたかったので設定画面を追加する処理を記述したり、変数や関数の名前空間の重複を回避するためにクラスにしまっていたり、と色々余計なことをしていますが、一番の着物部分は割とシンプル目です。

ただし、このコードではシングルページのURLがスラッグに固定されてしまったり、条件は不明ながら特定環境下の WordPress サイトでは上手く動作しなかったり……と挙動的に不安定・不完全なので、実用には向きません。

あくまでコンセプトを形にして方向性をある程度具体化したものだと思っていただければ、と想定しております。

また、調査していく中でどうも標準の投稿は経緯的に特殊にならざるを得ない部分がありそうなので、その辺りをフォローしてごにょごにょいじるくらいならば「いっそ最初からカスタム投稿タイプで作ってしまった方が楽なのでは……」と思い始めてしまったのでそこで筆を置いた、というのもあります。

というわけで尻切れトンボではありますが、その辺りは致し方ないのかな、と。

参考

オマケ

未検証

未使用

やはり難しいらしい

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。