📢 欢迎访问本站!本站持续更新优质内容。哈啊哈

通过template-parts/xx.php模板片段来理解WordPress的父主题和子主题的分工合作

📖 本文共 3,776 字,阅读需要 13 分钟

模板片段来改造sidebar

这是现代 WordPress 更推荐的方式。

父主题:

sidebar.php

里面有:

get_template_part('template-parts/sidebar/main');

然后:

template-parts/sidebar/main.php

真正输出内容。


子主题:

只覆盖:

template-parts/sidebar/main.php

而不是整个 sidebar.php。

如此一来,如果父主题更新了,模板片段的引用会不会失效了?

答案:不会

这不仅不会失效,反而正是 WordPress 子主题最标准、最推荐的“优雅做法”。

你非但没有破坏任何东西,还完美利用了 WordPress 的模板继承机制。

我们来拆解一下为什么父主题更新后,你的子主题不会失效:

1. WordPress 的寻找模板逻辑

当父主题的 sidebar.php 执行 get_template_part('template-parts/sidebar/main') 时,WordPress 内部并不是直接去父主题里死板地找这个文件,而是会遵循以下顺序:

  1. 优先检查:子主题中是否存在 template-parts/sidebar/main.php?如果存在,直接加载它。
  2. 后备方案:如果子主题里没有,才去加载父主题的 template-parts/sidebar/main.php

所以,你只在子主题里放了 main.php,WordPress 就会聪明地跳过父主题的 main.php,改用你修改过的这个。

2. 父主题更新时会发生什么?

当父主题发布新版本并更新时:

  • 父主题的文件被覆盖:父主题的 sidebar.php 和父主题的 template-parts/sidebar/main.php 都会被新版本替换。
  • 子主题雷打不动:由于你的子主题目录是独立的(比如 my-child-theme/),更新父主题完全不会影响、删除或修改你子主题里的文件。

因此,当网站更新后,父主题的 sidebar.php 依然会去调用 get_template_part(...),而 WordPress 依然会雷打不动地优先读取你子主题里的 main.php你的自定义内容依然完好损毁。

3. 真正需要注意的唯一隐患(虽然概率很低)

只有一种极端情况会导致你的修改“失效”或出现问题:

如果父主题在大版本更新中,彻底重构了代码,把 sidebar.php 里的 get_template_part('template-parts/sidebar/main') 这行代码删了,或者改名了。

如果父主题作者把这行代码改成了调用别的文件,那么你子主题里的 main.php 就会因为没有被“点名”而失去作用。

总结与建议: 你现在的做法是完全正确的。相比于复制整个 sidebar.php,你只复制并修改真正输出内容的 main.php,保持了子主题的最小化改动。这样即使以后父主题的 sidebar.php 增加了新的安全补丁或功能,你的网站也能自动享受这些更新,只要他们没换掉那个 get_template_part 的路径。


Conversation with Gemini

父主题:

sidebar.php

里面:

get_template_part(‘template-parts/sidebar/main’);

然后:

template-parts/sidebar/main.php

真正输出内容。

子主题:

只覆盖:

template-parts/sidebar/main.php

而不是整个 sidebar.php。

如此一来,如果父主题更新了,岂不是就失效了

不必担心,你的这种担心很合理,但实际情况恰恰相反:这不仅不会失效,反而正是 WordPress 子主题最标准、最推荐的“优雅做法”。

你非但没有破坏任何东西,还完美利用了 WordPress 的模板继承机制。

我们来拆解一下为什么父主题更新后,你的子主题不会失效:

1. WordPress 的寻找模板逻辑

当父主题的 sidebar.php 执行 get_template_part('template-parts/sidebar/main') 时,WordPress 内部并不是直接去父主题里死板地找这个文件,而是会遵循以下顺序:

  1. 优先检查:子主题中是否存在 template-parts/sidebar/main.php?如果存在,直接加载它。
  2. 后备方案:如果子主题里没有,才去加载父主题的 template-parts/sidebar/main.php

所以,你只在子主题里放了 main.php,WordPress 就会聪明地跳过父主题的 main.php,改用你修改过的这个。

2. 父主题更新时会发生什么?

当父主题发布新版本并更新时:

  • 父主题的文件被覆盖:父主题的 sidebar.php 和父主题的 template-parts/sidebar/main.php 都会被新版本替换。
  • 子主题雷打不动:由于你的子主题目录是独立的(比如 my-child-theme/),更新父主题完全不会影响、删除或修改你子主题里的文件。

因此,当网站更新后,父主题的 sidebar.php 依然会去调用 get_template_part(...),而 WordPress 依然会雷打不动地优先读取你子主题里的 main.php你的自定义内容依然完好损毁。

3. 真正需要注意的唯一隐患(虽然概率很低)

只有一种极端情况会导致你的修改“失效”或出现问题:

如果父主题在大版本更新中,彻底重构了代码,把 sidebar.php 里的 get_template_part('template-parts/sidebar/main') 这行代码删了,或者改名了。

如果父主题作者把这行代码改成了调用别的文件,那么你子主题里的 main.php 就会因为没有被“点名”而失去作用。

总结与建议: 你现在的做法是完全正确的。相比于复制整个 sidebar.php,你只复制并修改真正输出内容的 main.php,保持了子主题的最小化改动。这样即使以后父主题的 sidebar.php 增加了新的安全补丁或功能,你的网站也能自动享受这些更新,只要他们没换掉那个 get_template_part 的路径。

template-parts/sidebar/main.php在父主题里有这个代码是吧?

是的,完全正确。

在父主题的原始文件结构中,一定存在 template-parts/sidebar/main.php 这个文件。

父主题的逻辑是这样的:

  1. sidebar.php 相当于一个“调度员”。
  2. 它执行了 get_template_part('template-parts/sidebar/main'); 这行代码,意思是:“我去把 template-parts/sidebar/main.php 里的内容召唤过来,在这里显示。”

为什么在子主题里只放这一个文件就能生效?

这是因为 WordPress 的文件查找优先级(也叫模板继承机制)。

当网页加载需要侧边栏时,WordPress 会按照以下顺序去找文件:

查找步骤 目标文件 结果
第一步 子主题的 sidebar.php ❌ 你没有创建它,跳过。
第二步 父主题的 sidebar.php 它的里面写着 get_template_part('.../main'),WordPress 收到指令,开始寻找 main.php
第三步 子主题template-parts/sidebar/main.php 找到你创建的文件!直接加载并输出内容。
第四步 父主题的 template-parts/sidebar/main.php (由于第三步已经找到了,这一步就被完全忽略了)。

所以,你的子主题里虽然只有 main.php,但它在第三步就被 WordPress 截获并使用了。父主题里的那个同名文件,在网站运行时实际上被你的子主题文件“顶替”掉了。


你必须在子主题里打造一把一模一样的钥匙(完全相同的路径和文件名),才能精准卡进那个位置。

为什么必须严格一致?

因为 WordPress 是通过路径和文件名来识别和实现“覆盖”的。

  • 路径必须一致:你在子主题里必须创建 template-parts 文件夹,在里面建 sidebar 文件夹,最后把文件放进去。
  • 文件名必须一致:必须叫 main.php

如果你把子主题的文件改名叫 my-main.php 或者放在了根目录下,WordPress 在按图索骥的时候就找不到它,结果就是子主题的文件被忽略,网站依然会去读取父主题自带的 template-parts/sidebar/main.php

sidebar的父主题和子主题继承

这是一张示意图,展示了 WordPress 如何处理父主题和子主题之间的文件覆盖。

  • 左侧(父主题): 展示了原始的文件结构。当执行 sidebar.php 时,它会调用 get_template_part 函数(蓝色代码块)。原本它会加载绿色的 main.php

  • 右侧(子主题): 展示了你创建的、具有完全相同路径和文件名template-parts/sidebar/main.php 文件(紫色代码块)。

  • 箭头逻辑: 箭头清楚地表明,当父主题的 sidebar.php 发起调用时,WordPress 优先找到了子主题中的文件,并加载了它(紫色文件上的对勾)。

  • 结果: 父主题原始的 main.php 被一个红色的叉号标记,表示它被跳过(覆盖)了。网页最终显示的是子主题的自定义内容(Custom Content)。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部