当サイトは、有料WordPressテーマ(テンプレート)のTHE THOR(ザ・トール)を用いて制作しています。ブログサイトとしてももちろん運用していますが、事業用のサイトも兼ねて運用しているので、どうしても、デフォルトの「投稿」を任意の名称かつ、任意のURLに変更したかったのです。
特にTHE THORに限った話ではありませんが、WordPressのデフォルトの「投稿」を任意のURL・名称に変えるTIPSはあるにはあったのですが、ちょっとつまづいたところがあったので、備忘録として、投稿しておきます。
目指したい形
まず、WordPressのアーカイブURLは、(テーマがTHE THORか、そうでないかによらず)デフォルトでは…
■TOPページ(アーカイブページを兼ねる) https://○○○(ドメイン) ■投稿詳細ページ https://○○○(ドメイン)/記事パーマリンク(スラッグ)/
に、なっています。
これを、以下のように変えたい。
■投稿アーカイブページ https://○○○(ドメイン)/blog/ ■投稿詳細ページ https://○○○(ドメイン)/blog/記事パーマリンク(スラッグ)/
「投稿」のアーカイブURLをつくる
デフォルトで用意されている「投稿(post_type=’post’)」は、初期状態では、TOPページとは別の、独立したアーカイブURLが存在しません。
ので、まずこれを有効にします。テーマのfunctions.phpにこんな感じで書きます。
function post_has_archive( $args, $post_type ) { if ( 'post' == $post_type ) { $args['rewrite'] = true; $args['has_archive'] = 'blog'; //任意のスラッグ名 ←アーカイブページを有効に $args['label'] = 'TECHブログ'; //管理画面左ナビに「投稿」の代わりに表示される } return $args; } add_filter( 'register_post_type_args', 'post_has_archive', 10, 2 );
これを書いて保存すると、とりあえず
https://○○○(ドメイン)/blog/
が、「投稿」のアーカイブページになります。
ただし、内部構造的には、まだ投稿詳細ページのURLは
https://○○○(ドメイン)/記事パーマリンク(スラッグ)/
のままです。
「投稿」の内部構造を変える
次に、先ほど作成した「投稿」のアーカイブページURLに、内部構造を合わせていきます。
続いて、functions.phpに下記を追記します。
add_filter( 'post_type_archive_link', function( $link, $post_type ) { if ( 'post' === $post_type ) { $post_type_object = get_post_type_object( 'post' ); $slug = $post_type_object->has_archive; $link = get_home_url( null, '/' . $slug . '/' ); } return $link; }, 10, 2 ); function add_article_post_permalink( $permalink ) { $permalink = '/blog' . $permalink; //「blog」は任意のものに変えて下さい。 return $permalink; } add_filter( 'pre_post_link', 'add_article_post_permalink' ); function add_article_post_rewrite_rules( $post_rewrite ) { $return_rule = array(); foreach ( $post_rewrite as $regex => $rewrite ) { $return_rule['blog/' . $regex] = $rewrite; //「blog」は任意のものに変えて下さい。 } return $return_rule; } add_filter( 'post_rewrite_rules', 'add_article_post_rewrite_rules' );
これを追記して保存したら、管理画面の「設定」>「パーマリンク設定」を開き、特に何も変更せずにページの一番下にある「変更を保存」をクリックします。
以上で、内部構造が
https://○○○(ドメイン)/blog/の配下に変更されます。
ちなみに、この内部構造の変更は管理画面の「外観」>「メニュー」で作成された「投稿タイプアーカイブ」やパンくずリストにも引き継がれます。内部構造を変更しないと、グローバルナビゲーションやパンくずリストのURLが以前のままです。
まとめ
最終的に、functions.phpへの記載は下記のようになりました。
function post_has_archive( $args, $post_type ) { if ( 'post' == $post_type ) { $args['rewrite'] = true; $args['has_archive'] = 'blog'; //任意のスラッグ名 ←アーカイブページを有効に $args['label'] = 'TECHブログ'; //管理画面左ナビに「投稿」の代わりに表示される } return $args; } add_filter( 'register_post_type_args', 'post_has_archive', 10, 2 ); add_filter( 'post_type_archive_link', function( $link, $post_type ) { if ( 'post' === $post_type ) { $post_type_object = get_post_type_object( 'post' ); $slug = $post_type_object->has_archive; $link = get_home_url( null, '/' . $slug . '/' ); } return $link; }, 10, 2 ); function add_article_post_permalink( $permalink ) { $permalink = '/blog' . $permalink; return $permalink; } add_filter( 'pre_post_link', 'add_article_post_permalink' ); function add_article_post_rewrite_rules( $post_rewrite ) { $return_rule = array(); foreach ( $post_rewrite as $regex => $rewrite ) { $return_rule['blog/' . $regex] = $rewrite; } return $return_rule; } add_filter( 'post_rewrite_rules', 'add_article_post_rewrite_rules' );
ここまでご覧くださった方、ありがとうございました。