[WooCommerce]商品詳細ページで独自のテンプレートを適用させるスニペット

WordPress 4.4から詳細記事ページ用(single.php)に新しいテンプレートが用意されました

テンプレートのファイル名をsingle-{post_type}-{post_name}.phpの仕様に則ることで、詳細記事ごとに専用のテンプレートを割り当てることができます

これを利用し、WooCommerceで登録した特定の商品に対して独自のテンプレートを割り当てようとしたのですが、通常の方法では適用できなかったのでメモです。

WooCommerceの商品ページに独自のテンプレートを割り当てる

例えば商品ページのスラッグを「note」と設定し、テーマディレクトリ直下にsingle-product-note.phpというテンプレートを配置しても適用されません。これはWooCommerceがtemplate_includeフィルターにテンプレート読み込み処理をフックしているためです。(WC_Template_Loaderクラスのメソッドでフックしています)

ですので、更に追加でtemplate_includeフィルターに処理をフックしましょう。テーマのfunctions.phpに以下のコードを追加します。

上記のコードを追加後、以下2点の作業を行えば商品に独自テンプレートの適用が可能です。

  • 2行目の$product_slugに商品のスラッグを指定
  • テーマディレクトリ直下にsingle-product-{スラッグ名}.phpというテンプレートファイルを用意

テンプレートは8行目の指定に依存するので何でも良いのですが、分かりやすくするためWordPressのテンプレート名と同じ構造にしています。

おまけ

おまけとして、ほかの投稿タイプ詳細記事ページ用テンプレートのように、スラッグ名が一致したテンプレートがあれば自動的に読み込むコードも追記しておきます。以下のコードをfunctions.phpに入力すると、商品のスラッグと同じスラッグ名のテンプレートがあれば優先的に読み込むようになります。

例えば商品が「key」というスラッグで、テーマディレクトリ直下に「single-product-key.php」というテンプレートがあれば優先的に読み込まれるようになります。

 

2017年7月18日追記:

子テーマでも動くようコードの一部、「get_template_directory()」を「get_stylesheet_directory()」に変更しました。

最終更新日:2017年7月19日

コメント

「何かそこ違うよ」「こうした方が良い」っていう部分があったら指摘して頂けると嬉しいです。

トラックバック

トラックバックは現在ありません。

Trackback: https://increment-log.com/woocommerce-single-template/trackback/