Php 从管理页面中找出用于页面的Wordpress模板

Php 从管理页面中找出用于页面的Wordpress模板,php,wordpress,templates,admin,Php,Wordpress,Templates,Admin,我试图检索仪表板中“编辑页面”页面上使用的模板的文件名/路径 与wp includes/template loader.php()在前端所做的类似:找出要呈现的模板 不幸的是,像这样的表达式是\u front\u page()——Wordpress的模板加载器。php用来确定是否应该使用get\u front\u page\u template()——在管理页面上无法正常工作。这是预期的,因为这些表达式使用全局$wp_查询对象,而不是当前查询 到目前为止,我所尝试的: 在管理页面内运行post循

我试图检索仪表板中“编辑页面”页面上使用的模板的文件名/路径

wp includes/template loader.php
()在前端所做的类似:找出要呈现的模板

不幸的是,像
这样的表达式是\u front\u page()
——Wordpress的
模板加载器。php
用来确定是否应该使用
get\u front\u page\u template()
——在管理页面上无法正常工作。这是预期的,因为这些表达式使用全局$wp_查询对象,而不是当前查询

到目前为止,我所尝试的:

在管理页面内运行post循环

$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; ?>
$args=array(
'p'=>获取\u ID(),
“post_类型”=>“任何”
);
$query=new\WP\u查询($args);
如果($query->have_posts()):而($query->have_posts()):$query->the_post();?>

这是头版:
显示:

头版是假的吗

使用get\u post\u meta

<?= get_post_meta(get_the_ID(), '_wp_page_template', true); ?>

显示:

违约

…这对于主页上的FrontPage.php和另一个默认页面上的page.php是一样的,所以这对我没有帮助

简言之

当我编辑我的“主页”时,我试图得到的是
front page.php
。或者,当我使用所选的自定义模板编辑某个页面时,
custom template.php
。或者当我编辑一个名为“about”的页面时,
about page.php
。如何获取正确的文件名或路径?

使用:


它的输出类似于
/foo/bar/baz/wp content/themes/your theme/{page template}.php


您可以选择不使用
realpath()
,只获取模板名称。

如果您的具体问题是主页,您可以使用
get\u page\u template()
的组合,并将编辑过的页面ID与
get\u选项('page\u on\u front')
进行比较(请参阅)。还有一个选项,
show_on_front
,指示首页是显示文章还是显示静态页面


也许这有帮助?我不知道是否还有其他边缘情况会使用不同的模板…

我找到的唯一解决方案是:

global $template;
echo basename($template); // front-page.php

我知道这很难看,但我就是找不到不使用这个全局变量的方法。

我找到了解决这个问题的方法,在前端添加一个包含模板文件名的元标记,并在后端使用php的
get_meta_tags
,以获得正确的文件名。虽然这是可行的,但我想知道是否有更优雅的解决方案。现在开始悬赏。你如何运行上面的代码?通过钩子?简而言之:使用
wp\u头插入meta标记。使用与正确模板路径类似的函数将其加载到meta标记中。然后,使用curl或get_meta_标记(两个都试过了,都有效),我从后端读取该meta标记。一周后:谢谢你的回复,尽管我没有找到更好的解决办法。我仍然无法获取在管理页面上加载的真实模板文件,除非使用上述注释中描述的curl技巧在前端加载页面,我现在将继续使用该技巧。这将返回页面模板集,而不是实际加载的模板。例如,在我编辑主页时,在仪表板中,它返回
path/to/template/page.php
,同时实际加载
path/to/template/front page.php
,因为Wordpress优先于此。此函数返回分配给当前页面的模板。时期如果您得到的是“default”或page.php,那么您还没有在页面编辑屏幕中设置自定义模板。。。或者,它没有保存到数据库。Wordpress加载分配给页面的模板,如果没有,它将根据模板层次结构遵循自己的默认值。若此函数并没有提供您想要的内容,或者加载了其他模板而不是此函数提供的模板,那个么您需要重新检查模板和声明。确切地说,Wordpress遵循模板层次结构。这不会反映在get_page_template()的结果中。当我在文件
front page.php
中回显您的函数时,我得到了
page.php
。在两个不同的主题上测试。如果在带有自定义模板的页面上使用
get\u page\u template()
,它的输出是什么?例如,我现在正在进行一个安装,它有一个自定义的首页模板,
get\u page\u template()
输出正确的模板文件名。我敢打赌,如果你有一个front-page.php,并且这个函数仍然显示page.php,那么首页设置一定有问题。谢谢,这对首页确实有帮助。不幸的是,我会考虑所有病例边缘病例,这是很多。由于我正在编写一个插件,它应该适用于不同的主题,我不能只合并一些我需要的边缘案例。是的,你可能会拼凑一些东西,逐个检查是否存在可能的模板文件,考虑到子主题等。。。看起来它会很快变脆,你的卷曲可能是更实际的解决方案!谢谢你的建议!这个问题已经和我无关了,所以我没试过。
global $template;
echo basename($template); // front-page.php