Wordpress 没有 select 父页面的页面模板

Wordpress doesn't select page template for parent pages

我正在开发一个 WP 主题,但我遇到了这个让我抓狂的问题...

对于我创建的每个(父)页面,WP 选择 index.php 作为模板。我知道 WP 模板层次结构,但使用 page.phppage-$slug.phppage-$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模板文件。