wordpressでカスタム投稿タイプの記事に.htmlの拡張子をつける。

まずまずの頻度である「記事に.hmltをつけたい!」という要望。
投稿だけを使うならパーマリンク設定でOK!だが、カスタム投稿タイプの場合は出来ない。

便利なプラグインもあるのだが、
http://wordpress.org/plugins/custom-post-type-permalinks/

テーマに組み込めないか調べてみたところ、こんな記事を見つけられたのでメモ。
http://wordpress.stackexchange.com/questions/59024/add-html-dot-html-extension-to-custom-post-types

1. rewrite_rules_array フィルターにcustom post type分のrewrite ruleを追加。

add_action('rewrite_rules_array', 'rewrite_rules');
function rewrite_rules($rules) {
    $new_rules = array();
    foreach (get_post_types() as $t)
        $new_rules[$t . '/(.+?)\.html$'] = 'index.php?post_type=' . $t . '&name=$matches[1]';
    return $new_rules + $rules;
}

2. custom post type でのURLフォーマットを指定。 post_type_linkフィルターを利用。

add_filter('post_type_link', 'custom_post_permalink'); 
// for cpt post_type_link (rather than post_link)
function custom_post_permalink ($post_link) {
    global $post;
    $type = get_post_type($post->ID);
    return home_url() . '/' . $type . '/' . $post->post_name . '.html';
}

3. redirect_canonical でリダイレクト先のURL最後のスラッシュを削除する。

add_filter('redirect_canonical', 'remove_redirect_canonical');
function remove_redirect_canonical($redirect_url) {
    return false;
}

追記:

スラッグじゃなくIDがいい場合は、下のように投稿の編集時にスラッグを変更して、上の処理を行えばOK.

function auto_post_slug( $slug, $post_ID, $post_status, $post_type ) {
	global $post;
	return 'post' . $slug;
}
add_filter( 'wp_unique_post_slug', 'auto_post_slug', 10, 4  );

これで、domain.com/post-type/post00.htmlのようなURLの完成。

 

追記 131105:固定ページの場合。

固定ページにhtmlを付けたい場合は、便利なプラグインもあるが、下の記述のみでOK。

add_action( 'init', '_add_html_on_page' );
if ( ! function_exists( '_add_html_on_page' ) ) {
    function _add_html_on_page() {
        global $wp_rewrite;
        $wp_rewrite->use_trailing_slashes = false;
        $wp_rewrite->page_structure = $wp_rewrite->root . '%pagename%.html';
//        flush_rewrite_rules( false );
    }
} 

としてやれば固定ページのみに反映される。