我正在使用Timber和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逻辑不再起作用。当我访问的URL不是在WordPress管理员中创建的页面时,它会将我发送到其中包含随机帖子内容的页面。我对如何使其正常工作有些困惑,很可能我最初的404逻辑不是正确的处理方式。任何建议都很好。
我尝试使用以下代码将404.php
添加到主题文件夹:
<?php
$context = Timber::get_context();
Timber::render( array(
'views/pages/404.twig'
), $context );
不幸的是,这没有用-我的网站使用随机URL呈现了随机帖子的内容,而不是404.twig
文件。
答案 0 :(得分:4)
由于将所有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会自动处理此自定义路由( page slug 本身)。如果您希望使用自定义的条尾前缀(例如http://www.example.com/ page / page slug),则需要使用自定义的路由,例如Routes::map('page/:page', function ($params) { })
。