WordPress + Timber w/自定义主题 + 路由 - 404 页面不呈现
WordPress + Timber w/ custom theme + routing - 404 page not rendering
我正在使用 Timber and Twig 创建自定义 WordPress 主题,但我很难让我的自定义 404 页面呈现。
最初,我网站上的每个页面都有一个在 functions.php
中定义的自定义路由,而我的 404 逻辑在 index.php
中。这可能不是实现此目的的最佳方法,但这是我可以使其正常工作的唯一方法——我在 Timber 文档中找不到太多关于创建具有自定义主题的 404 页面的信息。
index.php
:
<?php
$context = Timber::get_context();
$post = new TimberPost();
$context['page'] = $post;
global $wp;
$url = home_url($wp->request);
$context['url'] = preg_replace('#^https?://#', '', rtrim($url, '/'));
Timber::render('views/pages/404.twig', $context);
在我需要添加通配符路由之前,这一直很有效,这样客户就可以自己添加新页面,而无需要求我们添加新路由。我将此通配符路由添加到 functions.php
:
Routes::map('/:page', function($params) {
Routes::load('routes/page.php', $params, null, 200);
});
通配符路由按预期工作,但现在我上面的 404 逻辑不再工作。当我访问不是在 WordPress 管理员中创建的页面的 URL 时,它会将我发送到一个包含随机 post 内容的页面。我对如何让它正常工作有点迷茫,很可能我最初的 404 逻辑不是处理它的正确方法。任何建议都会很棒。
我尝试使用以下代码将 404.php
添加到主题文件夹:
<?php
$context = Timber::get_context();
Timber::render( array(
'views/pages/404.twig'
), $context );
不幸的是,这没有用——随机 URL 我的网站正在随机呈现 post 的内容,而不是 404.twig
文件。
由于您将所有 URL 路由到 'page.php',因此无法呈现“404.php”。首先检查 URL 是否存在并进行相应的路由。在您的 'functions.php' 中这样更改,这可能会解决您的 404 问题。
Routes::map('/:page', function ($params) {
$is_page_exists = get_page_by_path($params['page']);
if ($is_page_exists) {
Routes::load('routes/page.php', $params, null, 200);
} else {
Routes::load('404.php', $params, null, 404);
}
});
然后从您的 'index.php' 中删除 404 相关代码。
我不确定您为什么要添加此自定义路由,因为默认情况下它将由 WordPress / Timber 自动处理(页面 slug 本身)。如果你想要自定义 slug 前缀(比如 http://www.example.com/page/page slug),那么你需要有自定义路由,比如 Routes::map('page/:page', function ($params) { })
.
我正在使用 Timber and Twig 创建自定义 WordPress 主题,但我很难让我的自定义 404 页面呈现。
最初,我网站上的每个页面都有一个在 functions.php
中定义的自定义路由,而我的 404 逻辑在 index.php
中。这可能不是实现此目的的最佳方法,但这是我可以使其正常工作的唯一方法——我在 Timber 文档中找不到太多关于创建具有自定义主题的 404 页面的信息。
index.php
:
<?php
$context = Timber::get_context();
$post = new TimberPost();
$context['page'] = $post;
global $wp;
$url = home_url($wp->request);
$context['url'] = preg_replace('#^https?://#', '', rtrim($url, '/'));
Timber::render('views/pages/404.twig', $context);
在我需要添加通配符路由之前,这一直很有效,这样客户就可以自己添加新页面,而无需要求我们添加新路由。我将此通配符路由添加到 functions.php
:
Routes::map('/:page', function($params) {
Routes::load('routes/page.php', $params, null, 200);
});
通配符路由按预期工作,但现在我上面的 404 逻辑不再工作。当我访问不是在 WordPress 管理员中创建的页面的 URL 时,它会将我发送到一个包含随机 post 内容的页面。我对如何让它正常工作有点迷茫,很可能我最初的 404 逻辑不是处理它的正确方法。任何建议都会很棒。
我尝试使用以下代码将 404.php
添加到主题文件夹:
<?php
$context = Timber::get_context();
Timber::render( array(
'views/pages/404.twig'
), $context );
不幸的是,这没有用——随机 URL 我的网站正在随机呈现 post 的内容,而不是 404.twig
文件。
由于您将所有 URL 路由到 'page.php',因此无法呈现“404.php”。首先检查 URL 是否存在并进行相应的路由。在您的 'functions.php' 中这样更改,这可能会解决您的 404 问题。
Routes::map('/:page', function ($params) {
$is_page_exists = get_page_by_path($params['page']);
if ($is_page_exists) {
Routes::load('routes/page.php', $params, null, 200);
} else {
Routes::load('404.php', $params, null, 404);
}
});
然后从您的 'index.php' 中删除 404 相关代码。
我不确定您为什么要添加此自定义路由,因为默认情况下它将由 WordPress / Timber 自动处理(页面 slug 本身)。如果你想要自定义 slug 前缀(比如 http://www.example.com/page/page slug),那么你需要有自定义路由,比如 Routes::map('page/:page', function ($params) { })
.