[WordPress]カスタム投稿タイプのパーマリンク設定を変更する

  • このエントリーをはてなブックマークに追加
  • このエントリーをはてなブックマークに追加

WordPressでカスタム投稿タイプを使用した際
パーマリンクを http://ドメイン/%category%/%post_id%/ 形式に変更したかった。
けどできなかった。
調べてみたらできた。
解決したのでメモ。

前提として

ダッシュボード>設定>パーマリンク設定 から、
パーマリンク設定を「カスタム構造」にチェックを入れ
「http://ドメイン/%category%/%post_id%/」形式に変更してある。

functions.php 内の カスタム投稿タイプの設定部分に

// カスタム投稿タイプ「hoge」の設定
register_post_type(
	'hoge',
	array(
		'labels' => array(
			'name' => 'ほげ情報',
			'add_new_item' => '新規ほげ情報を追加',
			'edit_item' => 'ほげ情報の編集',
		),
		'public' => true,
		'rewrite' => true,
		'show_in_nav_menus' => true,
		'supports' => array(
			'title',
			'editor',
			'custom-fields',
			'thumbnail',
		),
	)
);

このように記述し、
‘rewite’ => true の設定もしてある。

今まではこれでパーマリンク設定の変更ができていた。
でも今回はいくらカラ更新をかけてみても、設定変更ができなかった。

解決策

WordPressのカスタム投稿タイプを企業サイトに使う場合の(超個人的)決定版 で紹介されていたコードを functions.php に記述して解決。

「2.スラッグをページIDにするためのリライト設定」部分のコードを一部書き換えて、
前述したカスタム投稿タイプの設定部分の下に記述しました。

// カスタム投稿タイプのパーマリンクリライト設定
add_action('init', 'myposttype_rewrite');
function myposttype_rewrite() {
    global $wp_rewrite;
  
    $queryarg = 'post_type=hoge&p=';
    $wp_rewrite->add_rewrite_tag('%hoge%', '([^/]+)',$queryarg);
    $wp_rewrite->add_permastruct('hoge', '/hoge/%hoge_id%', 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;
}

今回、スラッグをページIDにする際に
「.html」の部分は個人的に必要なかったので、リンク元のコードから削ってあります。(8行目)

以上のコードを記述したのちに、
使用中のテーマ内 function.php を上書きした後
ダッシュボード>設定>パーマリンク設定 から
パーマリンク設定のカラ更新を行ったところ、
無事に「http://ドメイン/%category%/%post_id%/」形式で表示されるようになりました。

おわりに

このコードを公開してくださった百田さん、本当に助かりました!ありがとうございました!

もっとスマートにコードを書けるようになりたいです。
お礼を兼ねた自分用まとめ記事でした。

ありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。