カスタム投稿タイプに紐づく子タームだけパーマリンクに反映する
- WordPress -
2019.11.25
本記事で想定している状況例
- productというカスタム投稿タイプがある
- product_categoryというカスタムタクソノミーを使っている
- 親ターム、子ターム、の2階層になっている
- プラグイン「Custom Post Type Permalinks」でproductのパーマリンクを以下のようにしている
このようにして、productの記事を子タームを紐づけた状態で公開してみると、詳細ページのパーマリンクが
https://example.jp/product/{親ターム}/{子ターム}/id
となってしまった。これを、
① 子タームに属するproductの詳細ページは、親タームを抜いてこう↓したい。
https://example.jp/product/{子ターム}/id
② 親タームのみに属するproductの詳細ページは、そのまま親タームを含めたままこう↓したい。
https://example.jp/product/{親ターム}/id
カスタム投稿タイプの子タームだけパーマリンクに反映する
post_type_linkフィルターフックを使って、子タームに属す記事の場合だけ親タームスラッグを削除して表示するようにした。
functions.php へ以下貼り付ける。
// product詳細ページパーマリンクのカスタマイズ(/product/{子ターム}/ID)
function permalink_change_product( $permalink, $post, $leavename ) {
if ($post->post_type === 'product') {
$categories = get_the_terms( $post->ID, 'product_category');
if ( count($categories) >= 2 ) { // 親、子どちらにも属す場合
foreach ( $categories as $category ) {
if ($category->parent === 0) {
if (strpos($permalink, $category->slug)) { // 親タームスラッグを削除
$permalink = preg_replace("/\/$category->slug/", '', $permalink, 1);
}
}
}
}
}
return $permalink;
}
add_filter( 'post_type_link', 'permalink_change_product', 10, 3 );
これで、思い描いていたパーマリンクを作ることができた。