我正在使用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 );
不幸的是,这无法正常工作-我的网站使用随机网址呈现的是随机帖子的内容,而不是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前缀(例如http://www.example.com/page / page slug),则需要具有自定义的路由,例如Routes :: map(‘page /:page’,function($params){}).