我在这里遇到一些麻烦,了解如何执行以下操作。我已经搜索了几个星期,但似乎无法找到我要找的东西。
我有自定义的帖子类型'产品'并希望更改为单个产品页面加载的模板以及产品的存档。我使用以下代码加载包含和加载模板。
add_filter('template_include', function() {
if (is_post_type_archive('product')) {
$templatefilename = 'archive-product.php';
$template = WPVS_PATH . 'templates/' . $templatefilename;
return $template;
}
if ('product' == get_post_type() ){
$templatefilename = 'single-product.php';
$template = WPVS_PATH . 'templates/' . $templatefilename;
return $template;
}
});
我遇到的问题是它取代了当前主题的模板,而不仅仅是内容和存档区域的内部部分。
这是我想要实现的目标:
几个星期前我创建了这个插件,只使用了很好的短代码,但想通过创建自定义帖子类型和更改当前活动的内部模板部分来查看是否可以在不使用短代码的情况下执行此操作主题。
有人能引导我走向正确的方向吗?
如果我创建一个主题,我可以做我正在寻找的东西,但我想在不添加或更改活动主题的情况下将其创建为插件。该插件应该处理所需的内容。
这里讨论了同样的问题,但我想要的是开发一些独立于主题的东西。不应对主题文件进行任何更改,也不应将主题文件复制到插件中。
答案 0 :(得分:1)
最近我也遇到了同样的问题。这是我如何解决的问题。
template_include
过滤器接受一个参数,该参数是您要覆盖的所选模板(这是您在代码中缺少的内容)。9999
那样工作。但是,如果不改变它,首先检查它是否可以使用默认优先级。get_header()
和get_footer()
,可用于默认选定的主题(或者如果主题设置不同,则相应地进行设置)。这是简化的代码:
add_filter('template_include', function($default_template) {
if (is_post_type_archive('product')) {
$templatefilename = 'archive-product.php';
$template = WPVS_PATH . 'templates/' . $templatefilename;
$default_template = $template;
} else if ('product' == get_post_type() ) {
$templatefilename = 'single-product.php';
$template = WPVS_PATH . 'templates/' . $templatefilename;
$default_template = $template;
}
// Load new template also fallback if both condition fails load default
return $default_template;
}, 9999); // set priority, only if not worked with default one