[WordPress] 子主題子頁面樣板檔案(Child Page Template)繼承的方法

其實這篇也算誤打誤撞,原本想要用樣板結構的變數做法來取代 WooCommerce My Account 我的帳號頁面的訂單頁功能。(結果不能這樣)無奈機制不同, 在半路先被「我的帳號」給攔截走。

不過如果是其他頁面還是可以用 page-{$id}.phppage-{$slug}.php 去覆蓋。但這樣不太好管理這些檔案,全部都在子主題目錄下,所以有人寫了一段程式來改變這個樣板檔案架構。

add_filter(
    'page_template',
    function ($template) {
        global $post;
        if ($post->post_parent) {
            // 取得最上層頁面
            $parent = get_post(
                reset(array_reverse(get_post_ancestors($post->ID)))
            );

            // 或
            // 只需要抓到上一層
            // $parent = get_post($post->post_parent);

            $child_template = locate_template(
                [
                    $parent->post_name . '/page-' . $post->post_name . '.php',
                    $parent->post_name . '/page-' . $post->ID . '.php',
                    $parent->post_name . '/page.php',
                ]
            );
            if ($child_template) {
                return $child_template;
            }
        }
        return $template;
    }
);

參考:Is there a default template file for child pages / subpages?

這個程式碼片段加上去的話,還可以把子頁面使用上層目錄包覆的做法來掛樣板。

例如:

  1. [parent-page-slug]/page.php
  2. [parent-page-slug]/page-[child-page-slug].php
  3. [parent-page-slug]/page-[child-post-id].php

使用上還不錯,真是意外找到的方式!

Facebook 外掛功能


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[//////////____30%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *