我已经搜索了,找不到任何答案。
如何从自定义插件中替换主题 header.php 模板?
到处我看起来似乎都无法完成,您只能将模板零件从主题/儿童主题更改。
但是,像Elementor Page Builder这样的插件如何在其主题构建器中进行?
谢谢丹尼尔
我还需要从插件中包含一个自定义header.php。因为您可以通过$ {type} _template挂钩登录诸如page.php之类的模板。无法从父母或子主题的目录中加载自定义标题。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函数,并通过requience或requient_once语句从插件的模板中包含插件的header.php。但是,您将必须实现自己的get_header钩子和找到template功能,以从父或子主题中替换。省略get_header函数时有关限制的更多信息,请参见此答案:https://wordpress.stackexchange.com/a/5195/80177
我使用了此解决方案
add_action('get_header', 'wpbet_replace_theme_header');
function wpbet_replace_theme_header(){
require plugin_dir_path( __FILE__ ) . 'templates/headers/header-padrao.php';
$templates = [];
$templates[] = 'header.php';
remove_all_actions( 'wp_head' );
ob_start();
locate_template( $templates, true );
ob_get_clean();
}
Elementor不会替换header.php。它采用主动主题具有的任何header.php。它只是接管the_content()
部分。
header.php
是必不可少的部分&主题的资产。
您可以使用不同的标头(不是不同的标题)构建页面模板
我有使用类似的页面构建器与Elementor的经验,称为site Origin。
我最好的是,WordPress页面构建者不会操纵或替换主题模板文件。取而代之的是,在模板文件中发现了许多页面构建器内容,在前端显示了the_content()
。此外,它将一堆CSS和JS脚本附加到网页上,以处理元素的样式和互动性。
至于您最初的问题...如果我正确理解,则无需此插件,因为可以在主题编辑器中自由编辑/替换header.php
文件!
在"管理员"部分中,转到"外观">"编辑器"。然后在"主题文件"下,选择header.php。