从管理页面找出哪个WordPress模板用于页面
我试图检索在仪表板的'编辑页面'页面上使用的模板的文件名/路径。从管理页面找出哪个WordPress模板用于页面
类似于wp-includes/template-loader.php
(source)在前端所做的:找出要渲染的模板。
不幸的是,像is_front_page()
这样的表达式 - Wordpress'template-loader.php
用于确定它是否应该使用get_front_page_template()
- 在管理页面上无法正常工作。这是预料之中的,因为这些表达式使用全局$ wp_query对象,而不是当前查询。
我试过到目前为止:
运行管理页面内环路后
$args = array(
'p' => get_the_ID(),
'post_type' => 'any'
);
$query = new \WP_Query($args);
if ($query->have_posts()) : while ($query->have_posts()) : $query->the_post(); ?>
<?= the_title(); ?><br>
Is front page: <?= is_front_page() ? 'true' : 'false' ?>
<?php endwhile; endif; ?>
显示:
首页
是头版:假
使用get_post_meta
<?= get_post_meta(get_the_ID(), '_wp_page_template', true); ?>
显示:
默认
...这将是对家庭和page.php文件前page.php文件相同在另一个默认页面上,所以这对我没有帮助。
总之
我试图让当我编辑我的“主页”是front-page.php
。或者当我在选择自定义模板的情况下编辑某个页面时,custom-template.php
。或者当我编辑一个名为'关于'的页面时about-page.php
。如何获得正确的文件名或路径?
<?php echo realpath(get_page_template()); ?>
它输出像/foo/bar/baz/wp-content/themes/your-theme/{page-template}.php
您可以选择不使用realpath()
和刚刚得到的模板名称。
这将返回页面模板设置为页面,而不是实际加载的模板。例如,在我正在编辑主页的仪表板中,当它实际加载'path/to/template/front-page.php'时,它会返回'path/to/template/page.php',因为Wordpress会优先考虑。 – kapser
该函数返回分配给当前页面的模板。期。如果你得到“默认”或page.php,那么你没有在页面编辑屏幕上设置自定义模板...或者,它不会保存到数据库。 Wordpress加载分配给页面的模板,如果没有,它会根据模板层次结构自行设置默认值。如果这个函数没有给你你想要看到的东西,或者其他一些模板正在加载而不是这个函数给你的那个模板,那么你需要重新检查你的模板和声明。 – Spartacus
确实,Wordpress遵循模板层次结构。这并不反映在get_page_template()的结果中。当我在文件'front-page.php'中回显你的函数时,我得到'page.php'。测试两个不同的主题。 – kapser
如果您的具体问题是主页,你可以使用的get_page_template()
组合和编辑页面的ID与get_option('page_on_front')
比较(见WordPress option reference)。还有一个选项,show_on_front
,它表示首页是显示帖子还是静态页面。
也许这有帮助吗?我不知道是否有其他边缘情况下将使用不同的模板...
我已经找到了解决这个问题的方法,在前端添加一个包含模板文件名的元标记,并在后端使用php的get_meta_tags来获取正确的文件名。虽然这有效,但我想知道是否有更优雅的解决方案。现在开始赏金。 – kapser
你如何运行上面的代码尝试?通过钩子? – Steve
简而言之:元标记是使用'wp_head'挂钩插入的。使用类似[this one]的函数(https://github.com/WordPress/WordPress/blob/master/wp-includes/template-loader.php#L44),将正确的模板路径加载到元标记中。 然后,使用curl或get_meta_tags(试用它们都可以),我从后端读取meta标签。它的作品,但它感觉像一个肮脏的解决方案。 – kapser