【WordPress】カスタム投稿タイプの月別アーカイブをパーマリンクを書き換えて対応

電脳備忘録

カスタム投稿タイプ記事の月別アーカイブの一覧を作ろうと思ったらパーマリンクがどうやっても意図した通りならず、結局それだけでほぼ1日費やしてしまいました。
実現したかったことは、サイドバーの月別アーカイブのリンクをクリックしたらその月のアーカイブ一覧のページを表示するというシンプルなものだったのですが、これを実現することが簡単には行かなかったのです・・・。

まずは、サイドバーのウィジェットをカスタム投稿タイプでも利用できるようにする「Custom Post Type Widgets」を使ってウィジェットを作成。次に「Custom Post Type Permalinks」をインストールして、パーマリンクを設定したのですが、なぜか/news/news/date/2016/12といった具合に「news」が続けて表示されていまい、リンクをクリックすれば当然そんなページはないと404ページに飛ばされてしまい該当ページを表示することができませんでした。

「Custom Post Type Permalinks」プラグインを使わなければ「news」が続けて表示されることはないのですが、今度はエントリー名がパーマリンク設定のカスタム構造を「post_id」としても「/news/news/date/2016/12/これはテスト記事です」といった具合にポストネームで表示してしまい日本語まじりの残念なURLが生成されてしまいました。こちらが立てばあちらが立たずで問題は一向に解決せず泥沼に・・・。

あれこれ試した結果、下記の方法で解決しました。

  • カスタム投稿タイプに日付ベースのパーマリンクを追加してくれる「Custom Post Type Rewrite」プラグインをインストール
  • パーマリンク設定をカスタム構造「/%post_id%」に設定
  • function.phpにカスタム投稿タイプ(ニュース/スタッフブログ)の投稿記事タイトルを投稿IDに書き換える設定を追記

function.phpに追記した一文。

add_action('init', 'myposttype_rewrite_news');
function myposttype_rewrite_news() {
global $wp_rewrite;
$queryarg = 'post_type=news&p=';
$wp_rewrite->add_rewrite_tag('%news_id%', '([^/]+)',$queryarg);
$wp_rewrite->add_permastruct('news', '/news/%news_id%.html', false);
}
add_action('init', 'myposttype_rewrite_staff');
function myposttype_rewrite_staff() {
global $wp_rewrite;
$queryarg = 'post_type=staff-blog&p=';
$wp_rewrite->add_rewrite_tag('%staff-blog_id%', '([^/]+)',$queryarg);
$wp_rewrite->add_permastruct('staff-blog', '/staff-blog/%staff-blog_id%.html', false);
}
add_filter('post_type_link', 'myposttype_permalink', 1, 3);
function myposttype_permalink($post_link, $id = 0, $leavename) {
global $wp_rewrite;
$post = &get_post($id);
if ( is_wp_error( $post ) )
return $post;
$newlink = $wp_rewrite->get_extra_permastruct($post->post_type);
$newlink = str_replace('%'.$post->post_type.'_id%', $post->ID, $newlink);
$newlink = home_url(user_trailingslashit($newlink));
return $newlink;
}

かなり手こずりましたが、月別アーカイブのURLもダブることなく表示され、記事のパーマリンクも投稿IDで表示されるようになりました。

壁にぶつかると当たり前のように1日潰れるし、場合によっては数日つぶれることもあるので正直WPは好きではないです・・・。ググればなんとかヒントが見つかるのがせめてもの救いかな?

広告

ブログの維持費に充てるでございます・・・。