【问题标题】:Finding out which Wordpress template is used for a page from admin page从管理页面找出哪个 Wordpress 模板用于页面
【发布时间】:2018-02-08 11:16:56
【问题描述】:

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

类似于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); ?>

显示:

默认

...对于主页上的 front-page.php 和另一个默认页面上的 page.php,这将是相同的,所以这对我没有帮助。

简而言之

当我编辑我的“主页”页面时,我想要得到的是front-page.php。或者custom-template.php,当我在选择自定义模板的情况下编辑某些页面时。或者about-page.php,当我正在编辑一个名为“关于”的页面时。如何获取正确的文件名或路径?

【问题讨论】:

  • 我通过在前端添加一个包含模板文件名的元标记并从后端使用 php 的get_meta_tags 来获取正确的文件名,找到了解决此问题的方法。虽然这可行,但我想知道是否有更优雅的解决方案。现在开始赏金。
  • 你是如何运行上面的代码尝试的?通过钩子?
  • 简而言之:使用 wp_head 钩子插入元标记。使用与this one 类似的函数,将正确的模板路径加载到元标记中。然后,使用 curl 或 get_meta_tags (都试过了,都有效),我从后端读取了那个元标记。它有效,但感觉像是一个肮脏的解决方案。
  • 一周后:感谢您的回复,尽管我没有找到更好的解决方案。当我在管理页面上时,我仍然无法获取加载的 REAL 模板文件,除非使用 curl 技巧在上面评论中描述的前端加载页面,我现在将继续使用.

标签: php wordpress templates admin


【解决方案1】:

如果您的具体问题与主页有关,您可以使用get_page_template() 的组合并将编辑页面的ID 与get_option('page_on_front') 进行比较(请参阅WordPress option reference)。还有一个选项,show_on_front,它指示首页是显示帖子还是静态页面。

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

【讨论】:

  • 谢谢,这确实有助于首页。不幸的是,我会考虑所有template hierarchy 案例边缘案例,这些案例很多。当我正在编写一个适用于不同主题的插件时,我不能只包含我需要的一些边缘案例。
  • 是的,你可能会拼凑一些东西,逐个检查可能的模板文件是否存在,考虑到子主题等......这似乎很快就会变得脆弱,你用 curl 破解可能是更实用的解决方案!
【解决方案2】:

使用get_page_template():

<?php echo realpath(get_page_template()); ?> 

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

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

【讨论】:

  • 这会返回页面模板集,而不是实际加载的模板。例如,在仪表板中,当我编辑主页时,它会返回 path/to/template/page.php,而实际上会加载 path/to/template/front-page.php,因为 Wordpress 会优先考虑它。
  • 该函数返回分配给当前页面的模板。时期。如果您获得“默认”或 page.php,那么您还没有在页面编辑屏幕中设置自定义模板......或者,它没有保存到数据库。 Wordpress 加载分配给页面的模板,如果没有,它会根据模板层次结构遵循自己的默认值。如果此函数没有为您提供您想要查看的内容,或者正在加载其他模板而不是此函数为您提供的模板,那么您需要重新检查您的模板和声明。
  • 没错,Wordpress 遵循模板层次结构。这没有反映在 get_page_template() 的结果中。当我在文件front-page.php 中回显您的函数时,我得到page.php。在两个不同的主题上进行了测试。
  • 如果您在带有自定义模板的页面上使用get_page_template(),它的输出是什么?例如,我现在正在安装一个自定义首页模板,get_page_template() 输出正确的模板文件名。我敢打赌,如果你有一个front-page.php,并且这个函数仍然显示page.php,那么首页设置有问题。
【解决方案3】:

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

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

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

【讨论】:

  • 感谢您的建议!问题与我无关,所以没有测试。
猜你喜欢
  • 1970-01-01
  • 2011-02-22
  • 2018-04-13
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
相关资源
最近更新 更多