カスタム投稿タイプに紐づく子タームだけパーマリンクに反映する

- WordPress -
2019.11.25
WordPress

本記事で想定している状況例

  1. productというカスタム投稿タイプがある
  2. product_categoryというカスタムタクソノミーを使っている
  3. 親ターム、子ターム、の2階層になっている
  4. プラグイン「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 );

これで、思い描いていたパーマリンクを作ることができた。