🔗

WordPressのパーマリンクをカスタム構造(post_type/category/post_name)にする

2024/02/29に公開

このテーマの記事は無限にあるはずなのに、ほとんど手元の環境で動作させることができなかった。

通常投稿タイプの書き換え(不可)

色々と試しましたができませんでした。
明確な理由はわからないけど、この記事が詳しそう。
https://qiita.com/transel/items/cd29b52fb9b45c1dadec

「No Category Base(EOL済)」とか後述の「Custom Post Type Permalinks」とかプラグインもあるんだけど、どちらも通常投稿には効果が無かった。というか中身一緒だった。

そういうことで、カスタム投稿タイプ以外で個人的に対応できる方法が無い。

カスタム投稿タイプの書き換え

カスタム投稿タイプの追加

今回はプラグイン「CPT UI」を使用して投稿タイプを追加した。
「has_archive」はTrue、「rewrite_withfront」はFalseにする。

Custom Post Type Permalinksを使用してパーマリンクを書き換える

これしないと記事ページのリンクが切れます。
コード見たら色々よしなにしてくれていたので、入れておくのが吉。

プラグインを有効化して、管理画面のパーマリンク設定から、「/%taxonomy_name%/%postname%/」を入力する。

チェックは2つとも入れてみた。

さらにリンクを書き換える

// カスタム投稿のアーカイブリンクを書き換え
function custom_post_type_permalinks_set($termlink, $term, $taxonomy)
{
  if($taxonomy === 'cat-works' && $taxonomy === 'cat-news') { 
    return str_replace('/'.$taxonomy.'/', '/', $termlink);
  }
  return $termlink;
}
add_filter('term_link', 'custom_post_type_permalinks_set', 11, 3);

// ページネーションなどを繋げる(プラグインだけだとページネーションが動かない)
add_rewrite_rule('works/([^/]+)/page/([0-9]+)/?$','index.php?cat-works=$matches[1]&paged=$matches[2]','top');
add_rewrite_rule('works/([^/]+)/?$', 'index.php?cat-works=$matches[1]', 'top');

add_rewrite_rule('news/([^/]+)/page/([0-9]+)/?$','index.php?cat-news=$matches[1]&paged=$matches[2]','top');
add_rewrite_rule('news/([^/]+)/?$', 'index.php?cat-news=$matches[1]', 'top');

// タクソノミーアーカイブのテンプレートを変える(必要であれば)
function filter_taxonomy_template( $template ) {  
  if ( is_taxonomy('cat-works') && !is_taxonomy('cat-news') ) { // 上書きするのに否定条件が必要だった
    $new_template = locate_template( array( 'archive-works.php' ) );
    return $new_template;
  } else if(is_taxonomy('cat-news')) {
    $new_template = locate_template( array( 'archive-news.php' ) );
    return $new_template;
  }
  
	return $template;
}
add_filter( 'taxonomy_template', 'filter_taxonomy_template', 99 );

標準投稿を非表示にする

// 標準投稿をメニューから非表示
function remove_menus () {
  global $menu;
  remove_menu_page( 'edit.php' );
}
add_action('admin_menu', 'remove_menus');

function remove_admin_bars($wp_admin_bar) {
  $wp_admin_bar->remove_menu('new-content');
}
add_action('admin_bar_menu','remove_admin_bars',999);

Discussion