Wordpress 没有 select 父页面的页面模板
Wordpress doesn't select page template for parent pages
我正在开发一个 WP 主题,但我遇到了这个让我抓狂的问题...
对于我创建的每个(父)页面,WP 选择 index.php
作为模板。我知道 WP 模板层次结构,但使用 page.php
、page-$slug.php
或 page-$id.php
并不重要,我也尝试过使用:
<?php
/*
Template Name: My Template
*/
?>
并在编辑器中将此模板分配给页面。
为了调试目的,我也挂钩了,template_include
如下:
add_filter( 'template_include', 'check_template_selection', 99 );
function check_template_selection( $template ) {
global $post;
echo "Post ID: " . $post->ID . "<br/>";
echo "Template File:" . $template . "<br/>";
echo is_page() ? "YES" : "NO";
return $template;
}
我检查的每一页 URL(例如:http://example.com/mypage
)我得到:
Post ID:
Template File:/nfs/c11/h05/mnt/205383/domains/example.com/html/wp-content/themes/mytheme/index.php
NO
我试过删除页面并重新创建它们,但还是一样。事实上它适用于子页面。例如:http://example.com/mypage/mychildpage
显示:
Post ID:589
Template File:/nfs/c11/h05/mnt/205383/domains/example.com/html/wp-content/themes/mytheme/page-mychildpage.php
YES
我正在使用 WP 4.4.2、ACF PRO 5.3.6.1、Custom Post Type UI 1.2.4 和 Instagram Feed Pro Personal 2.0.4.1。没有其他插件。无论如何,我试图将它们全部停用,但没有成功。我从头开始开发主题,之前做过几十个主题,但我以前从未遇到过这个问题...
这是我的 .htaccess
,我的永久链接正确配置为 /%postname%/
,没有类别基础。
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
所以,如果有任何关于我在这里缺少什么的建议或提示,我们将不胜感激。谢谢大家!
编辑:
经过数小时的深入搜索(非常感谢 John Blackbourn 提供的 Query Monitor 插件)我发现我的父页面匹配了错误的重写规则,所以现在我猜这是关于重写规则优先级的问题。
父页面匹配错误 URL: http://example.com/about
子页面的正确匹配 URL: http://example.com/about/about-child
几年后,但我 运行 遇到了几乎相同的问题。像你一样使用 Query Monitor 插件也帮助我弄明白了。
我今天早些时候所做的是创建一个名为 year
的自定义分类法。我的想法是按车辆制造年份对我的帖子(现在是我客户站点的车辆)进行分组。
但是,像您一样,当我转到任何顶级页面时,我被定向到 index.php
模板文件而不是 page.php
模板文件。
通过使用查询监视器插件,我发现我得到的结果与您完全相同。我匹配的查询是 year=about
.
我删除了我的自定义 year
分类法,然后通过 WordPress 管理员保存它们来刷新我的永久链接 Settings > Permalinks
瞧,我的顶级页面现在转到正确的 page.php
模板文件。
我正在开发一个 WP 主题,但我遇到了这个让我抓狂的问题...
对于我创建的每个(父)页面,WP 选择 index.php
作为模板。我知道 WP 模板层次结构,但使用 page.php
、page-$slug.php
或 page-$id.php
并不重要,我也尝试过使用:
<?php
/*
Template Name: My Template
*/
?>
并在编辑器中将此模板分配给页面。
为了调试目的,我也挂钩了,template_include
如下:
add_filter( 'template_include', 'check_template_selection', 99 );
function check_template_selection( $template ) {
global $post;
echo "Post ID: " . $post->ID . "<br/>";
echo "Template File:" . $template . "<br/>";
echo is_page() ? "YES" : "NO";
return $template;
}
我检查的每一页 URL(例如:http://example.com/mypage
)我得到:
Post ID:
Template File:/nfs/c11/h05/mnt/205383/domains/example.com/html/wp-content/themes/mytheme/index.php
NO
我试过删除页面并重新创建它们,但还是一样。事实上它适用于子页面。例如:http://example.com/mypage/mychildpage
显示:
Post ID:589
Template File:/nfs/c11/h05/mnt/205383/domains/example.com/html/wp-content/themes/mytheme/page-mychildpage.php
YES
我正在使用 WP 4.4.2、ACF PRO 5.3.6.1、Custom Post Type UI 1.2.4 和 Instagram Feed Pro Personal 2.0.4.1。没有其他插件。无论如何,我试图将它们全部停用,但没有成功。我从头开始开发主题,之前做过几十个主题,但我以前从未遇到过这个问题...
这是我的 .htaccess
,我的永久链接正确配置为 /%postname%/
,没有类别基础。
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
所以,如果有任何关于我在这里缺少什么的建议或提示,我们将不胜感激。谢谢大家!
编辑:
经过数小时的深入搜索(非常感谢 John Blackbourn 提供的 Query Monitor 插件)我发现我的父页面匹配了错误的重写规则,所以现在我猜这是关于重写规则优先级的问题。
父页面匹配错误 URL: http://example.com/about
子页面的正确匹配 URL: http://example.com/about/about-child
几年后,但我 运行 遇到了几乎相同的问题。像你一样使用 Query Monitor 插件也帮助我弄明白了。
我今天早些时候所做的是创建一个名为 year
的自定义分类法。我的想法是按车辆制造年份对我的帖子(现在是我客户站点的车辆)进行分组。
但是,像您一样,当我转到任何顶级页面时,我被定向到 index.php
模板文件而不是 page.php
模板文件。
通过使用查询监视器插件,我发现我得到的结果与您完全相同。我匹配的查询是 year=about
.
我删除了我的自定义 year
分类法,然后通过 WordPress 管理员保存它们来刷新我的永久链接 Settings > Permalinks
瞧,我的顶级页面现在转到正确的 page.php
模板文件。