我已经搜索并找不到任何答案。
如何从自定义插件替换主题 header.php 模板?
在我看来到处似乎都无法完成,并且您只能从主题/子主题更改模板部分。
但是,诸如Elementor页面构建器之类的插件如何在其主题构建器中实现呢?
谢谢, 丹尼尔
答案 0 :(得分:0)
Elementor不会替换header.php。它采用活动主题具有的所有header.php。它仅接管the_content()
部分。
header.php
是主题必不可少的部分和资产。
您可以使用不同的标头(不是不同的header.php)构建page template
答案 1 :(得分:0)
我有使用与元素或站点起源类似的页面构建器的经验。
据我所知,wordpress页面构建器不会操纵或替换主题模板文件。取而代之的是,许多页面构建器内容都显示在前端,模板文件中包含the_content()
。此外,它还会在网页上附加一堆CSS和JS脚本,以处理元素的样式和交互性。
关于您的原始问题...如果我理解正确,则不需要此插件,因为header.php
文件可以在主题编辑器中自由编辑/替换!
在管理部分中,转到“外观”>“编辑器”。然后在“主题文件”下,选择header.php的模板。
答案 2 :(得分:0)
我还需要从插件中包含一个自定义header.php。因为您可以通过${type}_template hook从插件注册page.php,post.php或archive.php之类的模板,所以我认为对header.php进行相同的操作并不难,但是您可以不会从父主题或子主题的目录之外的目录中加载自定义header.php。
向下遍历get_header
函数时,您将看到为定位标头模板而调用的locate_template函数。但是没有办法挂入该函数并替换已加载的标题模板的路径:
function locate_template( $template_names, $load = false, $require_once = true, $args = array() ) {
$located = '';
foreach ( (array) $template_names as $template_name ) {
if ( ! $template_name ) {
continue;
}
if ( file_exists( STYLESHEETPATH . '/' . $template_name ) ) {
$located = STYLESHEETPATH . '/' . $template_name;
break;
} elseif ( file_exists( TEMPLATEPATH . '/' . $template_name ) ) {
$located = TEMPLATEPATH . '/' . $template_name;
break;
} elseif ( file_exists( ABSPATH . WPINC . '/theme-compat/' . $template_name ) ) {
$located = ABSPATH . WPINC . '/theme-compat/' . $template_name;
break;
}
}
if ( $load && '' !== $located ) {
load_template( $located, $require_once, $args );
}
return $located;
}
一种绕过此限制的解决方案是在插件模板中放弃get_header函数,并通过插件模板中的require或require_once语句包括插件的header.php。但是,您将必须实现自己的get_header挂钩和locate_template功能,才能从父主题或子主题中进行替换。省略get_header函数时,请参阅以下答案以获取有关限制的更多信息: https://wordpress.stackexchange.com/a/5195/80177